RedisIMS
是一款支持了 If Modified Since(IMS)
模式的数据访问方案。If-Modified-Since
经常在 HTTP
访问过程被使用,通常是为了避免不断从服务器中拉取大量的重复的数据,以节省网络流量开销。将这种方式用作 Redis
中主要应该也是为了解决 大key
的问题,当前该模块仅支持 string
类型。
一、简介
- GitHub 地址:https://github.com/Clement-Jean/RedisIMS
二、架构设计
2.1、相关命令
- redisims.get : 如果数据在指定时间之后被修改了,则返回实际存储的值,否则直接返回空;
- redisims.set : 更新特定
key
的value
信息,然后更新对应的上次更新时间元信息; - redisims.exists : 从元信息中查找对应的
key
是否有上次更新的时间记录;
2.2、存储模型
该模块引入了一个元信息的 key
来存储操作 用户key
的上次的操作时间,特殊 key 的格式设计为:
- 数据名称 :
MTIME
; - 数据类型 :
hash
; - 数据成员 :
field
: 实际操作的用户key
;value
: 记录的用户上次传入的操作时间 ;
2.3、执行逻辑
redisims.get
执行逻辑 :- 从特殊key
MTIME
中检索对应用户key
的上次更新时间信息(调用HGET
命令);- 无上次更新时间,直接返回
用户key
的实际值信息(调用GET
命令); - 有上次更新时间,则需要将
Redis
中记录的上次更新时间与用户传入的上次更新时间做对比:- 缓存的时间更大 : 返回
用户key
的真实值(调用GET
命令); - 缓存的时间更小(相等) : 返回空;
- 缓存的时间更大 : 返回
- 无上次更新时间,直接返回
- 从特殊key
redisims.set
执行逻辑 :- 设置
用户key
的值; - 更新
元信息key
中对应用户key
的时间信息(调用HSET
命令);
- 设置
redisims.exists
执行逻辑 :- 在
元信息key
中检索用户key
的时间信息,返回存在或不存在(调用HEXISTS
命令);
- 在
2.4、持久化
该模块未提供任何的数据持久化方式,当实例重启后数据会丢失。
三、思考
IMS
的这种方式从设计理念上来看能很大程度的减少不必要的网络资源开销,从使用姿势上也能看出来,在业务客户端还有一层缓存,而此时Redis
的角色可以是一个后端缓存或者是一个数据库;- 考虑到 Redis 中其实不推荐使用
大Value
,因为对于大Value
的操作有可能会影响业务的访问,集群场景下还会导致分片数据不均衡等情况,因此如果能够从源头上直接封解决掉大Value
,那么这种方式的意义可能就不十分明显了,小Value
的获取相比于直接返回空,这两者的差异极小;