Redis数据类型及使用场景
String(字符串)
Redis 最基础的数据结构,是简单的key-value 类型,key 为 String,value 可以是 String 或数字,其他结构都是在此基础上构建的。
使用场景:
缓存功能:可缓存费时且访问频繁的查询接口数据,减少数据库压力,提高响应速度。
计数器:如记录视频播放次数,每次访问视频时对相应的 key 的 value 值进行递增操作。
全局 ID :可生成唯一ID,保证在分布式系统等环境下ID 的唯一性。
共享 session:用于实现分布式 session,不同服务器节点可从Reids获取和更新用户session信息。
限速:通过限制单位时间内用户对接口的访问次数,或限制短信等付费接口的频率(比如通过短信验证码登录),防止恶意访问和资源滥用。
最大存储量:一个 String 类型的 value 最大可以存储 512M。
Hash(哈希)
是一个 String 类型的 field 和 value 之间的映射表,Redis 的 hash 数据类型 key 对应的 value 内部存储结构为一个 HashMap,适合存储对象。
使用场景:
用于存储用户信息、商品信息、订单信息等对象。可将对象的各个属性作为 field,属性值作为 value 存储,方便对对象的整体操作和部分属性的获取。
最大存储量:键值对个数最多为 2^32 - 1 个,即 4294967295 个。
List(列表)
基于双向链表实现,可以在列表两端进行插入(push)和弹出(pop)操作,还能获取指定范围的元素、指定索引下的元素,可充当栈和队列。
使用场景:
用户的 url 权限:可将用户拥有的所有 url 权限存于 Redis 的List 中,方便进行权限管理和验证。
缓存请求的数据支持高并发:对于高并发接口,先将数据缓存到 Redis 的 List 结构中,后续通过定时任务等进行异步处理和落库,提高系统的并发处理能力。
组合成其他数据结构:通过不同的操作组合可以实现栈、队列、有限集合、消息阻塞队列等数据结构。
最大存储量:元素个数最多为 2^32 - 1 个,即 4294967295 个。
Set (集合)
与列表类似,但不允许有重复元素,内部用 HashMap 实现,只用了 HashMap 的 key 列来存储对象,元素无序,不支持通过索引下标获取元素,支持集合内的增删改查及多个集合的交集、并集、差集操作,添加、删除、查找复杂度为 O (1),能判断成员是否在集合内。
使用场景:
tagging(标签):用于维护用户标签等,可方便地获取具有共同标签的用户,例如求用户共同爱好的标签。
random item(生成随机数):如抽奖场景,可通过 spop 或 srandmember 命令从集合中随机获取元素。
social Graph(社交需求):利用交集等操作实现社交关系中的共同好友等功能。
最大存储量:元素个数最多为 2^32 - 1 个,即 4294967295 个。
Zset (有序集合)
是 sorted set 的缩写,在 Set 基础上增加了权重参数 score,元素可按 score 有序排列,添加 / 修改元素时指定 score 后会自动重新排序。
使用场景:
适用于需要排序的场景,如各种排行榜,可按照时间、播放量、获赞数等不同的 score 值进行排序展示。
最大存储量:与 Sets 类型相似,元素个数最多为 2^32 - 1 个,即 4294967295 个。
Bitmap(位图)
是一种很节约内存的数据类型。
使用场景:
用于高效统计大量数据,如判断用户登录状态、统计用户某个月的签到次数和首次签到时间、统计两亿用户最近 7 天的签到情况及连续签到用户总数等。