真正的mybatis_redis二级缓存

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

思路….以后再细说

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

主要代码

java;gutter:true; 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;</p> <p>import org.apache.commons.codec.digest.DigestUtils; import org.apache.ibatis.cache.Cache; import org.apache.log4j.Logger;</p> <p>import redis.clients.jedis.Jedis;</p> <p>/<em> * 使用第三方缓存服务器,处理二级缓存 * zuimao </em>/ public class RedisCache implements Cache {</p> <pre><code>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; } @Override public String getId() { return this.id; } @Override public int getSize() { Jedis jedis = null; int result = 0; try { jedis = RedisStandAloneUtil.getJedisPool().getResource(); Set 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; } @Override public 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(); } } } @Override public 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; } @Override public 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; } @Override public void clear() { Jedis jedis = null; try { jedis = RedisStandAloneUtil.getJedisPool().getResource(); Set 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(); } } } @Override public ReadWriteLock getReadWriteLock() { return readWriteLock; } </code></pre> <p>}

Original: https://www.cnblogs.com/tenghoo/p/mybatis_redis.html
Author: 青羽
Title: 真正的mybatis_redis二级缓存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529184/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis在C#中的使用及Redis的封装

    Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。Redis的键值可以包括…

    Linux 2023年5月28日
    080
  • Question04-查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

    * SELECT stu.SID, stu.Sname, IFNULL(CAST(AVG(sc.score) AS DECIMAL(18,2)), 0) 平均成绩 FROM Stu…

    Linux 2023年6月7日
    0117
  • CentOS8 AnolisOS8 yum安装 No match for argument: htop Error: Unable to find a match: htop

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 CentOS8 AnolisOS8 yum安装失败 今天有人反馈服务器卡,登录上服务器,想看下CPU以及内存使用情况,觉得top…

    Linux 2023年5月27日
    064
  • Linux快速入门(七)效率工具(Vim)

    Vim编辑器 所有的 Linux系统都会内建一个 Vi文本编辑器,而 Vim是从 Vi发展出来的一个高度可配置的文本编辑器,旨在高效的创建和更改任何类型的文本,它还可以根据文件的扩…

    Linux 2023年6月6日
    095
  • [ Shell ] 用 while + case 实现 GetOptions 效果

    https://www.cnblogs.com/yeungchie/ 可以用 getopt,但我还是喜欢自己写这个过程,便于我控制更多细节。 下面要实现的效果是,从命令行参数中分析…

    Linux 2023年6月7日
    091
  • git-config 配置多用户环境以及 includeIf用法

    方法一: 直接在 $path文件中添加 &#x7528;&#x6237;&#x540D;和 &#x90AE;&#x7BB1;,如: [use…

    Linux 2023年5月27日
    0121
  • Power Outage

    由于Covid-19的原因一直是work from home, 在几天前家里的电表有问题需要人来维修,在这期间会停电大概半小时操作,虽然是wfh,但是还是要保障工作的正常进行,保守…

    Linux 2023年6月7日
    0104
  • MacOS 使用 siri 控制QQ音乐

    最近发现,macos 可以使用 hi siri 来进行呼出siri了,但是尝试使用QQ音乐播放音乐时,总是不能很好地播放音乐,只能调用本地的音乐app; 考虑我是最新的M1 Pro…

    Linux 2023年6月14日
    0265
  • .Net中Aspose组件调试技巧

    | 0.48分钟 | 774.4字符 | 1、引言&背景 2、水印或截断问题解决 3、即时调试的技巧 4、声明与参考资料 | SCscHero | 2022/6/4 PM2…

    Linux 2023年6月13日
    073
  • AIX系统NTP同步配置

    前言 当AIX系统的本地时间与时间服务器授出的标准时间误差大于±1000秒时。xntpd服务将无法同步时间并变得无法正常工作,请进行ntp配置前,先修改AIX系统的本地时间,尽量和…

    Linux 2023年6月6日
    096
  • 附025.kubeadm部署Kubernetes更新证书

    一 查看证书 提示:由上可知,根证书有效期为10年,其他所有证书有效期为1年。 二 证书类别 由此集群根证书签发的证书有: 提示:kubelet的/var/lib/kubelet/…

    Linux 2023年6月13日
    0117
  • Ubuntu 18.04 LTS的网络经常变成问号导致网速很慢的解决办法

    问题描述: Ubuntu系统Gnome桌面顶部栏的网络图标经常变成了一个问号。期间不能打开网页,在终端里面ping公网有时能通但丢包严重,或者根本就不通,错误提示 Temporar…

    Linux 2023年5月27日
    0106
  • 【Example】C++ Vector 内存预分配的良好习惯

    为什么要对 Vector 进行内存预分配? 1,Vector 本身是一个内存只会增长不会减小的容器。 2,Vector 存在 size 和 capacity 两种计数,size 即…

    Linux 2023年6月13日
    086
  • Java基础系列–09_集合2

    昨天介绍了集合的主要架构体系,今天主要的目的是学习集合的迭代器的遍历和List的特有功能。 迭代器:概述: 由于多种集合的数据结构不同,所以存储方式不同,取出方式也不同。但是他们都…

    Linux 2023年6月7日
    067
  • Celery异步任务

    情景: 用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等…

    Linux 2023年6月8日
    081
  • Sharding-jdbc + Seata + Nacos整合

    前置条件 先了解Sharding-jdbc、Seata、Nacos这三样东西各自的作用以及单独使用时的配置。 如果已经做过Seata + Nacos的整合的,直接看最后的 Seat…

    Linux 2023年6月7日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球