热门搜索 :
考研考公
您的当前位置:首页正文

Redis数据类型

来源:东饰资讯网

String

Redis中最基本的类型。
Redis中的String 类型是二进制安全的,也就是说在Redis中String类型可以包含各种数据,比如一张JPEG图片或者是一个序列化的Ruby对象。一个String类型的值最大长度可以是512M。

在Redis中String有很多有趣的用法

  • 把String当做原子计数器,这可以使用INCR家族中的命令来实现:, , 。
  • 使用命令来给一个String追加内容。
  • 把String当做一个随机访问的向量(Vector),这可以使用和 命令来实现
  • 使用 和方法,在一个很小的空间中编码大量的数据,或者创建一个基于Redis的Bloom Filter 算法。

Lists

Redis的列表类型中存储一系列String值,这些String按照插入的顺序排序。Redis的List可以从头部(左侧)加入元素,也可以从尾部(右侧)加入元素。

元素个数和单个元素的长度较小时,采用 ziplist 减少内存占用,否则用linklist 结构

一些例子:

LPUSH mylist a   # 现在list是 "a"
LPUSH mylist b   # 现在list是"b","a"
RPUSH mylist c   # 现在list是 "b","a","c" (注意这次使用的是 RPUSH)

list的最大长度是2^32 – 1个元素(4294967295,一个list中可以有多达40多亿个元素)

从时间复杂度的角度来看,Redis list类型的最大特性是:即使是在list的头端或者尾端做百万次的插入和删除操作,也能保持稳定的很少的时间消耗。在list的两端访问元素是非常快的,但是如果要访问一个很大的list中的中间部分的元素就会比较慢了,时间复杂度是O(N)。

Redis的Lists类型有很多有趣的用法

  • 在社交网络中使用List进行时间表建模,使用命令在用户时间线中加入新的元素,然后使用 命令来获得最近加入的元素。
  • 可以把 和 命令结合使用来实现定长的列表,列表中只保存最近的N个元素
  • 在创建后台运行的工作时,Lists可以作为消息传递原语,例如著名的Ruby库
  • 还有很多可以使用lists来做的事,这种数据类型支持很多命令,包括像这样的阻塞命令

Sets

Redis的Sets类型是String的无序集合。增加,删除,测试元素是否存在的时间复杂度都是O(1)(不管集合中有多少元素都是稳定的时间消耗)

Redis Sets的一个重要特性是不允许重复元素。向集合中添加多次相同的元素,集合中只存在一个该元素。在实际应用中,这意味着在添加一个元素前不需要先检查元素是否存在。

关于Redis Sets一个非常有意思的事情是,它们支持多个服务器端命令来从现有集合开始计算集合,所以执行集合的交集,并集,差集都可以很快。

set的最大长度是2^32 – 1个元素(4294967295,一个set中可以有多达40多亿个元素)

Redis Sets有很多有趣的用法

Hashes/ Maps

Redis Hashes 保存String域和String值之间的映射,所以它们是用来表示对象的绝佳数据类型(比如一个有着用户名,密码等属性的User对象):

hashtable或者 ziplist 实现

| 1 | @cli |

| 2 | HMSET user:1000 username antirez password P1pp0 age 34 |

| 3 | HGETALL user:1000 |

| 4 | HSET user:1000 password 12345 |

| 5 | HGETALL user:1000 |

一个有着少量数据域(这里的少量大概100上下)的hash,其存储方式占用很小的空间,所以在一个小的Redis实例中就可以存储上百万的这种对象。

虽然Hashes主要用于表示对象,他们可以存储很多的元素,所以你可以使用Hashes来做许多其他的工作。

Hash的最大长度是2^32 – 1个域值对(4294967295,一个Hash中可以有多达40多亿个域值对)

Sorted sets 类型(有序集合类型)

Redis有序集合类型与Redis的集合类型类似,是非重复的String元素的集合。不同之处在于,有序集合中的每个成员都关联一个Score,Score是在排序时候使用的,按照Score的值从小到大进行排序。集合中每个元素是唯一的,但Score有可能重复。

使用有序集合可以很高效的进行,添加,移除,更新元素的操作(时间消耗与元素个数的对数成比例)。由于元素在集合中的位置是有序的,使用get ranges by score或者by rank(位置)来顺序获取或者随机读取效率都很高。(本句不确定,未完全理解原文意思,是根据自己对Redis的浅显理解进行的翻译)访问有序集合中间部分的元素也非常快,所以可以把有序集合当做一个不允许重复元素的智能列表,你可以快速访问需要的一切:获取有序元素,快速存在测试,快速访问中间的元素等等。

简短来说,使用有序集合可以实现很多高性能的工作,这一点在其他数据库是很难实现的。

使用有序集合你可以:

Bitmaps and HyperLogLogs类型(位图类型和HyperLogLogs类型)

Redis 也支持位图类型和HyperLogLogs 类型,他们是在String基本类型基础上建立的类型,但有自己的语义。

Top