Redis数据结构

数据结构与原理 - 图1数据结构与原理 - 图2

String

操作命令

  • 字符串常用操作
    | | | | —- | —- | | SET key value | 存入字符串键值对 | | MSET key value [key value …] | 批量存储字符串键值对 | | SETNX key value | 存入一个不存在的字符串键值对 | | GET key | 获取一个字符串键值 | | MGET key [key …] | 批量获取字符串键值 | | DEL key [key …] | 删除一个键 | | EXPIRE key seconds | 设置一个键的过期时间(秒) |

  • 原子加减
    | | | | —- | —- | | INCR key | 将key中储存的数字值加1 | | DECR key | 将key中储存的数字值减1 | | INCRBY key increment | 将key所储存的值加上increment | | DECRBY key decrement | 将key所储存的值减去decrement |

应用场景

  • 单值缓存
    SET key value
    GET key
  • 对象缓存
    • SET user:1 value(json格式数据)
    • MSET user:1:name zhuge user:1:balance 1888
    • MGET user:1:name user:1:balance
  • 分布式锁
    • SETNX product:10001 true //返回1代表获取锁成功
    • SETNX product:10001 true //返回0代表获取锁失败

。。。执行业务操作

  • DEL product:10001 //执行完业务释放锁
  • SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
    • 计数器
  • INCR article:readcount:{文章id}
  • GET article:readcount:{文章id}
    • Web集群session共享
  • spring session + redis实现session共享
    • 分布式系统全局序列号
  • INCRBY orderId 1000 //redis批量生成序列号提升性能

Hash

操作命令

  • Hash常用操作
    | | | | —- | —- | | HSET key field value | 存储一个哈希表key的键值 | | HSETNX key field value | 存储一个不存在的哈希表key的键值 | | HMSET key field value [field value …] | 在一个哈希表key中存储多个键值对 | | HGET key field | 获取哈希表key对应的field键值 | | HMGET key field [field …] | 获取哈希表key对应的field键值 | | HDEL key field [field …] | 删除哈希表key中的field键值 |

应用场景

  • 对象缓存
    • HMSET user {userId}:name zhuge {userId}:balance 1888
    • HMSET user 1:name zhuge 1:balance 1888
    • HMGET user 1:name 1:balance
  • 电商购物车
    • 1)以用户id为key
    • 2)商品id为field
    • 3)商品数量为value
  • 购物车操作
    • 1)添加商品 hset cart:1001 10088 1
    • 2)增加数量 hincrby cart:1001 10088 1
    • 3)商品总数 hlen cart:1001
    • 4)删除商品 hdel cart:1001 10088
    • 5)获取购物车所有商品 hgetall cart:1001

优点

1)同类数据归类整合储存,方便数据管理

2)相比string操作消耗内存与cpu更小

3)相比string储存更节省空间

缺点

1)过期功能不能使用在field上,只能用在key上

2)Redis集群架构下不适合大规模使用

List

  • 常用数据结构
    • Stack(栈) = LPUSH + LPOP
    • Queue(队列)= LPUSH + RPOP
    • Blocking MQ(阻塞队列)= LPUSH + BRPOP

Set

  • 微信抽奖小程序
    • 点击参与抽奖加入集合
      SADD key {userID}
    • 查看参与抽奖的所有用户
      SEMMEBERS key
    • 抽取count名中奖者
      SRANDMEMBER key [count]
  • 微信微博点赞、收藏、标签
    • 点赞
      SADD like:{消息ID} {用户ID}
    • 取消点赞
      SREM like:{消息ID} {用户ID}
    • 检查用户是否点过赞
      SISMEMBER like:{消息ID} {用户ID}
    • 获取点赞的用户列表
      SMEMBERS like:{消息ID}
    • 获取点赞用户数
      SCARD like:{消息ID}
  • 集合操作实现微博微信关注模型
  • 集合操作实现电商商品筛选

Zset

  • Zset集合操作实现排行榜