字符串
字符串是Redis最基本的数据类型。Redis的字符串是二进制安全的,意味着一个Redis字符串可以包含任何类型的数据,比如:JPEG图片或者序列化的Ruby对象。
字符串的值的最大长度可达512MB。
你可以使用Redis字符串做一些有趣的事情,比如:
- 在INCR系列的命令中: INCR, DECR, INCRBY 使用字符串做原子计数器。
- 使用 APPEND命令追加字符串。
- 用 GETRANGE 和 SETRANGE 来实现一个字符串随机访问向量。
- 在一个小空间编码大量数据,或者使用 GETBIT and SETBIT创建一个Redis支持的布隆(Bloom)过滤器。
想获取更多信息,请查看available string commands,或者阅读 introduction to Redis data types
列表
Redis的列表(List)类型是字符串的简单列表,按照插入顺序排序。可以向Redis列表的头部(左边)或者尾部(右边)添加一个新的元素。
LPUSH命令向头部插入一个新的元素, RPUSH向尾部插入一个新的元素。对一个空的键(key)使用其中一个操作时,会创建一个新的list.与此类似,如果一个列表操作清空列表时,将会在键空间中删除该键。这些是非常方便的语义,因为如果使用不存在的键作为参数调用,那么所有列表命令的行为将与它们在空列表中被调用时完全一样。
一些列表操作和操作结果的例子:
LPUSH mylist a # now the list is "a"
LPUSH mylist b # now the list is "b","a"
RPUSH mylist c # now the list is "b","a","c" (RPUSH was used this time)
列表(list)的最大长度为232 - 1个元素(4294967295,每个列表超过40亿个元素)。
从时间复杂度的视角来看Redis Lists的主要特性,支持头尾两端常量级插入和删除,甚至是数百万级别的元素插入。访问列表(list)的两端非常快,但是如果你尝试访问一个很大的列表(list),则比较慢,是一个O(n)级别的时间复杂度。
你可以用Redis List做很多有趣的事情,比如你可以:
模拟一个社交网络的时间线,使用 LPUSH添加新元素到用户的时间线中,并且使用 LRANGE 取回一些最近插入的项目。
你可以使用 LPUSH与 LTRIM 去创建一个永远不会超过给定数量,但只记住最近的N个元素的列表。
List 可以被用做消息队列,可以参见知名的Ruby库 Resque,用于做后台任务。
你可以用列表(list)做更多的事情,这个数据类型支持一系列命令,包括像BLPOP在内的阻塞命令。
想要获取更多信息,请查看 available commands operating on lists,或者阅读 introduction to Redis data types。
集合
Redis 集合(Set)是一个字符串的无序集合。它可以在O(1)的时间复杂度内新增、删除和检查成员是否存在(不管集合中包含了多少个元素都可以常量级时间)。
Redis集合(Set)拥有不允许添加重复成员的优秀特征。重复添加相同的的元素会导致集合中只有一个该元素的副本。实际上,也就是说添加成员之后不需要检查成员是否存在就可以继续添加。
关于Redis集合有一个非常有趣的事情是,它支持许多服务端的命令去计算已经存在的集合,因此你可以在很短的时间内完成集合的并集、交集、差集。
一个集合(set)最多可以有232-1个成员(4294967295,每个集合超过40亿个成员)
你可以用Redis集合(Set)做很多有趣的事情,比如你可以:
你可以使用Redis Set追踪一个唯一的事情。想知道访问一篇博客的所有唯一的IP地址?处理文章的访问时,每次仅需要简单的使用 SADD。重复的IP地址肯定不会被插入。
Redis集合(Set)非常善于表示关系。你可以用Redis创建一个标签系统来展示每个标签。你可以使用SADD命令将带有特定标记的所有对象的ID放到集合中。你想获取所有拥有三个不同标签的对象的所有的ID?只需要使用 SINTER。
你可以使用 SPOP 和 SRANDMEMBER 命令从集合(Set)中随机的获取元素。
同样,要获取更多信息可以参见full list of Set commands,或者阅读 introduction to Redis data types。
哈希
Redis哈希(Hash)是字符串字段和字符串值的映射,因此他们是展示对象的非常好的一种数据类型(比如:一个用户拥有像名字、姓氏、年龄等许多字段)。
HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000
一个拥有少量(少量的意思是最多100个左右)字段的哈希(hash)的存储空间非常小,因此你可以在一个小的Redis实例中存储数百万的对象。
虽然哈希(Hash)主要用于存储对象,但它也可以存储很多其他元素,因此你可以在很多别的任务中使用哈希。
每个哈希(Hash)可以存储多达232-1个键值对(超过40亿)。
查看full list of Hash commands获取更多信息,或者阅读introduction to Redis data types.
有序集合
Redis有序集合像Redis集合(Set)一样,保存不重复的字符串。不同的是每个有序集合(Sorted Set)关联一个用于排序的分数,从最小到最大。虽然成员是唯一的,但是分数却可以重复。
使用有序集合,你可以非常快的添加、删除、或者更新元素(时间复杂度在对数级别)。由于元素是按顺序进行的而不是之后再排序的,所以你还可以快速的按分数范围或者随机的方式来获取。访问一个有序集合的中间位置也非常的快,所以你可以使用有序集合作为一个元素不重复的灵巧的列表来使用,你就可以快速的访问到你需要的:按顺序访问元素、快速的检查是否存在,快速的访问中间的元素。
简而言之,你可以使用有序集合高效的做很多在其他类型的数据库无法建模的任务。
使用有序集合你可以:
做一个大型在线游戏的排行榜,每次有新的分数提交时,你可以用 ZADD更新它。你可以使用 ZRANGE获得排行靠前的玩家。你也可以使用 ZRANK获取给定名字的玩家的排名。同时使用ZRANK和ZRANGE你可以显示跟给定分数非常接近的玩家。都非常之快。
有序集合常用于给存储在Redis中的数据做索引。比如,你有许多用户的哈希,你可以讲年龄当作分数,用户ID作为值爆存在一个有序集合中。因此你就可以用ZRANGEBYSCORE快速的取回一个给定年龄段的所有的用户。
有序集合可能最高级的Redis数据类型,因此花一点时间查看所有命令 full list of Sorted Set commands去探索你可以用Redis做什么。或许你也可能想要阅读introduction to Redis data types。
位图 和 HyperLogLogs
Redis也支持位图(Bitmaps)和HyperLogLogs,它们是基于字符串的数据类型,但也都拥有自己的语义。
请参考introduction to Redis data types获取这些类型的信息。