《Redis入门指南》一5.2 Ruby与Redis-阿里云开发者社区

开发者社区> 异步社区> 正文

《Redis入门指南》一5.2 Ruby与Redis

简介:
+关注继续查看

本节书摘来异步社区《Redis入门指南》一书中的第5章,第5.2节,作者: 李子骅 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

5.2 Ruby与Redis

Redis入门指南
Redis官方推荐的Ruby客户端是redis-rb1,也是各种语言的Redis客户端中最为稳定的一个。其主要代码贡献者就是Redis的开发者之一Pieter Noordhuis。

5.2.1 安装

使用gem install redis安装最新版本的redis-rb,目前的最新版本是3.0.2。

5.2.2 使用方法

创建到Redis的连接很简单:

require 'redis'
redis = Redis.new

该行代码会默认Redis的地址为127.0.0.1,端口为6379。如果需要更改地址或端口,可以使用:

redis = Redis.new(:host => '127.0.0.1', :port => 6379)

redis-rb的官方文档相对比较详细,所以具体的使用方法可以见其GitHub主页。这里从其中挑出几个比较有代表性的命令作为示例:

r.set('redis_db', 'great k / v storage') # => OK
r.get('redis_db')               # => "great k / v storage"
r.incrby('counter', 99)           # => 99
r.hmset('hash_dt', :key2, 'value2', :key3, 'value3') # => OK

5.2.3 简便用法

redis-rb最便捷的命令调用方法就是对SET和GET命令使用别名[],例如:

redis.set('key', 'value')
可以写成

redis['key'] = 'value'
同样

value = redis.get('key')
可以写成

value = redis['key']

另外,对于事务的返回值可以提前设置对结果的引用,就像这样:

redis.multi do
   redis.set('key', 'hi')
   @value = redis.get('key')
   redis.set('key', '2')
   @number = redis.incr('key')
end

p @value.value # 输出"hi"
p @number.value # 输出3

5.2.4 实践:自动完成

现在很多网站都有标签功能,用户可以给某个项目(如文章、图书等)添加标签,也可以通过标签查询项目。在很多时候,我们都希望在用户输入标签时网站可以自动帮助用户补全要输入的标签,如图5-1所示。


5_1

这样做一是可以节约用户的输入时间,二是在创建标签时可以起到规范标签的作用,避免用户输入标签时可能出现的拼写错误。

下面介绍两种在Redis中实现补全提示的方法,并会挑选一种用Ruby来实现。

第一种方法:为每个标签的每个前缀都使用一个集合类型键来存储该前缀对应的标签名。如“ruby”的所有前缀分别是“r”、“ru”和“rub”,我们为这3个前缀对应的集合类型键都加入元素“ruby”。

当有“ruby”和“redis”两个标签时Redis中存储的内容如图5-2所示,用户输入“r”时就可以通过读取键“prefix:r”来获知以“r”开头的标签有“ruby”和“redis”两个。


5_2

这时就可以将这两个标签提示给用户了。更进一步,我们还可以存储每个标签的访问量,使得我们可以利用SORT命令配合BY参数把最热门的标签排在前面。

第二种方法通过有序集合实现,该方法是由Redis的作者Salvatore Sanfilippo介绍的。

3.6 节介绍过有序集合类型有一个特性是当元素的分数一样时会按照元素值的字典顺序排序,利用这一特性只使用一个有序集合类型键就能实现标签的补全功能,准备过程如下。

(1)首先把每个标签名的所有前缀作为元素存入键中,分数均为0;

(2)将每个标签名后面都加上“*”符号并存入键中,分数也为0。

准备过后的存储情况如图5-3所示。


5_3

由于所有元素的分数都相同,所以该有序集合键中的项目相当于全部按照字典顺序排序(即图5-3所示的顺序)。这样当用户输入“r”时就可以按照如下流程获取要提示给用户的标签:

获取“r”的排名:ZRANK autocomplete r,在这里的返回值是0;

获取“r”之后的N个元素,如当N=100时:ZRANGE autocomplete 1 101。 N的取值与标签的平均长度和需要获得的标签数量有关,可以根据实际情况自由调整;

遍历返回的结果,找出其中以""结尾的且以“r”开头的元素。此时将“”去掉后就是我们需要的结果了。

下面我们写一个小程序来作为示例,程序启动时会从一个文本文件中读取所有标签列表,然后接收用户输入并返回相应的补全结果。

文本文件的样例内容如下:

我的中国心
我的中国话
你好吗
我和你
你一路走来
你从哪里来

当用户输入“我的”时程序会打印如下内容:

我的中国心
我的中国话

具体的实现方法是,首先我们定义一个函数来获得标签的前缀(包括标签加上星号):

# 获得标签的所有前缀
#
# @example
#  get_prefixes('word')
#   # => ['w', 'wo', 'wor', 'word*']
def get_prefixes(word)
 Array.new(word.length) do |i|
  if i == word.length - 1
   "#{word}*"
  else
   word[0..i]
  end
 end
end

接着我们加载redis-rb,并建立到Redis的连接:

require 'redis'
# 建立到默认地址和端口的Redis的连接
redis = Redis.new

为了保证可以重复运行此程序,我们需要删除之前建立的键以免影响本次的结果:

redis.del('autocomplete')
下面是准备阶段,程序从words.txt文件读取标签列表,并获得每个标签的前缀加入到有序集合键中:

argv = []
File.open('words.txt').each_line do |word|
  get_prefixes(word.chomp).each do |prefix|
   argv << [0, prefix]
  end
end
redis.zadd('autocomplete', argv)
redis-rb 的 zadd 函数支持两种方式的参数:当只加入一个元素时使用 redis.zadd(key, score, member),当同时加入多个元素时使用redis.zadd(key, [[score1, member1], [score2, member2], …])上面的代码使用的是后一种方式。

最后一步我们通过循环来接收用户的输入并查询对应的标签:

while prefix = gets.chomp do
  result = []
  if (rank = redis.zrank('autocomplete', prefix))
   # 存在以用户输入的内容为前缀的标签
   redis.zrange('autocomplete', rank + 1, rank + 100).each do |words|
    # 获得该前缀后的100个元素
    if words[-1] == '*' && prefix == words[0..prefix.length - 1]
     # 如果以"*"结尾并以用户输入的内容为前缀则加入结果中
     result << words[0..-2]
    end
   end
  end
  # 打印结果
  puts result
end

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8993 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2878 0
Redis入门指南
随着互联网业务对性能需求日益强烈,作为Key/Value存储的Redis具有数据类型丰富和性能表现优异的特点。如果能够熟练地驾驭它,不管是把它用做缓存还是存储,对很多大型应用都很多帮助。新浪作为世界上最大的Redis使用者,体会到了Redis为高并发在线业务带来的好处,但同时也遇到了很多挑战,新浪为推动Redis这种NoSQL产品在中国互联网产品技术架构中的使用做出了卓越的贡献。
1124 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10706 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12677 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11464 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6822 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
21801 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载