Redis实现mybatis、shiro-RBAC和shiro-session的分布式缓存管理

一、redis&mybatis

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

myBatis的缓存机制就是将【namespace/或者是dao名】作为key存储,然后将一个PerpetualCache作为一个value,而PerpetualCache是一个map集合,其key是【包含有namespace/或者dao名、以及sql语句】的一个长字符串,其value是sql语句查询结果。

当发生增删改操作,myBatis会刷新缓存,这样查询的时候是新的数据;而查询的时候优先从缓存获取数据,这样查询速度快,对硬盘压力也小。

我们可以【自定义Cache】,使之将缓存数据放到redis上,而非本地即可。

1.1 自定义缓存组件

Cache有很多,这里使用的是如下包下的Cache类

org.apache.ibatis.cache.Cache
根据业务场景,要在增加阶段设置有效期,与session不同,不会被刷新,而是到期即销毁
public class MyBatisCache implements Cache {
   
	//id是mybatis创建此缓存组件的实例时,会传入的namespace
    private String id;
    //注意是final
    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    public MyBatisCache() {
   
    }

    public MyBatisCache(String id) {
   
        this.id = id;
    }

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

    @Override
    public void putObject(Object key, Object value) {
   
    /**
    * 该缓存组件不在工厂内,故不能注解方式获取,只能通过【ContextLoader】
    * ContextLoader是在tomcat启动时就创建,然后再启动sqlSessionFactory
    * 再扫描mapper后就会触发cache缓存,也就是说该类与工厂启动时刻一致
    * 但是调用该方法的时候,工厂还未启动完全,所以会报错,因此只能用于局部变量,越靠后越好
    */
        RedisTemplate<String,Object> template = (RedisTemplate<String, Object>) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
        //将查询结果放入redis,缓存备用
        //template.opsForValue().set(key.toString(), value);
        //设置有效期一小时,意味着一小时后会销毁,这样保证数据安全,同时随时更新数据
		template.opsForValue().set(key.toString(), value, 1, TimeUnit.HOURS);
    }

    @Override
    public Object getObject(Object key) {
   
        RedisTemplate<String,Object> template = (RedisTemplate<String, Object>) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
        Object cache = template.opsForValue().get(key.toString());
        if (cache != null) {
   
            return cache;
        } else {
   
            return null;
        }
    }
	
	//删除某一个缓存数据,一个namespace下有很多的key,不能一一删除,这里最好是用clear清空
    @Override
    public Object removeObject(Object key) {
   
        return null;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值