spring boot 整合jetcache 实现注解式缓存

举报
小米粒-biubiubiu 发表于 2020/11/30 23:24:49 2020/11/30
【摘要】 一、添加jetcache 依赖 <dependency> <groupId>com.alicp.jetcache</groupId> <artifactId>jetcache-starter-redis-lettuce</artifactId> <version>${jetcache.version}</version> </dependency> <dependen...

一、添加jetcache 依赖


  
  1. <dependency>
  2. <groupId>com.alicp.jetcachegroupId>
  3. <artifactId>jetcache-starter-redis-lettuceartifactId>
  4. <version>${jetcache.version}version>
  5. dependency>
  6. <dependency>
  7. <groupId>com.alicp.jetcachegroupId>
  8. <artifactId>jetcache-starter-redisartifactId>
  9. <version>${jetcache.version}version>
  10. dependency>

二、添加配置项


  
  1. jetcache:
  2. statIntervalMinutes: 15
  3. areaInCacheName: false
  4. local:
  5. default:
  6. type: linkedhashmap
  7. keyConvertor: fastjson
  8. remote:
  9. default:
  10. keyConvertor: fastjson
  11. valueEncoder: kryo
  12. valueDecoder: kryo
  13. # redis
  14. # type: redis
  15. # host: 10.2.140.31
  16. # port: 32263
  17. # password: 123456
  18. # database: 7
  19. # lettuce
  20. type: redis.lettuce
  21. uri: redis://123456@10.2.140.31:32263/7?timeout=5s
  22. poolConfig:
  23. minIdle: 5
  24. maxIdle: 20
  25. maxTotal: 50
属性 默认值 说明
jetcache.statIntervalMinutes 0 统计间隔,0表示不统计
jetcache.areaInCacheName true jetcache-anno把cacheName作为远程缓存key前缀,2.4.3以前的版本总是把areaName加在cacheName中,因此areaName也出现在key前缀中。2.4.4以后可以配置,为了保持远程key兼容默认值为true,但是新项目的话false更合理些。
jetcache.hiddenPackages @Cached和@CreateCache自动生成name的时候,为了不让name太长,hiddenPackages指定的包名前缀被截掉
jetcache.[local|remote].${area}.type 缓存类型。tair、redis为当前支持的远程缓存;linkedhashmap、caffeine为当前支持的本地缓存类型
jetcache.[local|remote].${area}.keyConvertor key转换器的全局配置,当前只有一个已经实现的keyConvertor:fastjson。仅当使用@CreateCache且缓存类型为LOCAL时可以指定为none,此时通过equals方法来识别key。方法缓存必须指定keyConvertor
jetcache.[local|remote].${area}.valueEncoder java 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
jetcache.[local|remote].${area}.valueDecoder java 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
jetcache.[local|remote].${area}.limit 100 每个缓存实例的最大元素的全局配置,仅local类型的缓存需要指定。注意是每个缓存实例的限制,而不是全部,比如这里指定100,然后用@CreateCache创建了两个缓存实例(并且注解上没有设置localLimit属性),那么每个缓存实例的限制都是100
jetcache.[local|remote].${area}.expireAfterWriteInMillis 无穷大 以毫秒为单位指定超时时间的全局配置(以前为defaultExpireInMillis)
jetcache.local.${area}.expireAfterAccessInMillis 0 需要jetcache2.2以上,以毫秒为单位,指定多长时间没有访问,就让缓存失效,当前只有本地缓存支持。0表示不使用这个功能。

上表中${area}对应@Cached和@CreateCache的area属性。注意如果注解上没有指定area,默认值是"default"。

关于缓存的超时时间,有多个地方指定,澄清说明一下:

  1. put等方法上指定了超时时间,则以此时间为准
  2. put等方法上未指定超时时间,使用Cache实例的默认超时时间
  3. Cache实例的默认超时时间,通过在@CreateCache和@Cached上的expire属性指定,如果没有指定,使用yml中定义的全局配置,例如@Cached(cacheType=local)使用jetcache.local.default.expireAfterWriteInMillis,如果仍未指定则是无穷大

 三、启用注解缓存


  
  1. @EnableMethodCache(basePackages = "com.hikvision.smbg.content")
  2. @EnableCreateCacheAnnotation
  3. @Configuration
  4. public class JetCacheConfig {
  5. }

四、缓存常量类


  
  1. public class CacheConst {
  2. public static class ContentDetail {
  3. public static final String redisKeyPrefix = "content:detail:";
  4. public static final int expire = 60 * 60 * 24;
  5. }
  6. public static class Content {
  7. public static final int sign = 0;
  8. public static final String redisKeyPrefix = "content:user:like:";
  9. }
  10. public static class Comment {
  11. public static final int sign = 1;
  12. public static final String redisKeyPrefix = "comment:user:like:";
  13. }
  14. public static class CommentReply {
  15. public static final int sign = 2;
  16. public static final String redisKeyPrefix = "commentReply:user:like:";
  17. }
  18. public static class CommentLike {
  19. public static final String redisKeyPrefix = "comment:like:";
  20. public static final int expire = 60;
  21. }
  22. public static class ContentView {
  23. public static final String redisKeyPrefix = "content:view:";
  24. public static final int expire = 60;
  25. }
  26. public static class ContentLike {
  27. public static final String redisKeyPrefix = "content:like:";
  28. public static final int expire = 60;
  29. }
  30. public static class ContentFavourite {
  31. public static final String redisKeyPrefix = "content:favourite:";
  32. public static final int expire = 60;
  33. }
  34. }

五、注解缓存使用

(1)一般在获取详情列表等大的不经常变动的数据接口上面 使用 @Cached 注解进行缓存的创建,把数据缓存到redis中,指定key,过期时间等。


  
  1. @Cached(name = CacheConst.ContentDetail.redisKeyPrefix, key = "#response.contentId",
  2. expire = CacheConst.ContentDetail.expire, timeUnit = TimeUnit.DAYS)
  3. @Override
  4. public ContentBaseResponse assembleDetail(ContentBaseResponse response) {
  5. // 获取兴趣标签
  6. List<Long> labelIds = this.listLabelIdsByContentId(response.getContentId());
  7. response.setLabelIds(labelIds);
  8. // 获取案例轮播图
  9. List picUrls = this.listPicUrlsByContentIdAndPicType(response.getContentId(), PicTypeEnum.MAIN.getCode());
  10. response.setPicUrls(picUrls);
  11. // 获取产品清单
  12. List goods = this.listGoodsByContentId(response.getContentId());
  13. response.setGoods(goods);
  14. // 获取附件列表
  15. List attachs = this.listAttachByContentId(response.getContentId());
  16. response.setAttachs(attachs);
  17. // 获取评论
  18. // List comments = this.listCommentByContentId(response.getContentId());
  19. // response.setComments(comments);
  20. return response;
  21. }

 四、当对要查询的大数据详情,列表进行的更新操作的时候,添加@CacheInvalidate 注解,使其 删除(销毁),这样在查询的时候就会重新把最新的数据缓存到redis中,

这样就保证的数据库的最终一致性


  
  1. @CacheInvalidate(name = CacheConst.ContentDetail.redisKeyPrefix, key = "#contentId")
  2. @Transactional(rollbackFor = Exception.class)
  3. @Override
  4. public void update(CaseUpdateRequest request, Long contentId) {
  5. // 获取客户案例
  6. CaseDO dataobject = getDataobjectByContentId(contentId);
  7. // 客户案例权限校验
  8. if (ContentFromEnum.MERCHANT.getCode().equals(dataobject.getCaseFrom())) {
  9. String creator = dataobject.getCreator();
  10. String modifier = request.getModifier();
  11. if (!StringUtils.equals(creator, modifier)) {
  12. throw new ContentCenterException(100002, "平台或商家【" + modifier + "】没有权限编辑客户案例【" + contentId + "】");
  13. }
  14. }
  15. ....
  16. ....
  17. }

 

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/110390056

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。