Redis常用数据结构及应用场景的吐血整理

1. String数据类型:

字符串常用操作:

  • SET key value 存入键值对, SET覆写旧值,无视类型
  • MSET key value [key value ...] 批量存储字符串键值对
  • SETNX key value 存入一个不存在的键值对,若key存在,不做任何操作
  • GET key 根据key获取key对应的value值
  • MGET key [key ...] 批量获取字符串键值对
  • DEL key 删除对应key的键值对
  • EXPIRE key seconds 给给定key值设置有效时间

原子加减

  • INCR key 给key值对应的数字加1
  • DECR key 给key存储的数值减1
  • INCRBY key increment 给key存储的数组加上increment
  • DECRBY key increment 给key存储的数组减去increment

应用场景:

  • 单值缓存:SET key value,GET key

  • 对象缓存:
    SET user:1 value(json字符串)
    存:MSET user:1:name zhangsan user:1:age 10
    取:MGET user:1:name user:1:age
    比json格式好,方便单属性操作,性能更好一点,最优选择HASH

  • 分布式锁:
    SETNX product:10001 true // 发返回1表示加锁成功,有弊端不要使用
    SETNX product:10001 true // 发返回0表示加锁失败
    DEL product:10001 // 释放锁
    SET product:10001 true ex 10 nx // 防止程序意外终止导致死锁

  • 计数器
    微信公众号阅读量使用场景
    阅读量统计在Redis中的使用:

    • INCR article:readcount:{文章Id} 文章的阅读量统计
    • GET article:readcount:{文章Id}
  • 分布式系统唯一id生成
    INCRBY orderId 1000 redis生成序列号,提升性能。


2.HASH结构

常用操作

  • HSET key field value // 存储一个哈希表key的键值
  • HSETNX key field value // 存储一个不存在的hash表的key的键值
  • HMSET key field value [field value ...] 在一个哈希表key中存储多个键值对
  • HGET key field 获取一个哈希表中field的键值
  • HMGET key field [field ...] 获取哈希表key中多个field的键值
  • HDEL key field [field ...] 删除哈希表key中field键值
  • HLEN key 哈希表key中field的数量
  • HGETALL key 返回哈希表key中所有键值对
  • HINCRBY key field increment 为哈希表key中field字段的值加上增量 increment

应用场景

  • 对象存储
    HSET user:10001 name zhangsan age 10 // 设置对象属性
    HGET user:10001 name age // 获取属性信息

  • 电商购物车场景
    购物车场景
    电商购物车数据结构:

    • 以用户ID为key
    • 商品ID为field
    • 商品数量为value

    购物车操作:

    • 添加商品-> HSET cart:1001 10088 1
    • 增加数量->HINCRBY cart:1001 10088 1
    • 商品总数->HLEN cart:1001
    • 删除商品 HDEL cart:1001 10088
    • 获取购物车所有商品->HGETALL cart:1001

3.List数据结构

List结构示意图

常用命令

  • LPUSH key value [value ...] 将一个或者多个值value插入到key列表的表头(最左边)
  • RPUSH key value [value ...] 将一个或者多个值value插入到key列表的表头(最右边)
  • LPOP key 移除并返回key列表的头元素
  • RPOP key 移除并返回key的尾元素
  • LRANGE key start stop 返回key中指定区间的元素,区间偏移量由start和stop指定
  • BLPOP key [key ...] timeout从key表头弹出一个元素,若该key没有元素则堵塞等待,堵塞timeout,若timeout为0表示一直堵塞
  • BRPOP key [key ...] timeout从key表尾弹出一个元素,若该key没有元素则阻塞等待,堵塞timeout,若timeout为0表示一直堵塞

应用场景

  • 常用数据结构

    • Stack(栈)=LPUSH+LPOP->FILO 先进后出
    • Queue(队列)= LPUSH+RPOP->FIFO 先进先出
    • Blocking MQ(堵塞队列)= LPUSH+BRPOP

  • 微博和微信公众号消息流

微博微信消息流示意图
示例中关注微信公众号备胎说车和Mac Talk在Redis中的使用:

  • Mac Talk 发布消息ID为10018-> LPUSH msg:{订阅人Id} 10018
  • 备胎说车发布消息ID为10019->LPUSH msg:{订阅人Id} 10019
  • 查看最新订阅的消息,比如6条->LRANGE msg:{订阅人Id} 0 5

4.SET结构

常用命令

  • SADD key member [member ...] 将一个或者多个member放入key中,元素存在则忽略
  • SREM key member [member ...] 移除集合key中的一个或者多个member
  • SMEMBERS key 返回集合key中所有元素
  • SCARD key 集合key中元素个数
  • SISMEMBER key member 判定member是否为key中的元素
  • SRANDMEMBER key [count] 从key中随机取出count个元素,元素不从key中删除
  • SPOP key [count] 从key中随机取出count个元素,元素从key中删除
  • SINTER key [key ...]交集运算
  • SINTERSTORE destination key [key ...] 将交集结果存在新集合destination中
  • SUNION key [key ...] 并集运算
  • SUNIONSTORE destination key [key ...] 将并集结果存在新集合destination中
    -SDIFF key [key ...] 差集运算,

应用场景

  • 抽奖模型
    抽奖模型
    示例中参与抽奖在Redis中的使用:
    • 点击参与抽奖加入集合-> SADD key {userId}
    • 查看抽奖参与的所有用户->SMEMBERS key
    • 抽取count名中奖者->SRANDMEMBER key [count]/SPOP key [count]

  • 微博微信点赞、关注、收藏等

点赞关注收藏模型
示例中点赞模型在Redis中的使用:

  • 点赞->SADD like:{消息id} {用户id}

  • 取消点赞->SREM like:{消息id} {用户id}

  • 检查用户是否点赞->SISMEMBER like:{消息id} {用户id}

  • 获取点赞的用户列表->SMEMBERS like:{消息id}

  • 获取点赞用户数->SCARD like:{消息id}

  • 微信微博关注模型:
    微信关注模型
    示例微信关注模型在Redis中的使用:

    • 张三关注的人->zhangsanSET->{lisi,sima,luban}
    • 李四关注的人->lisiSET->{zhangsan,sima,luban,qiaofeng}
    • 王五关注的人->wangwuSET->{zhangsan,lisi,luban,qiaofeng,duanyu}
    • 张三和李四共同关注的人->SINTER zhangdanSET lisiSET
    • 张三关注的人也关注了李四->zhangsanSET列表每个成员关注列表去判定SISMEMBER simaSET lisiSISMEMBER lubanSET lisi
    • 张三可能认识的人->SDIFF lisiSET zhangsanSET
  • 集合操作电商平台商品筛选:
    商品筛选
    商品筛选条件在redis中的使用:

    • SADD brand:HUAWEI p30
    • SADD brand:xiaomi mi-6X
    • SADD brand:IPhone iphone8
    • SADD os:android p30 mi-6X
    • SADD cpu:brand:intel p30 mi-6X
    • SADD ram:8G p30 mi-6X iphone8
    • SINTER os:android cpu:brand:intel ram:8G->{p30 mi-6X}

SortedSet数据结构

常用命令

  • ZADD key score member [[score member] [score member] ...] 向有序结合key添加带分值的元素
  • ZREM key member [member ...] 从有序集合中删除key
  • ZSCORE key member 返回有序key中member成员的 score值
  • ZINCRBY key increment member 为有序集合key中member元素分值加上increment
  • ZCARD key 返回有序结合的key的元素个数
  • ZRANGE key start stop [WITHSCORES] 正序获取有序集合key从start下标到stop下标的元素
  • ZREVRANGE key start stop [WITHSCORES] 倒序获取有序集合key从start下标到stop下标的元素
  • ZUNIONSTORE destination numkeys key [key ...] 并集计算
  • ZUNIONSTORE destination numkeys key [key ...] 交集计算

应用场景

  • 排行榜场景
    排行榜
    微博排行榜在Redis中的使用:
    • 点击新闻->ZINCRBY hotNews:20190819 1 守护香港
    • 展示当日排行前十->ZREVRANGE hotNews:20190819 0 10 WITHSCORES
    • 七日搜索榜单->ZUNIONSTORE hotNews:20190813-20190819 7 hotNews:20190813 hotNews:20190814 hotNews:20190815....hotNews:20190819
    • 展示7日排行前十->ZREVRANGE hotNews:20190813-20190819 0 10 WITHSCORES

在这里插入图片描述

发布了41 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yunwei_Zheng/article/details/104976637
今日推荐