redis的常用数据结构及使用场景

String的使用场景

  • 普通数据/对象缓存
  • 分布式锁
  • 计数器
  • 分布式系统全局序列号

Hash的使用场景

Redis数据结构Hash应用场景-存储商品、购物车、淘宝短链接、分布式Session、用户注册、发微博功能

  • 购物车
    • 用户id为key
    • 商品id为field
    • 商品count为value

示例

往购物车加入2件商品

key = cart:user:用户id

vm01:0>hset cart:user:1000 101 1
"1"
vm01:0>hset cart:user:1000 102 1
"1"
vm01:0>hgetall cart:user:1000
1) "101"
2) "1"
3) "102"
4) "1"
vm01:0>

修改购物车数据,增加商品数量

vm01:0>hincrby cart:user:1000 101 1
"2"
vm01:0>hincrby cart:user:1000 102 10
"11"
vm01:0>hgetall cart:user:1000
1) "101"
2) "2"
3) "102"
4) "11"
vm01:0>

统计购物车商品

vm01:0>hlen cart:user:1000
"2"
vm01:0>

删除购物车商品

vm01:0>hdel cart:user:1000 101
"1"
vm01:0>hgetall cart:user:1000
1) "102"
2) "11"
vm01:0>

List的使用场景

Redis的List的应用场景

  • 消息队列
    • lpush + brpop命令组合即可实现阻塞队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的争抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用
  • 朋友圈点赞列表\评论列表
    • lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表
    • 通过(lpush lpop左边进左边出,或rpush rpop 右边进右边出),先进后出原则

消息队列

生产者: 消息队列中新增数据

vm01:0>lpush list 1
"1"
vm01:0>llen list
"1"
vm01:0>

消费者: 从消息队列中消费数据

vm01:0>brpop list 0 #超时时间0表示一直等待,直到争抢到尾部元素
1) "list"
2) "1"
vm01:0>

生产者: 查询队列中数据

vm01:0>llen list
"0"
vm01:0>

朋友圈点赞/评论列表

点赞/评论数据新增:

vm01:0>lpush list 1
"1"
vm01:0>lpush list 2
"2"
vm01:0>lpush list 3
"3"
vm01:0>lpush list 4
"4"
vm01:0>llen list
"4"
vm01:0>

获取最新的点赞/评论数据:

vm01:0>lrange list 0 10
1) "4"
2) "3"
3) "2"
4) "1"
vm01:0>

用朋友圈点赞/评论数据

满足FIFO(先进先出\后进后出)顺序

栈-入:

vm01:0>lpush list 1
"1"
vm01:0>lpush list 2
"2"
vm01:0>lpush list 3
"3"
vm01:0>lpush list 4
"4"
vm01:0>llen list
"4"
vm01:0>

栈-出:

vm01:0>lrange list 0 10
1) "4"
2) "3"
3) "2"
4) "1"
vm01:0>lpop list
"4"
vm01:0>lpop list
"3"
vm01:0>lpop list
"2"
vm01:0>lpop list
"1"
vm01:0>

Set的使用场景

  • 点赞
  • 抽奖
  • 关注模型(共同好友\推荐好友)

点赞

key = prize:{消息id}

点赞数据新增:

vm01:0>sadd prize:id_1 小王
"1"
vm01:0>sadd prize:id_1 小李
"1"
vm01:0>sadd prize:id_1 小赵
"1"
vm01:0>

获取点赞人数统计:

vm01:0>scard prize:id_1
"3"
vm01:0>

抽奖

抽奖用户数据新增

vm01:0>SADD prize 小王
"1"
vm01:0>SADD prize 小李
"1"
vm01:0>SADD prize 小黑
"1"
vm01:0>

获取参与抽奖所有用户

vm01:0>smembers prize
1) "小李"
2) "小王"
3) "小黑"
vm01:0>

随机获取两个抽奖用户

vm01:0>srandmember prize 2
1) "小李"
2) "小黑"
vm01:0>

随机获取一个抽奖用户并删除记录

vm01:0>smembers prize
1) "小李"
2) "小王"
3) "小黑"
vm01:0>spop prize
"小李"
vm01:0>smembers prize
1) "小王"
2) "小黑"
vm01:0>

关注模型

新增用户好友数据:

vm01:0>sadd A 小李 小王 小赵
"3"
vm01:0>sadd B 小李 小白 小黑
"3"
vm01:0>

共同好友

vm01:0>sinter A B
1) "小李"
vm01:0>

推荐好友

vm01:0>sdiff A B
1) "小王"
2) "小赵"
vm01:0>

Zset使用场景

  • 实现热搜排行榜

key 不能重复, score 可以重复

添加热搜数据

vm01:0>zadd hot 1 redis
"1"
vm01:0>zadd hot 1 mongodb
"1"
vm01:0>

模拟点击热搜提升数值

vm01:0>ZINCRBY hot 1 mongodb
"2"
vm01:0>

根据热搜数值排行榜0-10区间 -> 大>小 (热搜排行榜)

vm01:0>zrevrange hot 0 10 
1) "mongodb"
2) "redis"
vm01:0>zrevrange hot 0 10 withscores
1) "mongodb"
2) "2"
3) "redis"
4) "1"
vm01:0>

+++ 点击显示/隐藏(小>大)
根据热搜数值排行榜0-10区间 -> 小>大

vm01:0>zrange hot 0 10
1) "redis"
2) "mongodb"
vm01:0>zrange hot 0 10 withscores
1) "redis"
2) "1"
3) "mongodb"
4) "2"
vm01:0>

+++

补充-指定区间范围的热搜: