- 字符串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
- mset user:1:name linc user1:balance 888
- mget user:1:name linc user:1:balance
- set user
-
分布式锁
- setnx product:101 true
-
-
计数器
- incr article:count:999
-
-
应用场景
- Web集群Session共享
- Spring Session + Redis实现Session共享
-
常用结构
-
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
-
-
优点
- 同类数据归类整合存储,方便数据管理
- 相比string操作消耗内存与CPU更小
- 相比string操作存储更节省内存
-
缺点
- 过期功能不能使用field上,只能用在key上
- Redis集群架构下不适合大规模使用
-
常用结构
-
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中发布/订阅
- 微信公众号的消息流
-
常用结构
- 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中
- sinter key [key…]
-
应用场景
-
微信抽奖小程序
- 点击参与抽奖加入集合: 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,所以根据自己业务需求来处理
-
常用操作
- 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下标的元素
- zadd key score member [[score member]…]
-
运算操作
- zunionstore destkey numkeys key [key …]
- 求并集
- zinterstore destkey numkeys key [key …]
- 求交集
- zunionstore 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 + 分治算法 + 堆树



