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基本类型基础上建立的类型,但有自己的语义。