Redis Spring 整合 demo

项目打算重构,用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

大侠们帮忙看下哈,多谢指出不妥之处

 


 

猜你喜欢

转载自gwoham-163-com.iteye.com/blog/2216772