mybatis整合redis重写 生成key的方法

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:    mybatis默认缓存是PerpetualCache,可以查看一下它的源码,发现其是Cache接口的实现;那么我们的缓存只要实现该接口即可。    该接口有以下方法需要实现:   String getId();   int getSize();   void putObject(Object key, Object value);   Object getObject(Ob
   mybatis默认 缓存是PerpetualCache,可以查看一下它的源码,发现其是 Cache接口的实现;那么我们的缓存只要实现该接口即可。
   该接口有以下方法需要实现:
  String getId();
  int getSize();
  void putObject(Object key, Object value);
  Object getObject(Object key);
  Object removeObject(Object key);
  void clear();
  ReadWriteLock getReadWriteLock();
  下面是 mybatis整合redis,做 数据查询的语句结果缓存,我们通过 mybatis redis整合实现代码和配置了解它们的技术实现:
1 实现类:
   MybatisRedisCache.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
     package app.platform.mybatis
 
     import java.util.concurrent.locks.ReadWriteLock; 
     import java.util.concurrent.locks.ReentrantReadWriteLock; 
       
     import org.apache.ibatis.cache.Cache; 
     import org.slf4j.Logger; 
     import org.slf4j.LoggerFactory; 
       
     import redis.clients.jedis.Jedis; 
     import redis.clients.jedis.JedisPool; 
     import redis.clients.jedis.JedisPoolConfig; 
       
/**
  * redis 整合mybatis Cache实现类
  *
  * <a href="http://www.zyiqibook.com">在一起 学习交流分享网 IT技术分享</a>
  */
     public class MybatisRedisCache implements Cache { 
           
         private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache. class ); 
         private Jedis redisClient=createReids(); 
          /** The ReadWriteLock. */   
         private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();  
           
         private String id; 
           
         public MybatisRedisCache( final String id) {   
             if (id == null ) { 
                 throw new IllegalArgumentException( "Cache instances require an ID" ); 
            
             logger.debug( ">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" +id); 
             this .id = id; 
         }   
         @Override 
         public String getId() { 
             return this .id; 
        
       
         @Override 
         public int getSize() { 
          
             return Integer.valueOf(redisClient.dbSize().toString()); 
        
       
         @Override 
         public void putObject(Object key, Object value) { 
             logger.debug( ">>>>>>>>>>>>>>>>>>>>>>>>putObject:" +key+ "=" +value); 
             redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value)); 
        
       
         @Override 
         public Object getObject(Object key) { 
             Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString()))); 
             logger.debug( ">>>>>>>>>>>>>>>>>>>>>>>>getObject:" +key+ "=" +value); 
             return value; 
        
       
         @Override 
         public Object removeObject(Object key) { 
             return redisClient.expire(SerializeUtil.serialize(key.toString()), 0 ); 
        
       
         @Override 
         public void clear() { 
               redisClient.flushDB(); 
        
         @Override 
         public ReadWriteLock getReadWriteLock() { 
             return readWriteLock; 
        
         protected  static Jedis createReids(){ 
             JedisPool pool = new JedisPool( new JedisPoolConfig(), "10.12.162.85" ); 
             return pool.getResource(); 
         }
    }

   SerializeUtil.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
  * redis 整合mybatis 序列化工具类
  *
  * <a href="http://www.zyiqibook.com">在一起 学习交流分享网 IT技术分享</a>
  */
     public class SerializeUtil { 
         public static byte [] serialize(Object object) { 
             ObjectOutputStream oos = null
             ByteArrayOutputStream baos = null
             try
             //序列化 
             baos = new ByteArrayOutputStream(); 
             oos = new ObjectOutputStream(baos); 
             oos.writeObject(object); 
             byte [] bytes = baos.toByteArray(); 
             return bytes; 
             } catch (Exception e) { 
              e.printStackTrace(); 
            
             return null
        
                
         public static Object unserialize( byte [] bytes) { 
             ByteArrayInputStream bais = null
             try
             //反序列化 
             bais = new ByteArrayInputStream(bytes); 
             ObjectInputStream ois = new ObjectInputStream(bais); 
             return ois.readObject(); 
             } catch (Exception e) { 
                
            
             return null
        
     }

2 spring中的mybatis配置
<!-- mybatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value=" classpath*:app/mapper/**/*. xml"/>
        <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml" />
</bean>
3 mybatis-config.xml 中的settings配制
<settings>
<!-- 开启缓存支持 --> 
<setting name="cacheEnabled" value="true" />
.......
</settings>
4 在需要加缓存的sqlMap中加入<cache eviction=" LRU" type="app.platform.mybatis.MybatisRedisCache" />
例:
<mapper namespace="SYS_ROLE">
  <!-- 缓存 -->
  <cache eviction=" LRU" type="app.platform.mybatis.MybatisRedisCache" />
   <!-- 查询所有 -->
<select id="findAll" parameterType=" HashMap" resultType="HashMap">
    select
       <include refid="base_column" />
    from SYS_ROLE
    where 1=1
    <if test="BUS_TYPE!=null and BUS_TYPE!=''">
       and BUS_TYPE  =#{BUS_TYPE}
    </if>
    <if test=" ENABLE!=null and ENABLE!=''">
       and ENABLE  =#{ENABLE}
    </if>
    <if test="ROLE_NAME!=null and ROLE_NAME!=''">
       and ROLE_NAME like '%'||#{ROLE_NAME}||'%'
    </if>
    <if test="ROLE_OTHER_NAME!=null and ROLE_OTHER_NAME!=''">
       and ROLE_OTHER_NAME like '%'||#{ROLE_OTHER_NAME}||'%'
    </if>
</select>
</mapper>
在项目中,我们可以检测到,首次查询是有语句打印,第二次则直接从redis缓存中获取。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
27天前
|
缓存 监控 NoSQL
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
171710 2
|
1月前
|
存储 缓存 NoSQL
【Redis】Redis魔法:揭秘Key的自动消失术——过期删除机制解析
【Redis】Redis魔法:揭秘Key的自动消失术——过期删除机制解析
126 0
|
1月前
|
存储 缓存 NoSQL
利用Redis List实现数据库分页快速查询的有效方法
利用Redis List实现数据库分页快速查询的有效方法
|
2月前
|
NoSQL Java Redis
面试01-Redis 如何从海量数据中查询出某一个 Key
面试01-Redis 如何从海量数据中查询出某一个 Key
95 0
|
3月前
|
设计模式 NoSQL Java
常用的设计模式以及操作Redis、MySQL数据库、各种MQ、数据类型转换的方法
常用的设计模式以及操作Redis、MySQL数据库、各种MQ、数据类型转换的方法
|
4月前
|
存储 NoSQL 测试技术
redis 大key
redis 大key
48 0
|
17天前
|
NoSQL Shell Redis
批量迁移redis实例的key
批量迁移redis实例的key
|
1月前
|
SQL 存储 Kubernetes
Seata常见问题之mybatisplus的批量插入方法报SQL错误如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
26 0
|
2月前
|
NoSQL Java Redis
Spring boot 实现监听 Redis key 失效事件
【2月更文挑战第2天】 Spring boot 实现监听 Redis key 失效事件
79 0