美文网首页redis
redis数据结构和使用场景笔记

redis数据结构和使用场景笔记

作者: pq217 | 来源:发表于2022-03-04 16:21 被阅读0次

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刚好可以充当热度值

相关文章

网友评论

    本文标题:redis数据结构和使用场景笔记

    本文链接:https://www.haomeiwen.com/subject/wazxrrtx.html