栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring基于注解整合Redis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring基于注解整合Redis

前面SpringBoot+mybatis+redis项目示例中虽然实现了整合redis,但是太过繁琐对数据库操作的同时,都需要写相关的redis操作语句。

于是了解到SpringCache的注解,使用注解可以节省很多功夫

目录
  • 一、使用思路
  • 二、引入依赖
  • 三、配置文件
  • 四、配置类
  • 四、注解
    • 4.1 @EnableCaching
    • 4.2 @Cacheable
    • 4.3 @CachePut
    • 4.4 @CacheEvict

一、使用思路
  • 查询:将查询出来的数据写入到缓存中,后续查询直接访问缓存
  • 插入:新增数据时,同时将数据写入到缓存中
  • 更新:不对原有缓存进行更新,而是将缓存删除,等待后面查询数据时,将更新后的数据写入到缓存中
  • 删除:删除数据的同时,将数据从缓存中删除

从上面的情况,我们可能会想到一个问题:

单个数据通过查询写入缓存,更新时缓存被删除直到再一次查询时写入,可以保证缓存数据的正确性。
但是如果缓存存放的是一个集合的,不会因为单个数据的操作进行变化。

这个时候,我们可以通过设置缓存的失效时间来保证缓存的正确性,失效后缓存被删除,下一次会重新访问数据库然后重新写入到缓存中

二、引入依赖

   org.springframework.boot
    spring-boot-starter-redis
    1.3.8.RELEASE

三、配置文件
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    pool:
      max-active: 100
      max-idle: 10
      max-wait: 100000
    timeout: 0
四、配置类

这里主要为配置两个功能:

  1. 管理缓存的失效时间;
  2. key的自动生成
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {

    
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
        return new RedisCacheManager(
                RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
                this.getRedisCacheConfigurationWithTtl(30*60),//默认缓存失效策略,默认失效时间为30分钟
                this.getRedisCacheConfigurationMap()//指定策略
        );
    }

    
    private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(
                RedisSerializationContext
                        .SerializationPair
                        .fromSerializer(jackson2JsonRedisSerializer)
        ).entryTtl(Duration.ofSeconds(seconds));

        return redisCacheConfiguration;
    }

    
    private Map getRedisCacheConfigurationMap(){
        Map redisCacheConfigurationMap = new HashMap<>();
        //对查询所有数据的缓存失效时间设置为10秒
        redisCacheConfigurationMap.put("selectIndexList",this.getRedisCacheConfigurationWithTtl(10));
        return redisCacheConfigurationMap;
    }

    
    @Bean("myKeyGenerator")
    public KeyGenerator KeyGenerator(){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                System.out.println(Arrays.asList(params));
                List paramList = Arrays.asList(params).stream().map(p->{
                    return p.toString();
                }).collect(Collectors.toList());
                return target.getClass().getSimpleName()+ StringUtils.join(paramList,",");
            }
        };
    }
}
 
四、注解 
4.1 @EnableCaching 

启动缓存功能,配置类中需要加上这个注解,有了这个注解以后,spring才知道你需要使用缓存的功能,其他的和缓存相关的注解才会有效,spring中主要是通过aop实现的,通过aop来拦截需要使用缓存的方法,实现缓存的功能

4.2 @Cacheable

根据方法对其返回结果进行缓存(一般用在查询方法上),请求时如果缓存:

  • 存在,则直接读取缓存数据返回;
  • 不存在,则执行方法,并把返回的结果存入缓存中。

注解相关参数

参数解释示例
value缓存的名称,指定存放在哪块命名空间@Cacheable(value=“goods”)
cacheNames与Value都说用来指定缓存命名空间的,二选一即可@Cacheable(cacheNames=“goods”)
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则默认按照方法的所有参数进行组合@Cacheable(value=“goods”,key=“‘goods’+#id”)
KeyGenerator调用key自动生成策略@Cacheable(value=“goods”,KeyGenerator=“myKeyGenerator”)
4.3 @CachePut

能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会执行(一般用在新增方法上)
注解相关参数

参数解释示例
value缓存的名称,指定存放在哪块命名空间@Cacheable(value=“goods”)
cacheNames与Value都说用来指定缓存命名空间的,二选一即可@Cacheable(cacheNames=“goods”)
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则默认按照方法的所有参数进行组合@Cacheable(value=“goods”,key=“‘goods’+#id”)
KeyGenerator调用key自动生成策略@Cacheable(value=“goods”,KeyGenerator=“myKeyGenerator”)
4.4 @CacheEvict

能够根据一定的条件对缓存进行清空(一般用在更新或者删除方法上)
注解相关参数

参数解释示例
value缓存的名称,指定存放在哪块命名空间@Cacheable(value=“goods”)
cacheNames与Value都说用来指定缓存命名空间的,二选一即可@Cacheable(cacheNames=“goods”)
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则默认按照方法的所有参数进行组合@Cacheable(value=“goods”,key=“‘goods’+#id”)
KeyGenerator调用key自动生成策略@Cacheable(value=“goods”,KeyGenerator=“myKeyGenerator”)
allEntries是否清空所有缓存内容,默认为 false,如果指定为 true,则方法调用后将立即清空所有缓存@CachEvict(value=”goods”,allEntries=true)
beforeInvocation是否在方法执行前就清空,默认为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,默认情况下,如果方法执行抛出异常,则不会清空缓存@CachEvict(value=”goods”,beforeInvocation=true)
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号