Redis 目前支持的数据结构包含以下五种:
- String:字符串
- List:列表
- Set:集合
- SortedSet:有序集合
- Hash:哈希字典
INCR
除了字符串格式的值外,还支持数字格式的值,我们可以利用这个特性实现计数器功能,比如浏览数、购买数、点赞数等,这个时候,我们可以使用 INCR
命令来初始化对应的键值
INCRBY
取还是通过 GET
指令,默认步长是 1,即每次调用 INCR
指令会将对应的键值 +1,此外,还可以通过 INCRBY
显式设置步长,比如我们在前面的基础上将步长设置为 5,可以这么做:
Zincrby 命令对有序集合中指定成员的分数加上增量 increment
//设置文章id为1的热度为2
// key increment(可以为负)
zincrby article 2 1
//zrevrange key start end
zrevrange article 0 9
DECR
/DECRBY
与 INCR
/INCRBY
相对的是 DECR
/DECRBY
指令,即对给定键值做 -1 操作或者做给定步长的减少操作(对应取消点赞之类的操作)
List:列表
应用场景一般用在队列中
特点:有序的,可以重复,
eg:我们从尾部添加数据,从头部读取数据。
左进右出
lpush skill 'php'
lpush skill 'java'
lpush skll 'js' 左边最后推进去
lrange skill 0 -1 获取完整list列表
lpop skill 右边第一个取出来值为:php
上述数据添加和获取符合「先入先出」规则,所以是一个标准的队列结构。
当然了,还有与之相对的 RPOP
和 LPUSH
指令,你可以基于 LPUSH
和 LPOP
实现栈这种数据结构,这里就不单独演示了。
Set:集合
应用场景:我的好友列表,我的粉丝
特点:互异不可重复,无序的
Redis 集合中所有元素都是互异的,即任意一个元素都是唯一的,当我们尝试向集合中添加相同元素时,会忽略后续添加的值,比如我们通过 SADD
指令尝试向 skills
集合添加两个相同的 PHP
元素:
sadd 添加集合
SADD KEY_NAME VALUE1..VALUEN
smembers 集合的key 查看集合包含的value
有序集合
但有些时候我们的业务场景既要去重,又要确保排序,比如一些热门数据排行榜的实现,因此,Redis 还支持另一种数据结构 —— 有序集合。
顾名思义,有序集合就是在集合的基础上让内部元素有确定的排序,不过这个排序不是按照添加时的顺序,而是通过额外的排序字段值指定,还是以上面的例子为例。
zadd key sort value
eg:zadd skill 0 'php'
zadd skill 1 'java'
zrange key start end
eg:zrange skill 0 1
zadd和 SADD
指令不同,在元素值之前插入了一个数值(score),在返回有序集合时,默认会根据这个数值进行升序排序:
和 LRANGE
指令一样,最后面的两个数字表示集合区间,前面是起始位置,后面是结束位置,-1 表示集合末尾索引值。
一些排行榜功能,比如热门阅读、热门讨论等比较适合有序集合
哈希字典
可以通过 HSET
指令逐个添加字典元素:
hset student.1 name 'lilei'
hset student.1 class '7'
hset student.1 grade 'a'
hmset
hmset student.2 name 'fu' class '7' grade 'b'
//通过 HKEYS 指令获取所有键,通过 HVALS 指令获取所有值:
hkeys student.1
hvals student.1
//可以通过 HGET 指令获取单个字典字段值,也可以通过 HMGET 指令获取多个字典字段值,还可以通过 //HGETALL 指令获取所有字典字段值
hget student.1 name
hmget student.1 name grade
hgetall student.1
通过 HMSET
指令一次性设置多个字典字段