Redis** 常⻅数据结构以及使⽤场景
1 string
-
**介绍:**最简单的类型,就是普通的set和get,做简单的kv缓存
-
常⽤命令:
set,get,strlen,exists,dect,incr,setex
等等。 -
**应⽤场景:**⼀般常⽤在需要计数的场景,⽐如⽤户的访问次数、热点⽂章的点赞转发数量等。
set key1 haha #设置key
get key1 #获取key
exists key1 #是否存在
strlen key1 #获取长度
del key1 #删除key
2 list
-
介绍: list 即是 链表。链表是⼀种⾮常常⻅的数据结构,特点是易于数据元素的插⼊和删除并且且可以灵活调整链表⻓度,但是链表的随机访问困难。Redis 的 list 的实现为⼀个
双向链表
,即可以⽀持反向查找和遍历,更⽅便操作,不过带来了部分额外的内存开销。 -
常用命令:
rpush,lpop,lpush,rpop,lrangellen
等。 -
使用场景: 可以通过 rpush/lpop 实现队列等
lrange mylist 0 -1 # 0开始位置,-1结束 -1则表示查看所有
len mylist #查询list的元素个数
lindex mylist 1 #获取list中指定位置的元素
lpush mylist 1 #添加一个或多个元素值list的头部
rpush mylist 1 #添加一个或多个元素值list的尾部
lpop mylist #从list中删除并返回第一个元素
rpop mylist #从list中删除并返回最后一个元素
3 hash
-
介绍: hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组 + 链表)。不过,Redis 的 hash 做了更多优化。另外,hash 是⼀个 string 类型的 field 和 value 的映射表,特别
适合⽤于存储对象
,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 ⽐如我们可以 hash 数据结构来存储⽤户信息,商品信息等等。 -
常⽤命令:
hset,hmset,hexists,hget,hgetall,hkeys,hvals
等。 -
应⽤场景: 系统中对象数据的存储。
hset sutdent name zhangsan
hset student age 20
hset student id 1
hget student name
4 Set
-
介绍: set 类似于 Java 中的 HashSet 。Redis 中的 set 类型是⼀种⽆序集合,集合中的元素没有先后顺序。当你需要存储⼀个列表数据,⼜不希望出现重复数据时,set 是⼀个很好的选择,并且 set 提供了判断某个成员是否在⼀个 set 集合内的重要接⼝,这个也是 list 所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作。
-
常用命令:
sadd,spop,smembers,sismember,scard,sinterstore,sunion
-
应⽤场景: 需要存放的数据
不能重复
以及需要获取多个数据源交集和并集等场景
sadd mySet 1 # 添加元素
smembers mySet # 查看全部元素
sismember mySet 3 # 判断是否包含某
srem mySet 1 # 删除某个/些元素
scard mySet # 查看元素个数
spop mySet # 随机删除一个元素
#-------操作多个set-------
# 将一个set的元素移动到另外一个set
smove yourSet mySet 2
# 求两set的交集
sinter yourSet mySet
# 求两set的并集
sunion yourSet mySet
# 求在yourSet中而不在mySet中的元素
sdiff yourSet mySet
5 Sorted Sets
-
介绍: 和 set 相⽐,sorted set 增加了⼀个权重参数 score,使得集合中的元素能够按 score进⾏有序排列,还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap和 TreeSet 的结合体。
-
常⽤命令:
zadd,zcard,zscore,zrange,zrevrange,zrem
等。 -
应⽤场景: 需要对数据根据某个权重进⾏排序的场景。⽐如在直播系统中,实时排⾏信息包含直播间在线⽤户列表,各种礼物排⾏榜,弹幕消息(可以理解为按消息维度的消息排⾏榜)等信息。
zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu
# 获取排名前三的用户(默认是升序,所以需要 rev 改为降序)
zrevrange board 0 3
# 获取某用户的排名
zrank board zhaoliu