在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 - 电商购物车
- 以用户id为key
- 商品id为field
- 商品数量为value
- 购物车相关操作
- 添加商品->hset cart:1000 10101 1
- 增加数量->hincreby cart:1000 10101 1
- 商品总数->hlen cart:1000
- 删除商品->hdel cart:1000 10101
- 获取购物车所有商品->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发文章,消息ID为10000
LPUSH msg:{你的ID} 10000 - 公众号2发文章,消息ID为10001
LPUSH msg:{你的ID} 10001 - 查看最新公众号消息
LRANGE msg:{你的ID} 0 4
- 公众号1发文章,消息ID为10000
集合-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中 |
应用场景
-
小程序抽奖
- 点击参与抽奖加入集合
SADD key userid - 查看参与抽奖的所有用户
SMEMBERS key - 抽取count名中奖者
SRANDMEMBER key [count]/SPOP key [count]
- 点击参与抽奖加入集合
-
点赞、收藏
- 点赞
SADD like:{消息ID} 用户ID - 取消点赞
SREM like:{消息ID} 用户ID - 检查用户是否点过赞
SISMEMBER like:{消息ID} 用户ID - 获取点赞用户的列表
SMENBERS like:{消息ID} - 获取点赞用户数
SCARD like:{消息ID}
- 点赞
-
集合操作实现关注模型
- A关注的人
ASet->{B、C} - D关注的人
DSet->{A、E、B、C} - B关注的人
BSet->{A、F、E、C、G} - A和B共同关注的人
SINTER ASet BSet ->{B、C} - 我关注的人也关注他(D)
SISMEMBER BSet D
SISMEMBER CSet D - 我可能认识的人
SDIFF ASet DSet ->{A、E}
- A关注的人
有序集合-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 …] | 交集计算 |
应用场景
- 排行榜实现
- 点击
ZINCRBY hotNews:20230610 1 高考结束 - 展示当日排行前十
ZREVRANGE hotNews:20230610 0 9 WITHSCORES - 七日搜索榜单计算
ZUNIONSTORE hotNews:20230603-20230610 7
hotNews:20230603 hotNews:20230504… hotNews:20230609 - 展示七日排行前十
ZREVRANGE hotNews:20230603-20230610 0 9 WITHSCORES
- 点击