真正的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)

大家都在看

  • WEB安全信息收集

    每次做测试都要去网上找信息太费劲这里放了常用的所有工具和网站,后期有更新在改。 子域名&敏感信息 通过大量的信息收集,对目标进行全方位了解,从薄弱点入手。 利用Google…

    Linux 2023年6月7日
    087
  • JS实现整个DIV里的字号整体放大或缩小

    JS实现对DIV里内容的字体方法或缩小 html代码 只写主要代码,样式可以自己写 <div class="content_sms"> &#x8FD…

    Linux 2023年6月7日
    088
  • 多线程核心基础

    1 进程和线程 ​ 进程是OS分配资源的最进本的单位,线程是执行调度的最基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己的独立空间)。J…

    Linux 2023年6月14日
    0111
  • Ansible Playbook概览

    Ansible playbook 执行需要三步路执行: 1.编写playbook 2.定义主机清单文件 3.设置运行环境,写入配置文件 1.编写playbook Playbook使…

    Linux 2023年6月6日
    081
  • QNAP container station安装 redis

    打开container station,即docker,安装Redis 选择最新的即可 命令处请务必在尾部添加语句: –requirepass “yourpasswor…

    Linux 2023年5月28日
    079
  • 真香警告!JitPack 开源库集成平台

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介 官方介绍: JitPack 是一个用于 JVM 和 Android 项目的新颖的包存储库。它按需构建 Git…

    Linux 2023年6月14日
    0120
  • Linux下如何彻底删除(卸载)MySQL?

    工具: CentOS 7 Mysql Xshell 首先连接操作系统,切换到root用户。 如果是使用yum安装的mysql,使用如下命令进行卸载(不能确定使用何种方式安装的mys…

    Linux 2023年6月8日
    097
  • Tmux 配置

    前面提到的窗口管理只是 tmux 功能的一小部分,另一个很有用的功能就是,连接到远程主机之后,一旦断开,那么当前账户登录的任务就被取消了,但是使用 tmux 可以在断开之后继续工作…

    Linux 2023年6月7日
    097
  • PyTorch 介绍 | TENSORS

    Tensor是一种特殊的数据结构,非常类似于数组和矩阵。在PyTorch中,我们使用tensor编码模型的输入和输出,以及模型的参数。 Tensor类似于Numpy的ndarray…

    Linux 2023年6月16日
    0168
  • Redis-cli连接

    原文:https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html 介绍使用同一VPC内弹性云服务器ECS上…

    Linux 2023年5月28日
    0113
  • 网络安全常见术语

    黑客帽子之分 白帽 白帽:亦称白帽黑客、白帽子黑客,是指那些专门研究或者从事网络、计算机技术防御的人,他们通常受雇于各大公司,是维护世界网络、计算机安全的主要力量。很多白帽还受雇于…

    Linux 2023年6月14日
    090
  • JVM学习 类加载子系统

    JVM 哔哩哔哩 尚硅谷视频 宋红康老师 Java代码执行流程 简图 详细图 1、类加载子系统 类加载器子系统的作用 类加载器子系统负责从文件系统或者网络中加载Class文件,cl…

    Linux 2023年6月7日
    0106
  • 世界上最流行的操作系统不是Windows?

    前言 打住,我知道列位是被标题骗进来的,但是这个论题并不是我瞎吹牛,世界上最流行的操作系统还真不是Windows。 提及操作系统,我们印象中比较深刻的无非就是Windows,Lin…

    Linux 2023年6月13日
    0116
  • [云计算]TCP云架构-思维导图

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/Skybiubiu/p/16276893.htmlAut…

    Linux 2023年6月13日
    088
  • 《拉钩课程 – 重学操作系统 – 计算机组成原理》

    1、芯片是怎么工作的呢?电能供给给芯片,芯片中的一种电子元件晶振(也就是石英晶体)通电后产生震荡,震荡会产生频率稳定的脉冲信号。通常这是一种高频的脉冲信号,每秒可达百万次。然后,我…

    Linux 2023年5月27日
    094
  • Red Hat Enterprise Linux (RHEL) 9 更新了什么,即 Rocky Linux 9 和 AlmaLinux 9 展望

    请访问原文链接:https://sysin.org/blog/rhel-9-vision/,查看最新版。原创作品,转载请保留出处。 作者:gc(at)sysin.org,主页:ww…

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