String(SDS)字符串
常用命令
- SET key value: 设置指定key的值
- SETNX key value: 只有在key不存在时设置key的值
- GET key: 获取指定key的值
- MSET key1 value1 key2 value2 ...: 设置一个或多个指定key的值
- MGET key1 key2 ...: 获取一个或多个指定key的值
- STRLEN key: 返回 key 所储存的字符串值的长度
- INCR key: 将key中储存的数字值加一
- DECR key: 将key中储存的数字值减一
- EXISTS key: 判断指定key是否存在
- DEL key: 删除指定的key
- EXPIRE key seconds: 给指定key设置过期时间
应用场景
需要存储常规数据的场景
- 举例 :缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)
- 相关命令 : SET、GET
需要计数的场景
- 举例 :用户单位时间的请求数(简单限流可以用到)、页面单位时间的访问数。
- 相关命令 :SET、GET、 INCR、DECR 。
分布式锁
利用 SETNX key value 命令可以实现一个最简易的分布式锁(存在一些缺陷,通常不建议这样实现分布式锁)
Hash(哈希表、压缩列表)散列
- 当hash字段较少时(默认少于512个),使用 ziplist(压缩列表)存储,可以减少内存占用
- 当hash字段较多时(默认超过512个),使用哈希表存储,可以快速定位每个字段
- 当新增字段导致超过ziplist的限制时,Redis会自动将数据结构更换为哈希表
常用命令
- HSET key field value: 设置指定哈希表中指定字段的值
- HSETNX key field value: 只有指定字段不存在时设置指定字段的值
- HMSET key field1 value1 field2 value2 ...: 同时将一个或多个field-value(域-值)对设置到指定哈希表中
- HGET key field: 获取指定哈希表中指定字段的值
- HMGET key field1 field2 ...: 获取指定哈希表中一个或者多个指定字段的值
- HGETALL key: 获取指定哈希表中所有的键值对
- HEXISTS key field: 查看指定哈希表中指定的字段是否存在
- HDEL key field1 field2 ...: 删除一个或多个哈希表字段
- HLEN key: 获取指定哈希表中字段的数量
- HINCRBY key field increment: 对指定哈希中的指定字段做运算操作(正数为加,负数为减)
应用场景
对象数据存储场景
- 举例 :用户信息、商品信息、文章信息、购物车信息
- 相关命令 :HSET(设置单个字段的值)、HMSET(设置多个字段的值)、HGET(获取单个字段的值)、HMGET(获取多个字段的值)
Set(哈希表、整数集合)集合
- 当集合元素较少时(默认少于512个),使用 intset(整数集合)存储,可以减少内存占用
- 当集合元素较多时(默认超过512个),使用 dict(字典)存储,可以快速判断一个元素是否在集合中
- 当新增元素导致超过intset的限制时,Redis会自动将数据结构更换为dict
常用命令
- SADD key member1 member2 ...: 向指定集合添加一个或多个元素
- SMEMBERS key: 获取指定集合中的所有元素
- SCARD key: 获取指定集合的元素数量
- SISMEMBER key member: 判断指定元素是否在指定集合中
- SINTER key1 key2 ...: 获取给定所有集合的交集
- SINTERSTORE destination key1 key2 ...: 将给定所有集合的交集存储在destination中
- SUNION key1 key2 ...: 获取给定所有集合的并集
- SUNIONSTORE destination key1 key2 ...: 将给定所有集合的并集存储在destination中
- SDIFF key1 key2 ...: 获取给定所有集合的差集
- SDIFFSTORE destination key1 key2 ...: 将给定所有集合的差集存储在destination中
- SPOP key count: 随机移除并获取指定集合中一个或多个元素
- SRANDMEMBER key count: 随机获取指定集合中指定数量的元素
应用场景
需要存放的数据不能重复的场景
- 举例:网站UV统计、文章点赞、动态点赞等场景
- 相关命令:SCARD(获取集合数量
需要获取多个数据源交集、并集和差集的场景
- 举例 :共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐(差集)、音乐推荐(差集)、订阅号推荐(差集+交集)等场景
- 相关命令:SINTER(交集)、SINTERSTORE(交集)、SUNION(并集)、SUNIONSTORE(并集)、SDIFF(差集)、SDIFFSTORE(差集)
- 集合类型比较典型的使用场景是标签(tag).例如一个用户可能对音乐感兴趣,另一个用户对新闻感兴趣,这些想去点就是标签.有了这些数据就可以获得喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验来说比较重要
需要随机获取数据源中的元素的场景
- 举例 :抽奖系统、随机。
- 相关命令:SPOP(随机获取集合中的元素并移除,适合不允许重复中奖的场景)、SRANDMEMBER(随机获取集合中的元素,适合允许重复中奖的场景)
List(双向链表、压缩列表)列表
- 当列表较小时(元素数量默认小于512),使用 ziplist(压缩列表)存储,节省内存空间
- 当列表较大时(元素数量默认大于512),使用 linkedlist(双向链表)存储,便于从两端快速插入和删除
- 当插入元素导致 ziplist超过限制时,Redis会自动将列表数据结构变更为linkedlist
常用命令
- RPUSH key value1 value2 ...: 在指定列表的尾部(右边)添加一个或多个元素
- LPUSH key value1 value2 ...: 在指定列表的头部(左边)添加一个或多个元素
- LSET key index value: 将指定列表索引index位置的值设置为value
- LPOP key: 移除并获取指定列表的第一个元素(最左边)
- RPOP key: 移除并获取指定列表的最后一个元素(最右边)
- LLEN key: 获取列表元素数量
- LRANGE key start end: 获取列表start和end之间的元素
应用场景
信息流展示
- 举例 :最新文章、最新动态
- 相关命令 : LPUSH、LRANGE
消息队列
Redis List 数据结构可以用来做消息队列,只是功能过于简单且存在很多缺陷,不建议这样做
SortedSet(跳表、压缩列表)有序集合
- 当元素较少时(默认少于128个),使用 ziplist(压缩列表)存储,可以减少内存占用
- 当元素较多时(默认超过128个),使用 zset(跳表)存储,可以快速完成排序、查询等操作
- 当新增元素导致 ziplist 超限时,Redis 会自动将数据结构变更为 zset
常用命令
- ZADD key score1 member1 score2 member2 ...: 向指定有序集合添加一个或多个元素
- ZCARD key: 获取指定有序集合的元素数量
- ZSCORE key member: 获取指定有序集合中指定元素的score值
- ZINTERSTORE destination numkeys key1 key2 ...: 将给定所有有序集合的交集存储在destination中,对相同元素对应的score值进行SUM聚合操作,numkeys为集合数量
- ZUNIONSTORE destination numkeys key1 key2 ...: 求并集,其它和 ZINTERSTORE 类似
- ZDIFF destination numkeys key1 key2 ...: 求差集,其它和ZINTERSTORE类似
- ZRANGE key start end: 获取指定有序集合start和end之间的元素(score从低到高)
- ZREVRANGE key start end: 获取指定有序集合start和end之间的元素(score从高到低)
- ZREVRANK key member: 获取指定有序集合中指定元素的排名(score从大到小排序)
应用场景
需要随机获取数据源中的元素根据某个权重进行排序的场景
- 举例 :各种排行榜比如直播间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等
- 相关命令 :ZRANGE (从小到大排序) 、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名)
需要存储的数据有优先级或者重要程度的场景
比如优先级任务队列。
- 举例 :优先级任务队列
- 相关命令 :ZRANGE (从小到大排序) 、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名)