作为key-value型数据库,Redis也提供了键和值的映射关系。除了常规的数值和字符串,Resis的值还可以是Lists
,Sets
,Sorted Sets
,Hashes
。值的数据类型决定了该键值支持的操作。Redis 支持诸如列表、集合或有序集合的交集、并集、查集等高级原子操作;同时,如果值的类型是普通数字,Redis则提供自增等原子操作。
1. Strings
字符串是Redis最基本的数据类型。Redis字符串是二进制安全的,这意味着Redis字符串可以包含任何类型的数据,例如JPEG图像或序列化的Ruby对象。一个字符串值允许存储的最大容量为512MB。
利用字符串可以进行以下操作:
- 利用
INCR
系列命令将Strings用作原子计数器 - 利用
APPEND
命令在字符串的末尾添加值 - 利用
GETRANGE
和SETRANGE
命令对字符串中的部分字符进行修改和查询 - 利用
GETBIT
和SETBIT
命令对字符串进行位操作
字符串是其他四种数据类型的基础,其他数据类型和字符串的差别在于组织字符串的形式不同。
2. Lists
Redis的列表就是一个简单的字符串列表,按照插入顺序排序。通过LPUSH
命令将新元素插入到列表的头部,通过RPUSH
将新元素插入到列表的尾部。Redis列表最多可容纳$2^{32}-1$个元素。
Redis列表使用双向链表实现的,主要特点是,无论列表有多大,在列表头部和尾部插入和删除元素耗费的时间是一样的。访问列表两端的元素速度非常快,但是访问列表中间位置的元素非常耗时间,是其时间复杂度为$O(N)$。
对列表进行的主要操作有:
LPUSH
和RPUSH
向列表两端插入元素,LPOP
和RPOP
从列表两端弹出元素LRANG
获取特定索引范围的列表片段,LTRIM
删除索引以外的元素LINDEX
和LSET
用来索引/设置指定索引位置的元素LREM
用来移除列表中特定数量的元素,>0
从左边删除,<0
从右边删除,=0
删除列表中特定值的所有元素
3. Sets
Redis集合是无序的字符串集合,Redis集合使用值为空的散列表实现,所以插入、删除、检测元素是否存在的时间复杂度都是$O(1)$。Redis集合最多可容纳$2^{32}-1$个元素。
对集合进行的主要操作有:
SADD
和AREM
进行元素的增加/删除- 进行快速的集合运算,
SDIFF
求差集,SINTER
求交集,SUNION
求并集。
4. Hashes
Redis是采用字典结构以key-value的形式存储数据的,Hhash的value也是一种字典结构,其存储了字段(field)和字段值(field value)的映射,但字段值只能是字符串,Hash的这种结构很适合存储对象数据。每个Hash最多只能存储$2^{32}-1$个key-value对。
5. Sorted Sets
与Redis集合类似,Redis有序集合是非重复的String集合。 区别在于,有序集合的每个成员都有一个分数,该分数用于从最小到最大进行排序。 虽然成员是唯一的,但分数可能会重复。有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快,时间复杂度是$O(logN)$。有序集合不仅可以非常快的进行元素的增删查改,因为元素是顺序排序的,所以可以获取特定范围的元素。
6. 其他
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
Redis中还可以存储数值和二进制数据。如果使用Redis存储图像这类数据,就要将图像数据序列化成二进制数据。序列化就是将程序数据转化成能被存储并传输的格式的过程,它的逆过程称为反序列化。