tair整合Spring Cache
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相关推荐
- springboot整合spring @Cache和Redis
转载自 springboot整合spring @Cache和Redis spring基于注解的缓存 对于缓存声明,spring的缓存提供了一组java注解: @Cacheable:触发缓存写入. @ ...
- spring boot 整合 spring cache 简单使用
spring boot 整合 spring cache 简单使用 spring cache简介 使用spring cache spring cache简介 Spring 3.1起,提供了基于注解的对C ...
- springboot整合spring Cache(redis)
前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 阅读前推荐先阅读:redis缓存介 ...
- maven整合@data注解_springboot整合spring Cache(redis)
前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 缓存抽象的核心是将缓存应用于Jav ...
- java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
- 玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】
每篇一句 人到中年就是一部西游记:悟空的压力,八戒的身材,沙僧的发型,唐僧的唠叨 前言 前面文章大篇幅详细讲解了Spring Cache缓存抽象.三大缓存注解的工作原理等等.若是细心的小伙伴会发现:讲 ...
- Spring Cache抽象-使用Java类注解的方式整合EhCache
概述 工程结构 源码 概述 Spring Cache抽象-之缓存注解这篇博文中我们介绍了SpringCache抽象注解的使用方式 既然这是一个抽象,我们需要一个具体的缓存存储实现.比价流行的有:基于J ...
- redis,Spring Cache,Mango,ES
目录 Redis Redis下载与安装 Redis常用命令 在Java中操作Redis Jedis Spring Data Redis Spring Cache Spring Cache介绍 Spri ...
- Echache整合Spring缓存实例讲解
2019独角兽企业重金招聘Python工程师标准>>> 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCache 介绍 EhCache 是一 ...
最新文章
- 涉密计算机用户账号设置审批表,北京邮电大学涉密计算机配置审批表.PDF
- Spring Boot 全局异常处理
- linux下批量修改文件名精彩解答案例分享
- jspider java运行_Web Spider 网络蜘蛛爬虫
- java 分布式sql引擎_分布式SQL查询引擎 Presto 性能调优的五大技巧
- ruby + phantomjs 自动化测试 - GA
- leetcode 538. 把二叉搜索树转换为累加树 思考分析
- (自连接)SQL面试题-0608
- html使用最ie高版本,从html,css,javascript三方面谈谈“浏览器兼容性”的问题
- go语言如何调用java接口,[译] 如何在 Go 中使用接口
- Java串口通信详解(转)
- 非标自动化企业前十名_企业动态 | 瑞弗机电:全链条拓展“非标定制” 量身定制自动化生产线...
- 深度比较Map的遍历
- Windows平台调查网络程序的2个系统工具
- 30分钟学会正则表达式
- RealVIZ Stitcher Unlimited v5.5.1 1CD
- 基于巴法云平台的天猫精灵控制开关
- 在Android应用中集成YouTube视频播放功能
- 23.文件特殊权限之SUID权限、SGID权限、Sticky BIT权限和ACL权限
- Swift 3.1 更新了什么
热门文章
- 软件开发的43款可视化工具
- windows下安装miniconda详细教程
- Http/Https代理Python实现
- linux E325: 注意 发现交换文件 “*.swp“ 解决方法
- AR研究2-生成自己的识别图片
- c#创建word表格 将表格所有内容居中
- d3.js折线图_学习使用D3.js创建折线图
- jquery 入门(jquery是什么/与JavaScript的联系与区别/jquery版本/引包/入口函数)
- Android 插件化学习 加载apk并调用类的函数
- xadmin的一些自定义