Redis数据类型

2020年12月29日17:24:13 发表评论 38 次浏览

介绍

了解如何为你的项目选择正确的Redis数据类型以及原因。 Redis附带了几种有用的数据类型, 这可能使得很难决定使用哪种类型。

要求

  • 运行Linux(CentOS 7或Ubuntu 14.04)的云服务器
  • Redis已安装并正在运行。如果需要, 请参阅我们的有关在notlogy Linux云服务器上安装Redis的文章。

Redis数据类型概述

尽管你可能希望项目确定使用的数据类型, 但反之亦然:数据类型驱动项目。每种Redis数据类型都有其优点和缺点, 并且适合于特定类型的项目。

如果你有使用各种计算机语言的经验, 那么你将熟悉诸如"哈希"和"字符串"之类的术语。但是, Redis以你不期望的方式使用这些数据类型。

Redis是一个"键值存储", 而不是像MySQL或PostgreSQL这样的关系数据库。这意味着它存储基于密钥的数据, 而不存储其他任何数据。因此, 你选择的存储数据方式将对项目的行为方式以及与数据的交互方式产生重大影响。

有五种Redis数据类型:

  • String
  • 杂凑
  • list
  • 排序集

String

字符串是最简单的Redis数据类型。字符串将数据存储在键/值对中。

例子:

Key: "j doe"
Value: "07/20/2016 1:43PM"

字符串的最大大小为512 MB。你可以对字符串进行一些操作, 包括根据其在字符串中的位置来剪切, 删除或替换数据。

Redis允许你逐位使用字符串, 而无需在代码中进行任何额外的移位体操。这使字符串方便用于基本计数器, 通过ID号跟踪用户登录等操作。

能够使用单个位使用字符串也使它成为存储数据的紧凑方式。你可以在1.2MB的字符串中存储大约1000万个单位数据点。

杂凑

在Redis中, 哈希是键/值对的集合。哈希中的每个键和值都是一个字符串。

散列是存储大量小数据的绝佳方法。尽管散列可以支持超过40亿个键/值对, 但是Redis会优化相对较小的散列(那些散列少于100个字段)的效率。这使得使用较小的哈希值非常快。

例子:

Key: User ID
Value:
  "username" => "j doe"
  "address" => "123 Main St"
  "city" => "Anytown, USA"
  "email" => "jdoe@example.com"
  "last login date" => "07/20/2016 1:43PM"

list

Redis列表是键/值对, 其中值是项目的集合, 按其插入顺序排序。需要排队系统的程序员经常使用列表。你可以从列表的开头或结尾插入和删除内容, 并使用推入或弹出功能来移动队列。

Twitter可能是Redis列表功能的最著名示例。用户的" 10条最新推文"列表是一个列表。新的推文被推到列表的顶部, 最古老的推文被弹出。

例子:

Key: "jdoe_twitter"
Value: ["Never mind, I found it", "Did someone eat it? Rude!", "Has anyone seen my sandwich? I left it in the break room fridge."]

几分钟后, 用户发送更新。它被推到列表的最前面, 最旧的条目从末尾弹出:

Key: "jdoe_twitter"
Value: ["Oops, it wasn't mine. Sorry to whoever it belonged to, I owe you a sandwich.", "Never mind, I found it", "Did someone eat it? Rude!"]

集合是唯一字符串的集合。每个字符串在任何给定集中只能存在一次, 无论你将其添加多少次。

Redis集非常快, 这使它们成为检查集合中成员资格的绝佳方法。如果要从集合中随机删除或替换项目, 还可以执行几个有趣的随机函数。

例子:

Key: "administrators"
Value: ("jdoe", "alice", "bob")

Key: "banned users"
Value: ("evil_jdoe", "meanguy53", "i_am_a_troll")

套装通常用于创建简单的纸牌游戏。因为每个字符串都是唯一的, 所以你不必担心意外地将两张黑桃A牌交给了别人。而且随机功能非常适合打牌, 允许你发出随机卡, 洗牌, 将卡返回卡组等。

排序集

排序集是根据指定的分数对字符串进行排序的集。由于具有这些属性, 已排序的集通常用于排行榜, 以跟踪玩家在游戏中的得分或等级。

例子:

Key: "Leaderboard: Total Achievement Points"
Value: ("Jdoe" [2], "Alice" [43], "Bob" [3553])

鲍勃显然在这里领先。排行榜将在网站上显示为:

Bob: 3553 AP
Alice: 43 AP
Jdoe: 21 AP

假设爱丽丝完成了一项价值20分的成就。价值"爱丽丝" [63]被添加到排序后的集合中, 网站上的排行榜会立即进行相应的更新:

Bob: 3553 AP
Alice: 63 AP
Jdoe: 21 AP

分数可以重复, 但是每个字符串只能存在一次。如果你两次插入相同的字符串, 尽管它的得分将被设置为最近的条目, 但它将仅在集合中存在一次。

例如, 假设你将值" jdoe"插入排序得分为4的排序集中, 然后插入值" jdoe"但排序得分为7。值" jdoe"将保持唯一, 但排序分数将会改变。因此, 这具有将" jdoe"的分数更新为7的效果。

一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: