0
点赞
收藏
分享

微信扫一扫

Redis核心数据结构

独西楼Q 2022-05-05 阅读 50

Redis核心数据结构

Redis的五种数据结构

Redis五种数据结构.png

  • 字符串string
  • 哈希hash
  • 列表list
  • 集合set
  • 有序集合zset

常用指令操作

Redis指令手册: https://redis.io/commands/set

string常用指令

  • 常用结构

    • 单值缓存

      • set key value

      • get key value

      • del key …

      • expire key value

      • 对象缓存

        • set user <json数据>
        • mset user:1:name linc user1:balance 888
        • mget user:1:name linc user:1:balance
      • 分布式锁

        • setnx product:101 true
    • 计数器

      • incr article:count:999
  • 应用场景

    • Web集群Session共享
    • Spring Session + Redis实现Session共享

hash常用指令

  • 常用结构

    • hset key field value

    • hmset user userid:name linc userid:balance 999

    • hmget userid:name userid:balance

  • 应用场景

    • 购物车

      • 添加商品: hset cart:1001 10088 1
      • 增加数量: hincrby cart:1001 10088 1
      • 商品总数: hlen cart:1001
      • 删除商品: hdel cart:1001 10088
      • 获取购物车所有商品: hgetall cart:1001
      image.png
  • 优点

    • 同类数据归类整合存储,方便数据管理
    • 相比string操作消耗内存与CPU更小
    • 相比string操作存储更节省内存
  • 缺点

    • 过期功能不能使用field上,只能用在key上
    • Redis集群架构下不适合大规模使用

list常用指令

  • 常用结构

    • lpush key value [value …]

      • 将一个或多个value插入到key列表的最左边

      • rpush key value [value …]

        • 将一个或多个value插入到key列表的最右边
      • lpop key

        • 移除并返回key列表的头元素
      • rpop key

        • 移除并返回key列表的尾元素
      • brpop key

        • 从key列表尾弹出一个元素,如果列表中没有元素,阻塞等待timeout秒.如果timeout=0,则一直阻塞
      • blpop key

        • 从key列表表头弹出一个元素,如果列表中没有元素,阻塞等待timeout秒.如果timeout=0,则一直阻塞
    • lrange key start stop

      • 返回列表key中指定区间内的元素,区间以偏移量start和stop指定范围
  • 应用场景

    • 微信公众号的消息流
      • A发微博: lpush msg:msgid1 msgid2
      • B发微博: lpush msg:msgid2 msgid1
      • 查看最新微博信息: lrange msg:msgid 0 4
    • 微博发布的新闻
    • 队列的实现
      • Stack: lpush + lpop
      • Queue: lpush + rpop
      • BlockingQueue: lpush + brpop
      • Redis中发布/订阅

set常用指令

  • 常用结构

    • sadd key member [member…]
    • srem key member [member…]
    • smembers key
      • 获取集合key中的所有元素
    • scard key
      • 获取集合key的元素个数
    • sismember key
      • 判断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 …]
      • 求并集
    • sdiff key [key…]
      • 求差集
    • sdiffstore destination key [key …]
      • 将差集结果存入新集合destination中
  • 应用场景

    • 微信抽奖小程序

      • 点击参与抽奖加入集合: sadd key userid
      • 查看参与抽奖的所有用户: smembers key
      • 抽取count位中奖者: srandmember key [count]spop key [count]
    • 微博微信点赞、收藏、关注

      • 点赞: sadd like:messageid userid
      • 取消点赞: srem like:messageid userid
      • 检查用户是否点赞: sismember like:messageid userid
      • 获取点赞的用户列表: smembers like:messageid
      • 获取点赞用户数: scard like:messageid
    • 集合操作,实现微博微信关注

    • A关注的人: aset

    • B关注的人: bset

    • AB共同关注的人: sinter aset bset

    • 我关注的人: sismember

    • 我可能认识的人: sdiff aset bset

    • 电商平台的根据不同的条件筛选出对应的商品

      sadd  brand:huawei  p40
      sadd  brand:xiaomi  mi-10
      sadd  brand:iphone iphone12
      sadd os:android  p40  mi-10
      sadd cpu:brand:intel  p40  mi-10
      sadd ram:8g  p40  mi-10  iphone12
      sinter  os:android  cpu:brand:intel  ram:8g  -> {p40,mi-10}
      
  • Set集合一个key不能存放太多数据,建议5k以下,如果超过5k,性能会逐渐下降,所以尽量避免大key,如果数据确实比较多,可以将数据分片存放,比如: 10w数据,将数据取模运算分别存放在20个key中,相当于每个key平均分配到5k记录,也可以分更多,分片的目的是为了避免大key,所以根据自己业务需求来处理

zset常用指令

  • 常用操作

    • zadd key score member [[score member]…]
      • 往有序集合key中加入带分值元素
    • zrem key member [member …]
      • 从有序集合key中删除元素
    • zscore key member
      • 返回有序集合key中元素member的分值
    • 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 destkey numkeys key [key …]
      • 求并集
    • zinterstore destkey numkeys key [key …]
      • 求交集
  • 应用场景

    • 微博排行榜
      • 点击新闻: zincrby hotnews:20220505 1 抗疫
      • 展示当日排行榜前10: zrevrange hotnews:20220505 0 9 withscores
      • 七日搜索榜单计算: zunionstore hotnews:20220505-20220512 7
      • 展示七日排行榜前10: zrevrange hotnews:20220505-20220512 0 9 withscores
  • ​ **思考: 给一个包含1亿关键词的用户检索日志,如何取出排行榜前10的关键词(服务器配置: 2核2G一台) **

    • Map + 分治算法 + 堆树
举报

相关推荐

0 条评论