redis: 数据类型

字符串

字符串是Redis最基本的数据类型。Redis的字符串是二进制安全的,意味着一个Redis字符串可以包含任何类型的数据,比如:JPEG图片或者序列化的Ruby对象。

字符串的值的最大长度可达512MB。

你可以使用Redis字符串做一些有趣的事情,比如:

  • 在INCR系列的命令中: INCR, DECR, INCRBY 使用字符串做原子计数器。
  • 使用 APPEND命令追加字符串。
  • GETRANGESETRANGE 来实现一个字符串随机访问向量。
  • 在一个小空间编码大量数据,或者使用 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 取回一些最近插入的项目。

  • 你可以使用 LPUSHLTRIM 去创建一个永远不会超过给定数量,但只记住最近的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

  • 你可以使用 SPOPSRANDMEMBER 命令从集合(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获取这些类型的信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容