www.whkt.net > myBAtis整合rEDis缓存

myBAtis整合rEDis缓存

通常为了减轻数据库的压力,我们会引入缓存.在Dao查询数据库之前,先去缓存中找是否有要找的数据,如果有则用缓存中的数据即可,就不用查询数据库了.如果没有才去数据库中查找.这样就能分担一下数据库的压力.另外,为了让缓存中的数据与数据库同步,我们应该在该数据发生变化的地方加入更新缓存的逻辑代码.这样无形之中增加了工作量,同时也是一种对原有代码的入侵.这对于有着代码洁癖的程序员来说,无疑是一种伤害. MyBatis框架早就考虑到了这些问题,因此MyBatis提供了自定义的二级缓存概念,方便引入我们自己的缓存机制,而不用更改原有的业务逻辑.

对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的NoSQL数据库,就非常适合担任实时数据的容器.但是往往我们又有数据可靠性的需求,采用MySQL作为数据存储,不会因为内存问题而引起数据丢失,同时也可以利用关系数据库的特性实现很多功能.

redis是类似key_value形式的快速缓存服务.类型较丰富,可以保存对象、列表等,支持的操作也很丰富,属于内存数据库,且可以把内存中的数据及时或定时的写入到磁盘.可设置过期自动删除,速度快,易于使用.

总配置文件中,二级缓存也是开启的,不需要设置mapper级别的cache需要开启,在对应的mapper.xml写入

数据查询时每次都需要从数据库查询数据,数据库压力很大,查询速度慢,因此设置缓存层,查询数据时先从redis中查询,如果查询不到,则到数据库中查询 然后将数据库中查询的数据放到redis中一份,下次查询时就能直接从redis中查到,不需要查询数据库了!

1、mybatis的二级缓存的范围是命名空间(namespace) 2、只要这个命名空间下有一个 insert、update、delete mybatis 就会把这个命名空间下的二级缓清空. 3、如果同一个sql在不同的命名空间下,就会出现脏数据,因为一个insert、update、deleted 了另一个可能还使用者缓存数据,这样就会出现数据的不一致性. 4、如果更新、删除、插入的频率比较高的话,就会删除所有缓存在添加所有缓存在删除,这样缓存的命中率很低或者说根本就起不到缓存作用而且会消耗资源. 所以在没解决这个问题的前提下,还是不提倡使用二级缓存.

在此基础上,redis支持各种不同方式的排序与memcached一样,为了保证效率,数据都是缓存在内存中区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

redis做缓存的时候需要自己写缓存逻辑, 把缓存逻辑贴出来看看

方法一:直接用MysqlMysql有缓存,实现了类似的功能,如果需要缓存的东西很多,可以把缓存的内存设置大一点.这样的好处就是不用去控制缓存的失效,确保数据一致性.方法二:启用用DAO框架的缓存比如Mybatis、Hibernate都是可以直接开启二级缓存,一般是用ehcache作为实现,只要配置一下就行,无需额外操作.方法三:自行实现用AOP去在Dao层做一个切面,把调用的“类名+方法名+参数”作为key,查询结果作为value,每次调用去看一下是否已经缓存,如果没有再去调用Dao的实现类.注:如果真的要自行去实现,不建议做一个这么通用的方案,感觉重复造轮子.对性能要求极高的场景,可以根据实际需要做一些必要的缓存即可.

redisTemplate可以设置index的地方.setIndex或selectIndex,不太记得.redis连接可有类似原生命令 select x 找找.

网站地图

All rights reserved Powered by www.whkt.net

copyright ©right 2010-2021。
www.whkt.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com