RedisModule剖析 - RedisIMS

一、简介

RedisIMS 是一款支持了 If Modified Since(IMS) 模式的数据访问方案。If-Modified-Since 经常在 HTTP 访问过程被使用,通常是为了避免不断从服务器中拉取大量的重复的数据,以节省网络流量开销。将这种方式用作 Redis 中主要应该也是为了解决 大key 的问题,当前该模块仅支持 string 类型。

二、架构设计

2.1、相关命令

  • redisims.get : 如果数据在指定时间之后被修改了,则返回实际存储的值,否则直接返回空;
  • redisims.set : 更新特定 keyvalue 信息,然后更新对应的上次更新时间元信息;
  • 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 命令);
        • 缓存的时间更小(相等) : 返回空;
  • redisims.set 执行逻辑 :
    • 设置 用户key 的值;
    • 更新 元信息key 中对应 用户key 的时间信息(调用 HSET 命令);
  • redisims.exists 执行逻辑 :
    • 元信息key 中检索 用户key 的时间信息,返回存在或不存在(调用 HEXISTS 命令);

2.4、持久化

该模块未提供任何的数据持久化方式,当实例重启后数据会丢失。

三、思考

  • IMS 的这种方式从设计理念上来看能很大程度的减少不必要的网络资源开销,从使用姿势上也能看出来,在业务客户端还有一层缓存,而此时 Redis 的角色可以是一个后端缓存或者是一个数据库;
  • 考虑到 Redis 中其实不推荐使用 大Value ,因为对于 大Value 的操作有可能会影响业务的访问,集群场景下还会导致分片数据不均衡等情况,因此如果能够从源头上直接封解决掉 大Value,那么这种方式的意义可能就不十分明显了,小Value 的获取相比于直接返回空,这两者的差异极小;
Author: bugwz
Link: https://bugwz.com/2021/10/04/redismodule-redisims/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.