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

Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;

Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache ,ConcurrentMapCache等;

但是Spring官方是没有提供Spring Cache tair的实现,需要自己去实现,当然要实现也比较简单,自己定义一个TairCache,实现Cache接口:

public class TairCache extends AbstractValueAdaptingCache implements Cache {private static final Logger log = LoggerFactory.getLogger(TairCache.class);private TairManager tairManager;private final String name;private int namespace;private int timeout;//是否允许null(默认true,高并发下防止缓存穿透)private boolean allowNullValues = true;public TairCache(String name, TairManager tairManager, int namespace) {this(name, tairManager, namespace, 0);}public TairCache(String name, TairManager tairManager, int namespace, int timeout) {this(name, tairManager, namespace,timeout, true);}public TairCache(String name, TairManager tairManager, int namespace, int timeout, boolean allowNullValues) {super(allowNullValues);this.name = name;this.tairManager = tairManager;this.namespace = namespace;this.timeout = timeout;}@Overridepublic String getName() {return this.name;}@Overridepublic Object getNativeCache() {return this.tairManager;}@Overridepublic ValueWrapper get(Object key) {final String tairKey = String.format("%s:%s", this.name, key);final Result<DataEntry> result = this.tairManager.get(this.namespace, tairKey);if (result.isSuccess() && (result.getRc() == ResultCode.SUCCESS)) {final Object value = result.getValue().getValue();return this.toValueWrapper(value);}return null;}@Overridepublic <T> T get(Object key, Class<T> type) {return (T) this.get(key).get();}@Overrideprotected Object lookup(Object o) {return null;}@Overridepublic <T> T get(Object o, Callable<T> callable) {return null;}@Overridepublic void put(Object key, Object value) {if (value == null) {value = this.isAllowNullValues() ? NullValue.INSTANCE : null;}if (value instanceof Serializable) {final String tairKey = String.format("%s:%s", this.name, key);final ResultCode resultCode = this.tairManager.put(this.namespace,tairKey,(Serializable) value,0,this.timeout);if (resultCode != ResultCode.SUCCESS) {TairCache.log.error(String.format("[CachePut]: unable to put %s => %s into tair due to: %s",key,value,resultCode.getMessage()));}} else {throw new RuntimeException(String.format("[CachePut]: value %s is not Serializable",value));}}public ValueWrapper putIfAbsent(Object key, Object value) {final ValueWrapper vw = this.get(key);if (vw.get() == null) {this.put(key, value);}return vw;}@Overridepublic void evict(Object key) {final String tairKey = String.format("%s:%s", this.name, key);final ResultCode resultCode = this.tairManager.delete(this.namespace, tairKey);if ((resultCode == ResultCode.SUCCESS)|| (resultCode == ResultCode.DATANOTEXSITS)|| (resultCode == ResultCode.DATAEXPIRED)) {return;}else {final String errMsg = String.format("[CacheDelete]: unable to evict key %s, resultCode: %s",key,resultCode);TairCache.log.error(errMsg);throw new RuntimeException(errMsg);}}public <T,E> List<T> mget(List<E> keys){List<String> tairKeys = keys.stream().map(k -> String.format("%s-%s", this.name, k)).collect(Collectors.toList());Result<List<DataEntry>> result = tairManager.mget(namespace, tairKeys);if (result.isSuccess() && (result.getRc() == ResultCode.SUCCESS) || result.getRc() == ResultCode.PARTSUCC) {return result.getValue().stream().map(dataEntry -> (T)dataEntry.getValue()).collect(Collectors.toList());}return new ArrayList<>();}@Overridepublic void clear() {//TODO fgz: implement here later}public void setTairManager(TairManager tairManager) {this.tairManager = tairManager;}public void setNamespace(int namespace) {this.namespace = namespace;}public void setTimeout(int timeout) {this.timeout = timeout;}
}

tair的属性配置:

@Configuration
public class TairConfig {@Bean(initMethod = "init", destroyMethod = "close")public TairManager mdbTairManager(@Value("${tair.configserver.master}") String masterConfigServer,@Value("${tair.configserver.slave}") String slaveConfigServer,@Value("${tair.groupName}") String groupName) {final DefaultTairManager tairManager = new DefaultTairManager();tairManager.setGroupName(groupName);tairManager.setConfigServerList(Arrays.asList(masterConfigServer,slaveConfigServer));return tairManager;}@Bean(initMethod = "init", destroyMethod = "close")public TairManager ldbTairManager(@Value("${tair.configserver.master}") String masterConfigServer,@Value("${tair.configserver.slave}") String slaveConfigServer,@Value("${tair.ldbGroupName}") String groupName) {final DefaultTairManager tairManager = new DefaultTairManager();tairManager.setGroupName(groupName);tairManager.setConfigServerList(Arrays.asList(masterConfigServer,slaveConfigServer));return tairManager;}
}

然后引入tair的配置TairCacheConfig,基本上就可以正常使用了。

@EnableCaching
@Configuration
public class TairCacheConfig {@Resourceprivate TairManager tairManager;@Value("${spring.tair.namespace}")private int namespace;@Bean@Qualifier("tairCacheManager")public CacheManager cacheManager() {final SimpleCacheManager simpleCacheManager = new SimpleCacheManager();final Cache cacheShort = new TairCache("tairShortTimeCache", this.tairManager, this.namespace, 60);final Cache cacheMiddle = new TairCache("tairMiddleTimeCache", this.tairManager, this.namespace, 60 * 5);final Cache cacheLong = new TairCache("tairLongTimeCache", this.tairManager, this.namespace, 60 * 60);simpleCacheManager.setCaches(Arrays.asList(cacheLong, cacheMiddle, cacheShort));return simpleCacheManager;}
}

注解正常使用:

@Cacheable(value = "user", key = "#userId")
public User findById(Long userId) {...
}

tair整合Spring Cache相关推荐

  1. springboot整合spring @Cache和Redis

    转载自  springboot整合spring @Cache和Redis spring基于注解的缓存 对于缓存声明,spring的缓存提供了一组java注解: @Cacheable:触发缓存写入. @ ...

  2. spring boot 整合 spring cache 简单使用

    spring boot 整合 spring cache 简单使用 spring cache简介 使用spring cache spring cache简介 Spring 3.1起,提供了基于注解的对C ...

  3. springboot整合spring Cache(redis)

    前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 阅读前推荐先阅读:redis缓存介 ...

  4. maven整合@data注解_springboot整合spring Cache(redis)

    前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 缓存抽象的核心是将缓存应用于Jav ...

  5. java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  6. 玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】

    每篇一句 人到中年就是一部西游记:悟空的压力,八戒的身材,沙僧的发型,唐僧的唠叨 前言 前面文章大篇幅详细讲解了Spring Cache缓存抽象.三大缓存注解的工作原理等等.若是细心的小伙伴会发现:讲 ...

  7. Spring Cache抽象-使用Java类注解的方式整合EhCache

    概述 工程结构 源码 概述 Spring Cache抽象-之缓存注解这篇博文中我们介绍了SpringCache抽象注解的使用方式 既然这是一个抽象,我们需要一个具体的缓存存储实现.比价流行的有:基于J ...

  8. redis,Spring Cache,Mango,ES

    目录 Redis Redis下载与安装 Redis常用命令 在Java中操作Redis Jedis Spring Data Redis Spring Cache Spring Cache介绍 Spri ...

  9. Echache整合Spring缓存实例讲解

    2019独角兽企业重金招聘Python工程师标准>>> 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCache 介绍 EhCache 是一 ...

最新文章

  1. 涉密计算机用户账号设置审批表,北京邮电大学涉密计算机配置审批表.PDF
  2. Spring Boot 全局异常处理
  3. linux下批量修改文件名精彩解答案例分享
  4. jspider java运行_Web Spider 网络蜘蛛爬虫
  5. java 分布式sql引擎_分布式SQL查询引擎 Presto 性能调优的五大技巧
  6. ruby + phantomjs 自动化测试 - GA
  7. leetcode 538. 把二叉搜索树转换为累加树 思考分析
  8. (自连接)SQL面试题-0608
  9. html使用最ie高版本,从html,css,javascript三方面谈谈“浏览器兼容性”的问题
  10. go语言如何调用java接口,[译] 如何在 Go 中使用接口
  11. Java串口通信详解(转)
  12. 非标自动化企业前十名_企业动态 | 瑞弗机电:全链条拓展“非标定制” 量身定制自动化生产线...
  13. 深度比较Map的遍历
  14. Windows平台调查网络程序的2个系统工具
  15. 30分钟学会正则表达式
  16. RealVIZ Stitcher Unlimited v5.5.1 1CD
  17. 基于巴法云平台的天猫精灵控制开关
  18. 在Android应用中集成YouTube视频播放功能
  19. 23.文件特殊权限之SUID权限、SGID权限、Sticky BIT权限和ACL权限
  20. Swift 3.1 更新了什么

热门文章

  1. 软件开发的43款可视化工具
  2. windows下安装miniconda详细教程
  3. Http/Https代理Python实现
  4. linux E325: 注意 发现交换文件 “*.swp“ 解决方法
  5. AR研究2-生成自己的识别图片
  6. c#创建word表格 将表格所有内容居中
  7. d3.js折线图_学习使用D3.js创建折线图
  8. jquery 入门(jquery是什么/与JavaScript的联系与区别/jquery版本/引包/入口函数)
  9. Android 插件化学习 加载apk并调用类的函数
  10. xadmin的一些自定义