《Redis官方文档》Data types—数据类型

原文链接

String类型(字符串类型)

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

在Redis中String有很多有趣的用法,比如:

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

查看String类型可用命令来获得更多信息,或者阅读Redis数据类型介绍一章。

 

Lists类型(列表类型)

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

LPUSH 命令是在头部加入一个新元素,RPUSH 命令是在尾部加入一个新元素。当在一个空的键值(key)上执行这些操作时会创建一个新的列表。类似的,当一个操作清空了一个list时,这个list对应的key会被删除。这非常好理解,因为从命令的名字就可以看出这个命令是做什么操作的。如果使用一个不存在的key调用的话就会使用一个空的list。

一些例子:

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

请查看lists类型可用命令来获得更多的信息,或者阅读Redis数据类型介绍一章

Sets类型(集合类型)

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

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

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

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

Redis Sets有很多有趣的用法,比如:

  • 你可以使用Redis Sets来记录唯一的事物,比如,你想知道访问某个博客的IP地址,不要重复的IP,这种情况只需要在每次处理一个请求时简单的使用SADD命令就可以了,可以确信不会插入重复的IP.
  • Redis Sets 可以很好的表示关系。你可以使用Redis创建一个标签系统,每个标签使用一个Set来表示。然后你可以使用SADD 命令把具有特定标签的所有对象的所有ID放在表示这个标签的Set中。如果你想要知道同时拥有三个不同标签的对象,那么使用SINTER命令就好了。
  • 你可以使用SPOP 或者 SRANDMEMBER 命令从集合中随机的提取元素。

查看Set可用命令获得更多信息,或者阅读Redis数据类型介绍一章

Hashes哈希类型

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

@cli
 HMSET user:1000 username antirez password P1pp0 age 34
 HGETALL user:1000
 HSET user:1000 password 12345
 HGETALL user:1000

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

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

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

查看Hash类型可用命令来获得更多信息,或者阅读Redis数据类型介绍一章

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

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

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

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

使用有序集合你可以:

  • 在大型在线游戏中创建一个排行榜,每次有新的成绩提交,使用ZADD命令加入到有序集合中。可以使用ZRANGE命令轻松获得成绩名列前茅的玩家,你也可以使用ZRANK根据一个用户名获得该用户的分数排名。把ZRANK 和 ZRANGE结合使用你可以获得与某个指定用户分数接近的其他用户。这些操作都很高效。
  • 有序集合经常被用来索引存储在Redis中的数据。比如,如果你有很多用户,用Hash来表示,可以使用有序集合来为这些用户创建索引,使用年龄作为Score,使用用户的ID作为Value,这样的话使用ZRANGEBYSCORE 命令可以轻松和快速的获得某一年龄段的用户。

有序集合可能是Redis中最高级的数据类型了,所以请花一些时间查看一下 有序集合命令列表 来获得更多信息,同时你可能也想阅读Redis数据类型介绍

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

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

请参考Redis数据类型介绍 获得这些类型的信息。 

时间: 2024-11-08 17:28:01

《Redis官方文档》Data types—数据类型的相关文章

《Redis官方文档》翻译邀请

并发编程网定期组织翻译官方指南,十一月组织翻译Redis官方文档, 官方地址,有兴趣的同学可以通过评论领取,每次领取一节,翻译完后再领取其他章节.如果翻译超过10篇文章,并发网会赠送一本作者签名的<JAVA并发编程的艺术>. 如何交稿?直接在并发网注册账号后点新建文章,参考我要投稿. 介绍 admin.md     (ethfoo领取) benchmarks.md   (looyup已领取) clients.md  (mircle123领取) cluster-spec.md  (carlvin

《Redis官方文档 》sentinel

原文链接 Redis Sentinel 文档 Redis Sentinel为Redis提供了高可用解决方案.实际上这意味着使用Sentinel可以部署一套Redis,在没有人为干预的情况下去应付各种各样的失败事件. Redis Sentinel同时提供了一些其他的功能,例如:监控.通知.并为client提供配置. 下面是Sentinel的功能列表: 监控(Monitoring):Sentinel不断的去检查你的主从实例是否按照预期在工作. 通知(Notification):Sentinel可以通

《Redis官方文档》Redis调试指南

原文链接      译者:Adeline Redis开发过程中十分注重其稳定性:我们尽一切努力来保证每一个版本的稳定,不出现突然崩溃等情况.但是即使在我们百分百的努力下,仍然没办法保证百分百的无bug. Redis出现崩溃时,会生成一个详细的报告来描述当时的情景,但是有时候只看报告还不够,而且Redis的核心开发团队可能也没办法独立重现你出现崩溃时候的场景:在这种情况下,我们需要用户能够重现这个情景来帮助我们. 这个指南讲解了如何使用GDB来获得Redis开发者可能用到的信息. GDB是什么?

《Redis官方文档》 FAQ

原文地址 译者:zivyu 为什么Redis与其他的k-v存储相比不一样 有两个主要的原因 redis在键-值数据库中是一个不同的发展方向,值可以包含更复杂的数据类型,同时许多原子操作定义在这些数据类型上.redis的数据类型和基本数据结构密切相关,没有额外的抽象层,同样对于程序员也是直接可见的. redis是一个在内存中但是可以持久化到磁盘上的数据库,所以它代表了一个不同的权衡,高速读写被实现,但是对数据集有限制,那就是不能大于内存的大小.在内存中的数据库还有另外的优点,内存中表示的复杂数据结

《Redis官方文档》Redis集群教程

原文链接 译文链接 译者: tiffany 这篇教程是Redis集群的简要介绍,而非讲解分布式系统的复杂概念.它主要从一个使用者的角度介绍如何搭建.测试和使用Redis集群,至于Redis集群的详细设计将在"Redis集群规范"中进行描述. 本教程以redis使用者的角度,用简单易懂的方式介绍Redis集群的可用性和一致性. 注意: 本教程要求redis3.0或以上的版本. 如果你打算部署redis集群,你可以读一些关于集群的详细设计,当然,这不是必须的.由这篇教程入门,先大概使用一下

《Redis官方文档》 Pipelining – 请求应答模式和往返延时

Redis是一个CS结构的TCP服务器,使用"请求-应答"的模式.,客户端发起一个请求是这样的步骤: 客户端发送一个请求给服务器,然后等待服务器的响应,一般客户端使用阻塞模式来等待服务器响应. 服务器收到请求并处理完毕后,发送结果给客户端. 举个例子,发送下面4个命令大概就是这样的顺序: 客户端发送: INCR X 服务器响应: 1 客户端发送: INCR X 服务器响应: 2 客户端发送: INCR X 服务器响应: 3 客户端发送: INCR X 服务器响应: 4 客户端和服务器通

《Redis官方文档》持久化

原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis 持久化 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格

《Redis官方文档》使用Redis作为LRU缓存

原文链接  译者:boyhou (WeChat:HouYongBo923) 如果你使用redis作为缓存,当添加新数据时,若有内存大小等限制,系统默认会根据一定的规则自动清理旧数据.这种处理方式在开发社区中众所周知,因为它也是非常流行的缓存系统 memcached 的默认处理方式. LRU(LRU全称是Least Recently Used,即最近最久未使用)实际上只是Redis支持的内存回收策略中的一种.这篇文章将要讲述Redis的 maxmemory 配置选项,该配置选项用来限制 Redis

《Redis官方文档》用Redis构建分布式锁

原文链接  译者:yy-leo   校对:方腾飞(红体标记重点) 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增加一点复杂的设计就可以获得更好的可靠性. 这篇文章的目的就是尝试提出一种官方权威的用Redis实现分布式锁管理器的算法,我们把这个算法称为RedLock,我们相信这个算法会比一般的普通方法更加安全可靠.我们也