项目打算重构,用Redis做缓存。自己写了个业务级封装,还请各路高手帮个忙给予指点。。。
首先这个demo数据库用的是Mysql,Mybatis做的持久化中间件。
测试的数据库表:
CREATE TABLE `tb_team` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, `user_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `user_id` (`user_id`), CONSTRAINT `tb_team_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, `add_date` datetime DEFAULT NULL, `team_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `team_id` (`team_id`), CONSTRAINT `tb_user_ibfk_1` FOREIGN KEY (`team_id`) REFERENCES `tb_team` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8;
缓存策略如下:
查询结果集缓存的是实体的缓存key,而不是整个结果集,在返回这些结果集数据时,通过这些实体key就能找到对应的hashmap,而这些hashmap就是每个实体对应的缓存数据。
按照这个策略,不适合对频繁改动的数据做缓存,因为每次的修改操作都会修改缓存。需要自行判别哪些数据访问比较频繁且不经常修改。还有的是,这里没有考虑到集群缓存的情况,紧适合单机。
整体思路:对应关系型数据库中的实体表,为需要提供缓存访问的实体表数据提供一个CommonMapper的接口,包含一组常用的数据操作方法,这组操作将会被进行缓存功能封装。
提供一个CacheService<T, D extends CommonMapper<T>>接口,对应commonMapper,提供相应的数据操作方法以及一些缓存相关的方法。有CacheServiceImpl 抽象类实现CacheService,具体在里面进行缓存数据操作的封装。该类需要被继承,由具体的子类提供其相应的实体数据的缓存存储方式(不同实体具有不一样的属性,影响到缓存数据的存储和提取)
- save,新增实体的缓存以及数据库记录,同时清除跟这个实体表相关的查询缓存。
- update, 更新实体的缓存以及数据库记录,同时清除跟这个实体表相关的查询缓存。
- delete,删除实体缓存以及数据库记录,同时清除跟这个实体表相关的查询缓存。
- deleteByIds 与delete类同。
- get,首先尝试从缓存获取,若获取不了再从数据库获取,若有,则缓存这个实体,若没有则返回null。
- selectListCacheByParam,需要用到RedisCacheSearchBuilder来操作查询参数,目的是用这些查询参数结合指定的一个业务关键字生成一个key,用于缓存查询到的实体缓存key列表,这些key对应一个缓存list,list里面存储这查询结果实体的缓存key。(参考缓存策略)
- 其他的查询如连接查询需要自己实现,但原理与selectListCacheByParam参不多,只是做缓存时对应不同的实体要操作不同的结果集实体key列表(详情看看demo里的)。
demo的结构如下(有些丑,不太会UML):
项目可以clone下来:
这是oschina的git库,github又特么访问不了
https://git.oschina.net/oham/testredis.git
大侠们帮忙看下哈,多谢指出不妥之处