MyBatis-Redis-Cache 实现缓存

MyBatis-Redis-Cache:

           Mybatsi默认缓存对象 PerpetualCache,是本地缓存 。

将缓存数据存入redis操作过程:

定义缓存组件:

package com.vince.MyBatisCache;

import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.context.ContextLoader;

import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class MyMyBatisCache implements Cache {

    private String id;  // 当前mapper的 namespace
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    RedisTemplate template;
    public MyMyBatisCache(){}  //无参构造

    public MyMyBatisCache(String id){  // mybatis 创建缓存组件实例时传入
        System.out.println("缓存id:"+id);
        this.id=id;
    }



    @Override
    public String getId() {
        return this.id;
    }

    //  缓存数据
    @Override
    public void putObject(Object key, Object value) {

        template.opsForValue().set(key.toString(), value);// 将查询结果存入 redis 缓存后备用

    }
    //  检查缓存
    @Override
    public Object getObject(Object key) {
        // 获取redis组件
         template =(RedisTemplate) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
        System.out.println("检查缓存  key:"+key.getClass());
        Object cache = template.opsForValue().get(key.toString()); // 通过sql语句检查是否有缓存可用
        if (cache!=null){
            System.out.println("命中缓存~");
            return cache;
        }else{
            System.out.println("检查缓存 但是没有缓存数据~");
            return null;
        }
    }

    //删除某一个缓存数据
    @Override
    public Object removeObject(Object key) {
        template = (RedisTemplate) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
        template.delete(key.toString() );
        return null;
    }


    // 当一个mapper中触发了一个写操作之后 清空所有缓存数据
    @Override
    public void clear() {
        System.out.println("nameSpace:"+this.getId()+"发生了写操作,清空了所有缓存数据~");
         template = (RedisTemplate) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
        // 获取当前mapper下的所有缓存  key
        Set keys = template.keys("*" + this.getId() + "*");
        // 删除 keys
        template.delete(keys);

    }

    @Override
    public int getSize() {
        return 0;
    }

    @Override
    public ReadWriteLock getReadWriteLock() {
        return  this.lock;
    }
}

使用自定义的缓存组件:






     // 使用自定义缓存组件

    
    

Redis 配置文件:



    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    


    
    
        
        
        
        
        
    

    
    
    
    

    
    

在Spring 工厂中导入 redis 配置文件:


 

 

你可能感兴趣的:(MyBatis-Redis-Cache 实现缓存)