spring boot中spring cache 整合redis

来源:互联网 发布:经传多赢软件 编辑:程序博客网 时间:2024/06/14 01:12
配置 spring cache 和 redis 的整合    @Bean    public RedisCacheManager cacheManager(){        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate(redisConnectionFactory));        redisCacheManager.setDefaultExpiration(5l); // 设置默认的缓存过期时间(单位:秒)        Map<String, Long> expiresMap = new HashMap<String, Long>(); // 对某些命名空间单独设置过期时间        expiresMap.put("demo1", 5l);        expiresMap.put("demo2", 10l);        redisCacheManager.setExpires(expiresMap);        return redisCacheManager;    }启用 spring cache 注解    @EnableCaching使用:    实现类:@CacheConfig(cacheNames = "current service name")    方法上:@Cacheable注意:    1、注解一定要加在service层的实现类上,而不是controller,也不是service的interface上;    2、如果有标明@Cacheable注解的方法所在类有实现了某个接口,那么接口中一定要声明该方法,不然缓存不起作用。(原因:spring包装实现类,只有接口里的方法是可见的)。    3、如果标明@Cacheable注解的方法没所在类没有实现任何接口,只需要声明为public即可。注解:    ------------------demo-----class--------------------------    @Service    @CacheConfig(cacheNames = "paomotemp")    public class MainTestServiceImpl implements MainTestService{        @Autowired        private BankInfoService bankInfoService;        public List<BankInfo> demo1(String id, String name, Integer age){            List<BankInfo> bankInfos = bankInfoService.getBankInfos();            System.out.println(bankInfos);            return bankInfos;        }        public List<BankInfo> demo2(BankInfo bankInfo){            List<BankInfo> bankInfos = bankInfoService.getBankInfos();            System.out.println(bankInfos);            return bankInfos;        }        public String demo3(){            return "1";        }    }    ------------------demo-----class--------------------------    方法级别的注解        @Cacheable  :  用于标识方法需要缓存            value/cacheNames:表示方法缓存所属的命名空间(可用类注解@CacheConfig的cacheNames代替,进行统一管理)            key:缓存名,所在命名空间内需唯一(详细:http://blog.csdn.net/fireofjava/article/details/48913335)。                自动生成:                    demo1() :com.jiuhongpay.weixin_service.service.MainTestServiceImpl.demo1_4sd32                        末尾的 “4sd32” 分别代表id、name、age的传参                    demo2() :com.jiuhongpay.weixin_service.service.MainTestServiceImpl.printBankInfo_com.jiuhongpay.weixin_service.model.BankInfo@4238646b                自定义(表达式中表示某个字段一定要用“#”号开头,不然会报错。):                    @Cacheable(key = "#bankInfo.bankId + #bankInfo.cardNo")                    demo2() :43     //实体bankInfo中的 bankId = 4,cardNo = 3            condition:根据参数控制是否需要进行缓存,例如:                demo1()                    //id 为3 的不缓存                    @Cacheable(condition = "#id != '3'")    //id是string,所以匹配要有单引号                    //age 为3 的不缓存                    @Cacheable(condition = "#age != 3")     //age是int,匹配不需要单引号                        注:string 匹配值不加单引号则匹配不上,同理,Integer 匹配值加了单引号也匹配不上                demo2()                    //只有bankInfo.bankId 为4 并且 #bankInfo.cardNo 为'3'的进行缓存                    @Cacheable(condition = "#bankInfo.bankId == 4 and #bankInfo.cardNo == '3'")                        注:关系表达式可以用“and”、“or”、“&&”、“||”            unless:根据返回值控制是否需要进行缓存,例如:                demo3()                    //返回值为 "1"的不进行缓存                    @Cacheable(unless = "#result == '1'")                        注:#result 代表返回结果值        @CacheEvict :   用于标识删除某数据缓存            value/cacheNames:表示方法缓存所属的命名空间(必填)            key:缓存名(必填)            allEntries :为true时,表示全部删除。默认值为false。            例如:                demo1()                    //进行查询的方法,需缓存                    @Cacheable(key = "'bankinfo_' + #id")                demo3()                    //进行删除的方法,对demo1()结果的缓存进行删除                    @CacheEvict(value = "paomotemp", key = "'bankinfo_' + #id")        @CachePut   :   一般用于新增/修改方法,调用方法时会自动把相应的数据放入缓存,并每次都会请求db,用法等同于 @Cacheable ,但不会像 @Cacheable 一样,如果有缓存就直接读缓存。    类级别的注解        @CacheConfig    :   用于声明命名空间            cacheNames  :  一般一个实现类是一个命名空间,声明后,@Cacheable 、 @CachePut 中的 value 和 cacheNames 就可以被替代,不需要被声明                例如:demo class 中的 MainTestServiceImpl命名规则建议:    @CacheConfig        cacheNames  使用每个实现类所属的接口名称,例如:            @CacheConfig(cacheNames = "bankInfoService")    @Cacheable        value   如果使用默认的过期时间,那么不需要定义;                如果有自己特殊的自定义过期时间,则使用每个实现类所属的接口名称 + 下划线 + 时间(单位秒),例如:                    @Cacheable(value = "bankInfoService_10")                    注:如果使用自定义的过期时间,需要去 spring cache 和 redis 的整合类中配置过期时间map。        key     方法名 + 参数,例如:            @Cacheable(key = "'getById_' + #id")            public BankInfo getById(Integer id);
原创粉丝点击