关灯
护眼 字体:大
中
小
上一章
章节列表
下一页
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提示您,本章没有阅读完,点击下一页进入下一页阅读!
上一章
章节列表
下一页