Redis不是简单的键值存储数据库,它实际上是一个支持不同类型值的数据结构服务器。Redis支持的数据类型包括:String字符串、List列表、Set集合、ZSet有序集合、Hash哈希、BitMaps位图、HyperLogLogs、Streams
1. String字符串
- string是Redis最基本的数据类型,一个key对应一个value
- value可以是每种类型的字符串,其大小不能大于512MB
1.1 设置和获取字符串的值
其中,如果键对应的值已经设置了,再次调用set命令会将原来的value覆盖
在单条命令设置和获取字符串的值可使用mset和mget命令
1.2 原子增量
若字符串的值为一个整数,则可以使用incr命令对value进行递增操作,该操作具有原子性,类似的命令还有incrby(value增加指定的值)、decr(递减)、decrby(value减少指定的值)
1.3 删除键和关联的值
2. List列表
- Redis的列表是通过链表实现的,所以在list的开头或结尾添加新元素的操作复杂度为O(1),但访问元素的复杂度为O(N)
- 常用于消息队列,生产者将消息推入列表,消费者从列表中取出消息并执行操作
2.1 添加元素
lpush命令将一个新元素添加到列表的左侧(头部),类似的命令有rpush(在列表的右侧即尾部添加元素),两个命令都是可变参数命令。当目标键不存在时,会在添加元素之前先创建一个空的列表。其中可通过lrange从列表中提取元素。
2.2 删除元素
lpop命令将列表左侧(头部)的元素弹出并返回,类似的命令有rpop(弹出并返回列表右侧即尾部的元素)。当删除元素后列表为空时,该键将自动销毁
2.3 修剪列表
ltrim命令可以将索引范围外的元素删除
2.4 无元素弹出时阻塞
Redis的列表可用作消息队列,但当列表为空时,消费者调用pop命令时会返回空,此时需要隔一段时间再次执行pop命令重试,即轮询,这样会强制Redis和客户端执行处理无用的命令,也会增加延迟,因此可以使用brpop命令,当列表为空时,阻塞消费者,直到有生产者将元素添加至列表时,将元素弹出返回。将timeout设置为0时将无限等待
3. Hash哈希
哈希是一个键值对集合,可放入哈希表的字段数没有实际限制(可用内存除外)
3.1 设置和获取
还可通过hmset、hmget设置和获取多个键值对
4. Set集合
set是Redis的无序集合,不允许有重复的元素
4.1 添加元素
4.2 弹出元素
4.3 返回所有元素
因为set是无序集合,调用smembers时会以任意顺序返回元素
4.4 检查元素是否存在
5. ZSet有序集合
- zset与set类似,但是zset是有序的,其中的每一个元素都与一个称为得分的浮点值相关联,根据该值对zset进行排序
- 排序规则:若score不等,则若A.score > B.score,则A > B;若score相等,则比较A和B的字符串,因为集合不能有重复元素,所以A和B的字符串不会相等
- 底层实现为压缩列表和跳跃表
- 常用场景有排行榜,或者用于做有权重的队列
5.1 添加元素
5.2 返回元素
此时返回的元素已排序,类似的命令有zrevrange,可逆序返回元素
还可返回范围内的元素
6. BitMaps位图
- bitmaps不是实际的数据类型,而是在string类型上定义的一组面向位的操作
- bitmaps最大的优点是在存储信息时,可以节省大量的空间
- 常用于各种实时分析
6.1 设置和获取
6.2 计数
7. HyperLogLog
用于对事物进行计数。通常,因为需要记住过去的值,以免重复计数,所需的内存与项目数量成正比。在Redis中可以通过hyperloglog使用恒定数量的内存,对项目进行计数,但会存在一定的误差,误差小于1%
7.1 设置和计数
8 Stream流
stream是5.0引入的新数据类型,支持多播的可持久化的消息队列,用于实现发布订阅功能,借鉴了 kafka 的设计。