首页

第9章 Redis的高级数据结构

关灯 护眼    字体:

上一章 章节列表 下一页


Redis有着丰富的数据结构,一些功能天然就适合使用Redis来开发。本章将介绍Redis中几个比较高级的数据结构和应用。



9.1 哈希表的功能和应用


哈希表(Hash Table)是一种数据结构,它实现了“键-值”(Key-Value)的映射。根据Key就能快速找到 Value。并且,无论有多少个键值对,查询时间始终不变。Python 的字典就是基于哈希表实现的。

在Redis中也有一个数据结构叫作哈希表。

在Redis中,使用哈希表可以保存大量数据,且无论有多少数据,查询时间始终保持不变。Redis的一个哈希表里面可以储存232 ─1(约等于43亿)个键值对。



9.1.1 实例31:使用Redis记录用户在线状态


现在,一些论坛网站能够显示用户当前是在线状态还是离线状态。那这个功能是怎么实现的呢?其中一种实现方法就是基于Redis来实现。

实例描述

分别使用字符串和哈希表记录用户的在线信息,并比较在这个场景下哈希表相对于字符串有什么优势。

1.使用字符串记录用户的在线状态

程序的逻辑非常简单,包括以下几个步骤:

(1)用户登录时,在Redis中添加一个字符串,Key为用户账号,Value为1。

(2)用户退出网站时,从Redis中删除账号名对应的Key。

(3)查询时,程序尝试从Redis中获取用户账号对应的字符串:如果值为1,则表示“在线”;如果值为None,则表示“不在线”。

完整的查询代码如下:

代码9-1 使用Redis字符串记录用户在线信息

其中,主要代码说明如下。

● 第3行代码:连接本地的Redis。

● 第12行代码:使用用户帐号作为Key,在Redis中设置字符串。

● 第21行代码:从Redis中删除Key为用户账号的字符串。

● 第30行代码:从Redis中获取Key为用户帐号的字符串的值。如果这个字符串存在,则返回里面的值(在第12行设置的1);如果Redis没有这个Key,则返回None。

● 第31~33行代码:根据返回的值进行判断。如果返回1,则说明用户现在在线;否则说明用户现在不在线。

整个逻辑过程非常简单而直观。功能也正常,看起来没有什么问题。

2.使用字符串保存在线状态的弊端

现在有10个账号同时在线,当对 Redis 执行列出所有 Key 的操作以后,看到的结果如图9-1所示。

如果有1000个用户同时在线,则Redis列出所有Key后的结果如图9-2所示。

图9-1 10个用户同时在线时的Redis Key

图9-2 1000个用户同时在线的Redis Key

有多少个用户在线,就有多少个Key。

现在,网站又加入了一个积分机制。每个用户都有一个积分数据,由于这个数据需要经常查询和修改,因此也使用Redis来保存。显然,如果使用用户账号作为Key,积分作为Value,现在Redis看起来也没有什么问题。

那问题来了,在线信息使用用户账号作为 Key,积分信息也使用账号作为 Key,这不就冲突了吗?

于是有人给不同的 Key 加上了后缀。例如,记录用户是否在线,使用的 Key 为“账号:online”。如果用户账号为10032,那他的在线状态Key就是“10032:online”。记录用户积分的Key为“账号:score”,例如用户10032对应的积分Key为“10032:score”。

提示:

在Redis中,Key中的冒号就是普通的字符,用来分割前缀和后缀,没有什么特殊意义。写成“10032_online”或者“10032-score”效果完全一样。

这样一来,假如有一万个用户同时在线,可能会在Redis中出现2万个Key,或者更多。

3.使用哈希表记录用户在线状态

使用哈希表来记录用户在线状态,只需要1个Key。若要记录用户的积分信息,则再加一个Key。原来用字符串时需要2万个Key实现的功能,现在使用哈希表只需要两个Key就能解决。

提示:

哈希表与字符串的不同之处——哈希表在Key里面还有“字段”的概念。“字段”下面才是“值”。即一个哈希表的Key里面可以设置成百上千个键值对。

查询用户在线状态的小程序,如果使用哈希表来重构,则代码如下:

代码9-2 使用哈希表记录用户在线状态



其中,主要代码说明如下。

● 第12行代码:向Redis中名为user_online_status的哈希表中添加一个字段,字段名为用户账号,值为1。如果不存在名为user_online_status的哈希表,则自动创建一个。

● 第21行代码:从Redis中名为user_online_status的哈希表中删除一个字段,字段名为用户账号。

● 第30行代码:检查名为user_online_status的哈希表中是否有某个特定的字段,如果没有这个字段就返回False,如果有这个字段就返回True。

使用哈希表来保存1000个用户在线状态,运行效果如图9-3所示。

列出Redis中的所有Key,可以看到1000个用户在线状态都储存在名为user_online_status这个Key里面。

列出这个Key中的所有键值,可以看到,在Redis命令行交互界面里面,输出结果是按照“Key-Value-Key-Value”的间隔顺序输出的。

图9-3 使用哈希表保存1000个用户在线状态

使用哈希表不仅可以减少Redis的个数,还能优化储存空间。Redis官方就特别说明,哈希表对存储结构进行过特殊的优化,储存相同的内容,占用的内存比字符串要小很多。

提示:

著名图片社区Instag
m.qiduwx.com提示您,本章没有阅读完,点击下一页进入下一页阅读!

上一章 章节列表 下一页