Rides————五大数据结构

在redis中有五大数据结构,分别是:

  • 字符串 String
  • 哈希 Hash
  • 列表 List
  • 集合 Set
  • 有序集合 Zset

字符串-String结构

常用操作

命令 解释
SET key value 存入字符串键值对
MSET key value [key value…] 批量存储字符串键值对
SETNX key value 存入一个不存在的字符串键值对
GET key 获取一个字符串键值
MGET key [key…] 批量获取字符串键值
DEL key 删除一个字符串键值对
EXPIRE key seconds 设置一个键的过期时间

原子加减

命令 解释
INCR key 将key中存储的数字加一
DECR key 将key中存储的数字减一
INCRBY key increment 将key中存储的值加上increment
DECRBY key decrement 将key中存储的值减去decrement

应用场景

  • 单值缓存

    SET key value
    GET key value

  • 对象缓存

    SET user:1 value(json格式数据)
    MSET user:1:name lzh user:1:balance 8888
    MGET user:1name user:1:balance

  • 分布式锁
SETNX lock:0001 true			//返回1代表获取锁成功
SETNX lock:0001 true			//返回0代表获取锁失败
	。。。执行业务逻辑
DEL lock:0001					//执行完业务释放锁
SET lock:0001 true ex 10 nx		//防止程序意外终止导致死锁
  • 计数器

    INCR urlAddress:readCount:{网址url}
    GET urlAddress:readCount:{网址url}

  • Web集群session共享

    spring session + redis实现session共享

  • 分布式系统全局序列号

    INCRBY orderId 1000 //redis批量生成序列号提升性能

哈希-Hash结构

常用操作

命令 解释
HSET key field value 存储哈希表key的键值
HSETNX key field value 存储一个不存在的哈希表key的键值
HMSET key field value [field value…] 在一个哈希表key中存储多个键值对
HGET key filed 获取哈希表key中field对应的键值
HMGET key field [field…] 批量获取哈希表key中多个field的键值
HDEL key field 删除哈希表key中field的键值对
HLEN key 返回哈希表key中field的数量
HGETALL key 返回哈希表key中所有的键值
HINCREBY key field increment 为哈希表key中field的键值加上增量increment

Hash应用场景

  • 对象缓存

    HMSET user {userId}:name lzh {userId}:balance 8888
    HMSET user 1:name lzh 1:balance 8888
    HMGET user 1:name 1:balance

  • 电商购物车
    1. 以用户id为key
    2. 商品id为field
    3. 商品数量为value
    • 购物车相关操作
      1. 添加商品->hset cart:1000 10101 1
      2. 增加数量->hincreby cart:1000 10101 1
      3. 商品总数->hlen cart:1000
      4. 删除商品->hdel cart:1000 10101
      5. 获取购物车所有商品->hgetall cart:1000

Hash的优缺点

  • 优点
    • 同类数据归类整合存储,方便数据管理
    • 相比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列表的尾元素
LRANGE key start stop 返回列表key指定区间内的元素,区间以偏移量start和stop指定
BLPOP key [key…] timeout 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key…] timeout 从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

常用数据结构

  • Stack(栈)= LPUSH + LPOP
  • Queue(队列)= LPUSH + RPOP
  • Blocking MQ(阻塞队列)= LPUSH +BRPOP

应用场景

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

    比如你关注了公众号1、公众号2等账号

    1. 公众号1发文章,消息ID为10000
      LPUSH msg:{你的ID} 10000
    2. 公众号2发文章,消息ID为10001
      LPUSH msg:{你的ID} 10001
    3. 查看最新公众号消息
      LRANGE msg:{你的ID} 0 4

集合-Set结构

常用操作

命令 解释
SADD key member [member…] 往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member…] 从集合key中删除元素
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…] 差集运算
SDIDDSTORE destination key [key…] 将差集结果存入新集合destination中

应用场景

  • 小程序抽奖

    1. 点击参与抽奖加入集合
      SADD key userid
    2. 查看参与抽奖的所有用户
      SMEMBERS key
    3. 抽取count名中奖者
      SRANDMEMBER key [count]/SPOP key [count]
  • 点赞、收藏

    1. 点赞
      SADD like:{消息ID} 用户ID
    2. 取消点赞
      SREM like:{消息ID} 用户ID
    3. 检查用户是否点过赞
      SISMEMBER like:{消息ID} 用户ID
    4. 获取点赞用户的列表
      SMENBERS like:{消息ID}
    5. 获取点赞用户数
      SCARD like:{消息ID}
  • 集合操作实现关注模型

    1. A关注的人
      ASet->{B、C}
    2. D关注的人
      DSet->{A、E、B、C}
    3. B关注的人
      BSet->{A、F、E、C、G}
    4. A和B共同关注的人
      SINTER ASet BSet ->{B、C}
    5. 我关注的人也关注他(D)
      SISMEMBER BSet D
      SISMEMBER CSet D
    6. 我可能认识的人
      SDIFF ASet DSet ->{A、E}

有序集合-ZSet结构

常用操作

命令 解释
ZADD key score member {【score member…]} 往有序集合key中加入带分值的元素
ZREM key member [member…] 从有序集合key中删除元素
ZSCORE key member 返回有序集合key中元素member的分值
ZINCREBY 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 …] 交集计算

应用场景

  • 排行榜实现
    1. 点击
      ZINCRBY hotNews:20230610 1 高考结束
    2. 展示当日排行前十
      ZREVRANGE hotNews:20230610 0 9 WITHSCORES
    3. 七日搜索榜单计算
      ZUNIONSTORE hotNews:20230603-20230610 7
      hotNews:20230603 hotNews:20230504… hotNews:20230609
    4. 展示七日排行前十
      ZREVRANGE hotNews:20230603-20230610 0 9 WITHSCORES

你可能感兴趣的:(数据结构,redis,java)