0%

Redis数据类型

作为key-value型数据库,Redis也提供了键和值的映射关系。除了常规的数值和字符串,Resis的值还可以是ListsSetsSorted Sets,Hashes。值的数据类型决定了该键值支持的操作。Redis 支持诸如列表、集合或有序集合的交集、并集、查集等高级原子操作;同时,如果值的类型是普通数字,Redis则提供自增等原子操作。

1. Strings

字符串是Redis最基本的数据类型。Redis字符串是二进制安全的,这意味着Redis字符串可以包含任何类型的数据,例如JPEG图像或序列化的Ruby对象。一个字符串值允许存储的最大容量为512MB。
利用字符串可以进行以下操作:

  • 利用INCR系列命令将Strings用作原子计数器
  • 利用APPEND命令在字符串的末尾添加值
  • 利用GETRANGESETRANGE命令对字符串中的部分字符进行修改和查询
  • 利用GETBITSETBIT命令对字符串进行位操作
    字符串是其他四种数据类型的基础,其他数据类型和字符串的差别在于组织字符串的形式不同。

2. Lists

Redis的列表就是一个简单的字符串列表,按照插入顺序排序。通过LPUSH命令将新元素插入到列表的头部,通过RPUSH将新元素插入到列表的尾部。Redis列表最多可容纳$2^{32}-1$个元素。
Redis列表使用双向链表实现的,主要特点是,无论列表有多大,在列表头部和尾部插入和删除元素耗费的时间是一样的。访问列表两端的元素速度非常快,但是访问列表中间位置的元素非常耗时间,是其时间复杂度为$O(N)$。
对列表进行的主要操作有:

  • LPUSHRPUSH向列表两端插入元素,LPOPRPOP从列表两端弹出元素
  • LRANG获取特定索引范围的列表片段,LTRIM删除索引以外的元素
  • LINDEXLSET用来索引/设置指定索引位置的元素
  • LREM用来移除列表中特定数量的元素,>0从左边删除,<0从右边删除,=0删除列表中特定值的所有元素

3. Sets

Redis集合是无序的字符串集合,Redis集合使用值为空的散列表实现,所以插入、删除、检测元素是否存在的时间复杂度都是$O(1)$。Redis集合最多可容纳$2^{32}-1$个元素。
对集合进行的主要操作有:

  • SADDAREM进行元素的增加/删除
  • 进行快速的集合运算,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存储图像这类数据,就要将图像数据序列化成二进制数据。序列化就是将程序数据转化成能被存储并传输的格式的过程,它的逆过程称为反序列化

参考文献 & 资源链接