美文网首页
Redis常用数据结构及应用场景的吐血整理

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

作者: KingdomCoder | 来源:发表于2020-03-22 13:30 被阅读0次

    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
    在这里插入图片描述 关注我

    相关文章

      网友评论

          本文标题:Redis常用数据结构及应用场景的吐血整理

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