客户端设计,保证易用性:
标准Spring Data Redis
Spring Data Redis是对Jedis的一个封装,提供@cacheable缓存注解及RedisTemplate操作api
开发人员无需再管理jedis连接的生命周期
当然缺点是多了层封装,且spring Data Redis在往cache中存数据时用的始终是 multi命令,这样在代理层分片的架构下需要覆写源码方法,去除multi。
各业务模块缓存使用的隔离性设计,主要是出于服务化之后的场景。
比如将系统按业务垂直切分,服务化后有:商品模块,订单模块等服务模块
这时商品模块与订单模块的开发人员是不同的,如果不保证cache的隔离性,就有可能两个模块定义了相同的cache名称,但他们定义的cache失效是不同的。
这样就产生了一个难以发现的问题。解决这个问题可以引入一个group组概念。比如商品模块的group为itemCenter,这样当商品模块定义了cache区块名称为:
searchProduct时,底层spring Data Redis会创建一个cache名称为:itemCenter_searchProduct的区块。
引入group需要做两件事情,一个是在spring Data Redis创建区块cache时,将名称加上group前缀,这步是通过覆写RedisCacheManager的getCache(
Sting name)来实现。另一个是在生成具体存储内容的key时加上group前缀。
spring data redis在存储一个key,value时会做两件事情,一件是将key,value存入string结构中。另外再维护当前区块cache拥有的key元素,即将当前key加入到当前
区域cache中,这个结构键为 「区块名称~keys」。
业务上我们希望能够查看某个cache区块中元素个数,这样能够比较监控到代码是否存在问题,或者有没有预热到,防止性能问题。
查找某个cache区块中元素个数可以通过查找上述spring data redis维护的区块cache中元素来做。