Spring Boot之集成Cache、Redis等缓存

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Spring Boot之集成Cache、Redis等缓存,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Spring Cache

Spring从3.1开始定义了org.springframework.cache.Cacheorg.springframework.cache.CacheManager接口来统一不同的缓存技术。并支持使用JCache(JSR-107)注解简化开发。

Cache接口为缓存的组件规范定义,包含缓存的各种操作集合。例如Cache接口下Spring 提供了各种xxxCache 的实现; 如RedisCache , EhCacheCache ,ConcurrentMapCache等

每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。

Spring Boot集成Cache缓存

引入依赖

	<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-cache</artifactId>
		</dependency>

创建ehcache.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
	updateCheck="false">
	<diskStore path="java.io.tmpdir/Tmp_EhCache" />

	<!-- 默认配置 -->
	<defaultCache maxElementsInMemory="5000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120"
		memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />

	<cache name="baseCache" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="100000"
		   overflowToDisk="true" diskSpoolBufferSizeMB="50" 
		   maxEntriesLocalDisk="6" diskPersistent="false" 
		   diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" clearOnFlush="true"/>
</ehcache>

配置信息

	<!--
	name:缓存名称
	maxElementsInMemory:缓存最大个数
	eternal:对象是否永久有效,一但设置了,timeout将不起作用
	timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大
	timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大
	overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中
	diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
	maxElementsOnDisk:硬盘最大缓存个数
	diskPersistent:是否缓存在虚拟机重启后数据任然存在,默认false
	diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
	memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)
	clearOnFlush:内存数量最大时是否清除
	-->

开启缓存

SpringBoot的启动类添加: @EnableCaching注解开启缓存功能

使用缓存

@CacheConfig(cacheNames = "baseCache")
public interface UserMapper {
	@Cacheable
	@Select(" select * from user where id = #{id} ")
	public User selectUser(@Param("id") long id);
}

清除缓存

@Autowired
private CacheManager cacheManager;

cacheManager.getCache("baseCache").clear();

Spring Boot集成Redis

1.添加依赖

<!-- 配置使用redis启动器 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置redis连接信息

  # Redis
  redis:
    port: 6379  # Redis服务器连接端口
    host: 127.0.0.1 # Redis服务器地址
    timeout: 3000 # 连接超时时间(毫秒)
    password: 123456  # Redis服务器连接密码(默认为空)
    database: 5 # Redis数据库索引(默认为0)
    # jedis连接池
#    jedis:
#      pool:
#        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
#        max-idle: 8 # 连接池中的最大空闲连接
#        min-idle: 0 # 连接池中的最小空闲连接
#        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
    # lettuce连接池 ,推荐使用
    lettuce:
      pool:
        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
        max-idle: 8 # 连接池中的最大空闲连接
        min-idle: 0 # 连接池中的最小空闲连接
        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)

3.执行测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application .class)
public class RedisTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 保存
     *
     * @param key
     * @param value
     */
    public void setStr(String key, String value) {
        setStr(key, value, null);
    }

    /**
     * 保存同时设置过期时间
     *
     * @param key
     * @param value
     * @param time
     */
    public void setStr(String key, String value, Long time) {
        stringRedisTemplate.opsForValue().set(key, value);
        if (time != null) {
            stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
        }
    }

    /**
     * 获取
     *
     * @param key
     * @return
     */
    public String getKey(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除
     *
     * @param key
     */
    public void delKey(String key) {
        stringRedisTemplate.delete(key);
    }

    @Test
    public void test() {
        this.setStr("test", "hello");
        System.out.println(this.getKey("test"));
        System.out.println("----------------");

        this.setStr("test", "hello", 5L);
        System.out.println(this.getKey("test"));
        System.out.println("----------------");

        this.delKey("test");
        System.out.println(this.getKey("test"));
    }
}

4.自定义序列化类

redisTemplate序列化默认使用的jdkSerializeable, 存储二进制字节码, Redis客户端工具使用时,看到的是二进制,不便于阅读,所以自定义序列化类。

@Configuration
public class RedisTemplateConfiguration {


    /**
     * 自定义序列化类
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 设置key和value的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137012.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!