本文基于Redis 6.0.9版本,前提至少 Redis 3.0或更高版本。

目录

1.数据类型

1.1.String

1.2.List

1.3.Set

1.4.Hash

1.5.Sorted set

1.5.Bitmaps和HyperLogLogs


1.数据类型

1.1.String

String是Redis值中最基本的一种。 Redis String是二进制安全的,这意味着Redis String 可以包含任何类型的数据,例如JPEG图像或序列化的Ruby对象。

一个String的值的最大长度为512 MB。

你可以使用Redis中的string来做很多有趣的事情,例如,你可以:

  • 使用INCR系列中的命令将String用作原子计数器:INCR, DECR, INCRBY.。
  • 使用APPEND命令追加到String。
  • 使用String作为带有GETRANGE和SETRANGE的随机访问向量。
  • 在很小的空间内编码大量数据,或使用GETBIT和SETBIT创建支持Redis的Bloom Filter。

检查所有可用的字符串命令以获取更多信息。

1.2.List

Redis列表只是字符串列表,按插入顺序排序。 可以将元素添加到Redis列表中,从而将新元素推到列表的头部(左侧)或尾部(右侧)。

LPUSH命令在头上插入一个新元素,而RPUSH命令在头上插入一个新元素。 针对空键执行此操作之一时,将创建一个新列表。 同样,如果列表操作将清空列表,则将键从键空间中删除。 这些是非常方便的语义,因为如果使用不存在的键作为参数调用,则所有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)

列表的最大长度为232-1个元素(4294967295,每个列表超过40亿个元素)。

从时间复杂度的角度来看,Redis列表的主要功能是支持恒定时间插入和删除头部和尾部附近的元素,即使有数百万个插入项也是如此。在列表的极端附近,访问元素的速度 非常快,但是如果你尝试访问一个很大的列表的中间,则访问元素的速度会很慢,因为这是O(N) 操作。

你可以使用Redis Lists做很多有趣的事情,例如,你可以:

  • 在社交网络中对时间轴建模,请使用LPUSH以便在用户时间轴中添加新元素,并使用LRANGE来检索一些最近插入的项目。
  • 你可以将LPUSH与LTRIM一起使用,以创建一个列表,该列表从不超过给定数量的元素,而只记住最新的N个元素。
  • 列表可用作消息传递原语,例如,参见众所周知的用于创建后台作业的Resque Ruby库。
  • 你可以使用列表做更多的事情,此数据类型支持许多命令,包括阻塞命令,例如BLPOP。

请检查列表上所有可用的命令以获取更多信息。

1.3.Set

Redis集是字符串的无序集合。 可以在O(1) 中添加,删除和测试成员的存在(恒定时间,与Set中包含的元素数量无关)。

Redis集具有不允许重复成员的理想属性。 多次添加同一元素将导致集合具有该元素的单个副本。 实际上,这意味着添加成员不需要检查是否存在然后添加操作。

关于Redis集的一个非常有趣的事情是,它们支持许多服务器端命令来从现有集开始计算集,因此你可以在很短的时间内完成集的相交,交集,差集。

集合中的最大成员数为

-1(4294967295,每个集合中的成员超过40亿)。

你可以使用Redis集来做很多有趣的事情,例如,你可以:

  • 你可以使用Redis Set来跟踪独特的事物。 想知道访问给定博客帖子的所有唯一IP地址吗? 每次处理页面视图时,只需使用SADD。你确定不会插入重复的IP。
  • Redis Set很好地表示关系。 你可以使用Set代表每个标签,使用Redis创建标签系统。 然后,你可以使用SADD命令将具有给定标签的所有对象的所有ID添加到代表该特定标签的Set中。 你是否希望所有对象的所有ID同时具有三个不同的标签? 只需使用SINTER。
  • 你可以使用Set使用SPOP 或SRANDMEMBER命令随机提取元素。

 

与往常一样,查看Set命令的完整列表以获取更多信息。

1.4.Hash

Redis Hash是字符串字段和字符串值之间的映射,因此它们是表示对象的理想数据类型(例如,具有多个字段(例如姓名,姓氏,年龄等)的User):

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

具有几个字段的Hash(很少意味着最多一百个左右)以一种占用很少空间的方式存储,因此你可以在小型Redis实例中存储数百万个对象。

尽管Hash主要用于表示对象,但是它们能够存储许多元素,因此你也可以将Hash用于许多其他任务。

每个哈希最多可存储

-1个field-value对(超过40亿个)。

查看Hash命令的完整列表以获取更多信息。

1.5.Sorted set

与Redis Set类似,Redis Sorted set是非重复的String集合。 区别在于,Sorted set的每个成员都与得分相关联,该得分用于从最小到最大得分中获取排序的Sorted set。 虽然成员是唯一的,但分数可能会重复。

使用Sorted set,你可以非常快速地添加,删除或更新元素(与元素数量的对数成正比的时间)。 由于元素是按顺序进行的,而不是随后进行排序的,因此你还可以非常快速地按分数或按排名(位置)获得范围。 访问Sorted set的中间位置也非常快,因此你可以将Sorted set用作非重复元素的智能列表,从中可以快速访问所需的所有内容:元素有序,快速存在测试,对中间元素的快速访问 !

简而言之,使用Sorted set,你可以执行许多性能出色的任务,而这些任务实际上很难在其他类型的数据库中建模。

使用Sorted set,你可以:

  • 在大型在线游戏中排行榜,每次提交新分数时,你就可以使用ZADD进行更新。 你可以轻松地使用ZRANGE吸引顶级用户,也可以在给定用户名的情况下使用ZRANK返回其在列表中的排名。 一起使用ZRANK和ZRANGE可以向用户显示分数与给定用户相似的分数。 一切都很快。
  • Sorted set通常用于索引Redis中存储的数据。 例如,如果你有许多代表用户的哈希,则可以使用一个排序的集合,其中元素以用户的年龄作为得分,而用户的ID作为值。 因此,使用ZRANGEBYSCORE检索具有给定年龄段的所有用户将非常简单快捷。

Sorted Sets可能是最高级的Redis数据类型,因此花一些时间检查Sorted Set命令的完整列表,以发现可以使用Redis做什么!

1.5.Bitmaps和HyperLogLogs

Redis还支持Bitmaps 和HyperLogLogs,它们实际上是基于String基本类型的数据类型,但是具有自己的语义。