前面学习了使用Redis来构建应用程序的基本方法以及所需的工具,本章将会学习更多更有用的工具和技术,并使用它们去构建更具规模的Redis应用。现在模拟一个场景,假设有一家叫Fake Game的游戏公司,每天都有好几百万玩家同时在线游戏。代码示例依然位于redis-sample项目的support模块中。
自动补全
在Web领域,自动补全功能大家已经很熟悉了,下面我们用Redis来实现两种自动补全功能,自动补全联系人和通讯录自动补全。
自动补全最近联系人
本节将实现一个用于记录最近联系人的自动补全程序,使用列表记录用户最近联系过的100位玩家。构建最近联系人自动补全列表通常需要对Redis执行如下操作:
- 添加或者更新一个联系人
- 如果指定的联系人已经存在,那么从列表中移除他
- 将指定的联系人添加到最近联系人列表的最前面
- 对列表进行修剪,只保留列表最前面100位联系人
- 移除指定联系人
- 获取自动补全列表并查找匹配的用户
|
|
通讯录自动补全
在前面的自动补全例子中,Redis主要用于记录联系人列表,而非实际地执行自动补全操作。对于比较短的列表来说,这种做法还算可行,但对于非常长的列表来说,仅仅为了找几个元素而获取成千上完个元素,是一种非常浪费的做法。所以必须直接在Redis内部完成查找匹配元素的工作。下面以邮件补全功能为例,假设允许玩家向同一公会的其他玩家发邮件。这里利用有序集合,并且将分值都设为0来存储公会人员邮件列表,当有序集合的分值相同时,有序集合将按照字符串二进制顺序进行排序。为了方便起见,有序集合中的名字只能包含小写英文字母。
生成匹配范围前缀:
加入、退出公会:
匹配给定前缀列表:
以上例子是通过向有序结合添加元素来创建查找范围,并在取得范围内的元素之后移除之前添加的元素来实现的,这是一种非常有用的技巧,可以用到任何已排序索引上面。不知道是不是因为本人的语言理解能力不行,在看代码之前,一大片文字看下来不知所云,很多时候这一章节就被烦躁地跳过了。此时就要静下心来,一行行debug代码,观察下Redis数据结构的变化,就豁然开朗。上面的代码片段用到了watch命令,随着负载的增加,程序进行重试的次数可能会越来越多,导致资源被白白浪费,下面一节我们将学习下如何通过锁来减少对watch命令的使用。