网上流传的代码缓存失效存在严重问题。

思路....以后再细说

目前的方案还不够完美,失效力度控制不够细。

主要代码

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;import org.apache.commons.codec.digest.DigestUtils;
import org.apache.ibatis.cache.Cache;
import org.apache.log4j.Logger;import redis.clients.jedis.Jedis;/** 使用第三方缓存服务器,处理二级缓存* zuimao*/
public class RedisCache implements Cache {private static final Logger logger = Logger.getLogger(RedisCache.class);/** The ReadWriteLock. */private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();private final String COMMON_CACHE_KEY = "MYBATIS:";private static final String UTF_8 = "utf-8";/*** 按照一定规则标识key*/private String getKey(Object key) {StringBuilder accum = new StringBuilder();accum.append(COMMON_CACHE_KEY);accum.append(this.id).append(":");accum.append(DigestUtils.md5Hex(String.valueOf(key)));return accum.toString();}/*** redis key规则前缀*/private String getKeys() {return COMMON_CACHE_KEY + this.id + ":*";}private String id; public RedisCache() {}public RedisCache(final String id) {if (id == null) {throw new IllegalArgumentException("必须传入ID");}logger.debug("MybatisRedisCache:id=" + id);this.id = id;}@Overridepublic String getId() {return this.id;}@Overridepublic int getSize() {Jedis jedis = null;int result = 0;try {jedis = RedisStandAloneUtil.getJedisPool().getResource();Set<byte[]> keys = jedis.keys(getKeys().getBytes(UTF_8));if (null != keys && !keys.isEmpty()) {result = keys.size();}logger.debug(this.id+"---->>>>总缓存数:" + result);} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (jedis != null) {jedis.close();}}return result;}@Overridepublic void putObject(Object key, Object value) {Jedis jedis = null;try {jedis = RedisStandAloneUtil.getJedisPool().getResource();             byte[] keys = getKey(key).getBytes(UTF_8);jedis.set(keys, SerializeUtil.serialize(value));logger.debug("添加缓存--------"+this.id);//getSize();} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (jedis != null) {jedis.close();}}}@Overridepublic Object getObject(Object key) {Jedis jedis = null;Object value = null;try {jedis = RedisStandAloneUtil.getJedisPool().getResource();value = SerializeUtil.unserialize(jedis.get(getKey(key).getBytes(UTF_8)));logger.debug("从缓存中获取-----"+this.id);//getSize();} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (jedis != null) {jedis.close();}}return value;}@Overridepublic Object removeObject(Object key) {Jedis jedis = null;Object value = null;try {jedis = RedisStandAloneUtil.getJedisPool().getResource();value = jedis.del(getKey(key).getBytes(UTF_8));logger.debug("LRU算法从缓存中移除-----"+this.id);//getSize();} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (jedis != null) {jedis.close();}}return value;}@Overridepublic void clear() {Jedis jedis = null;try {jedis = RedisStandAloneUtil.getJedisPool().getResource();Set<byte[]> keys = jedis.keys(getKeys().getBytes(UTF_8));logger.debug("出现CUD操作,清空对应Mapper缓存======>"+keys.size());for (byte[] key : keys) {jedis.del(key);}//下面是网上流传的方法,极大的降低系统性能,没起到加入缓存应有的作用,这是不可取的。//jedis.flushDB();//jedis.flushAll();} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (jedis != null) {jedis.close();}}}@Overridepublic ReadWriteLock getReadWriteLock() {return readWriteLock;}}

  

转载于:https://www.cnblogs.com/tenghoo/p/mybatis_redis.html

真正的mybatis_redis二级缓存相关推荐

  1. Spring中启用Hibernate二级缓存步骤

    1.在applicationContext.xml配置文件中SessionFactory  bean中配置缓存 <!-- 配置会话工厂对象 --> <bean id="se ...

  2. Hibernate学习(九)———— 二级缓存和事务级别详讲

    序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...

  3. 京东一面:Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?我懵了。。...

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:cnblogs.com/semi-sub/p/13548479.html 前言 bean生命周期 三级缓存解决循环依赖 总结 ...

  4. JavaEE Tutorials (15) - 对Java持久化API应用使用二级缓存

    15.1二级缓存概述190 15.1.1控制实体是否可以缓存191 15.2指定缓存模式设置来提高性能192 15.2.1设置缓存获取和存储模式192 15.2.2通过编程方式控制二级缓存194 转载 ...

  5. 深入浅出 MyBatis 的一级、二级缓存机制

    一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...

  6. Mybatis之一级缓存,二级缓存

    一级缓存:Mybatis的一级缓存在session上,只要通过session查过的数据,都会放在session上,下一次再查询相同id的数据,都直接冲缓存中取出来,而不用到数据库里去取了. 二级缓存: ...

  7. hibernate开启二级缓存

    一.在hibernate.cfg.xml中加入: <!-- 开启二级缓存 --> <property name="hibernate.cache.use_query_cac ...

  8. hibernate之 一级缓存和二级缓存

    2019独角兽企业重金招聘Python工程师标准>>> 缓存 缓存的实现不仅需要作为物理介质的硬件,同时需要管理缓存的并发访问策略和过期策略的程序(软件).所以缓存通常是通过软件和硬 ...

  9. Mybatis集成二级缓存与同时使用缓存与事务存在的坑

    今天在看分布式事务的时候,突然收到app不能签到的消息,赶紧解决. 具体解决方法: 1.把执行错误的处理方法提取出来,作为测试方法 2.这个方法里面有两个插入语句,一条查询语句,一个更新语句,涉及到三 ...

最新文章

  1. Docker镜像基本使用
  2. 【Java 泛型】使用上下边界通配符解决泛型擦除问题
  3. LIBSVM -- A Library for Support Vector Machines--转
  4. mysql extract month_MySQL日期时间 Extract(选取)函数
  5. C语言程序main入口函数
  6. Volatile的陷阱
  7. idea(mac) 使用收集
  8. WinSCP断线,WinSCP总是断线,断线重连过程又需要卡很长时间解决办法
  9. mysql 健康检查_MySQL服务健康检查脚本
  10. 钟薛高雪糕最贵一支66元 创始人:成本40 你爱要不要
  11. 物理安全是指保护计算机,计算机网络 物理安全
  12. Windows xp 定时关机命令
  13. vue | 基于vue的城市选择器和搜索城市对应的小区
  14. Scrapy运行时出现的错误 :exception.ImportError No module named win32api
  15. React [Umi] history(API) 路由监听
  16. [转]微信小程序之加载更多(分页加载)实例 —— 微信小程序实战系列(2)...
  17. 机器学习——训练模型
  18. wps设置页码,从某一页重新开始编号
  19. Chevereto网站存放图像至相应二级分类文件夹
  20. 服务器域名解析问题,域名解析出现错误的几种情况,以及解决方法

热门文章

  1. [INS-20802] Oracle Net Configuration Assistant failed
  2. 2011年软件研发十大关键词盘点
  3. Google Go:初级读本
  4. Flutter的AnimatedDefaultTextStyle实现文本样式的动画过渡切换效果
  5. RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性)
  6. Web前端开发——BAT面试题汇总及答案01
  7. postgresql9.1_gaussdb200_解析表结构
  8. EasyUI---layout布局、树形组件、选项卡tabs
  9. MongoTemplate 使用aggregate聚合查询
  10. MONyog-数据库性能监控工具