redis包含五种数据结构:String,Hash,List,Set,Zset
String
存储字符串,最常用的一种,这个不做多解释了
常用命令
SET key value // 存入键值对
GET key // 通过建获取值
EXPIRE key seconds // 设置某个键过期时间
DEL key... // 删除一个或多个key
SETNX key value // 存入键值对,如果键已存在,返回0代表失败,否则返回1代表成功,适合做分布式锁
INCR key //原子加1
DECR key //原子减1
INCRBY key n //原子加n
DECRBY key n //原子减n
使用场景
- 普通存储
set
+get
即可,也可以通过json存储对象 - 分布式锁
SETNX lock_name true // 多个请求同时执行该命令只有一个返回1,代表拿到锁
DEL lock_name // 使用完释放锁 -
计数器
INCR article-122-reads // 给文章122增加一个阅读量
阅读量
Hash
可以理解为存储一个HashMap结构的value,而redis本身就相当于一个map,这个可以理解为map下的map
常用命令
HSET key field value // 代表key下面存储的是一个hash,这句话的意思是给hash的field字段存储value
HGET key field // 获取key下field字段的value
HSETNX key field value // 存入某key下的键(字段)值对,如果字段已存在,返回0代表失败,否则返回1代表成功
HINCRBY key field n // 原子加n
HLEN key // 获取某key下的字段数
HGETALL key // 获取某key下的所有键值
使用场景
hash很像一个string的分组,比如说有很多键值对组成一个组整体数据,可以通过hash来建立这个组
- 存储对象
很适合存储一个对象,比如HSET user1 name 李狗剩
+HSET user1 age 18
,就存储了一个年龄18叫李狗剩的用户对象,也可以批量设置HMSET user1 name 李狗剩 age 18
效果一样 - 分布式锁
HSETNX
对标String的SETNX
,可以通过HSETNX
把一些同一事件的多个锁放在一起 -
计数器
还是上面那张图
文章阅读情况
上面只记录了阅读量,如果又需要点赞数,评论数等,可以放在同一个key下方便管理
以文章id为key,以计数项目(阅读/点赞/评论)作为field,已数作为value
文章浏览详情
List
这个好理解,就是存储一个列表,可以再左侧或右侧添加,也可以从左侧和右侧取出,所以可以当队列和栈使用
常用命令
LPUSH key value... // 从key列表左侧添加一个或多个元素
RPUSH key value... // 从key列表右侧添加一个或多个元素
LPOP key // 移除并返回key列表的左侧元素
RPOP key // 移除并返回key列表的右侧元素
LRANGE key start stop // 返回列表key中指定区间内的元素,区间以偏移量start和stop指定
BLPOP key... timeout // 从key列表左侧弹出第一个元素,若列表为空,阻塞等待timeout秒(timeout=0则一直等待)
BRPOP key... timeout // 从key列表右侧弹出第一个元素,若列表为空,阻塞等待timeout秒(timeout=0则一直等待)
使用场景
- 栈
LPUSH + LPOP就是Stack(栈) - 队列
LPUSH + RPOP就是Queue(队列),应用场景比如信息列表
LPUSH + BRPOP就是Blocking MQ(阻塞队列),可以做消息中间件使用
Set
不重复的集合
常用命令
SADD key value... // 往集合key中存入元素
SREM key value... // 从集合key中删除元素
SMEMBERS key // 获取集合key中所有元素
SCARD key // 获取集合key的元素个数
SISMEMBER key value // 判断value元素是否存在于集合key中
SRANDMEMBER key [count] // 从集合key中选出count个元素
SPOP key [count] // 从集合key中选出count个元素并删除
SINTER key... // 交集运算
SINTERSTORE destination key... // 将交集结果存入新集合destination中
SUNION key... // 并集运算
SDIFF key... // 差集运算
使用场景
- 抽奖
SRANDMEMBER key [count] 或 SPOP key [count],可以做抽奖功能,前者中奖之后还有机会中别的奖,后者中奖后不能再参与抽奖 - 类似抖音的朋友
SINTER key...,抖音中如果我关注的人也关注了我,那么我俩就是朋友关系,所以要获取我的朋友列表,只需把“我关注的人”,和“关注我的人”取交集就是我的朋友列表了 - 可能认识人
SDIFF key...,抖音中有个可能认识人的功能,比如张三同时关注了李四和王五,李四和王五关注的人取并集得到一个集合,用这个集合与张三关注的人取差集就很有可能是张三认识的人 - 朋友圈的点赞
SINTER key...,比如张三发了个朋友圈,点赞的人是一个合集,李四看这个朋友圈也能看到点赞的人,但只能看到自己关注了并点赞的人,取法就是张三这条动态点赞的人与李四好友的交集
Zset
对set的扩展,有序集合,集合每个元素都有一个分数值
常用命令
ZADD key [score value]... // 往有序集合key中加入带分值score的元素
ZREM key value… // 从有序集合key中删除元素
ZSCORE key value // 返回有序集合key中元素value的分值
ZINCRBY key n value // 为有序集合key中元素value的分值加上n
ZCARD key // 返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES] // 正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES] // 倒序获取有序集合key从start下标到stop下标的元素
ZUNIONSTORE destkey numkeys key... // 并集计算
ZINTERSTORE destkey numkeys key... // 交集计算
使用场景
- 排行榜
既然是有序合集,最常见就是排行榜,比如微博的热搜,score刚好可以充当热度值
网友评论