[译]Redis Cookbook(2)

原创
2016/08/17 09:57
阅读数 64

在这一章里,我们一起来了解Redis的几种连接方式。先从最简单的命令行客户端redis-cli开始,再到如何把它跟常用的编程语言集成起来,如Ruby和Python。

从命令行使用Redis

问题

        你可能经常要向Redis发起一些简单的查询请求,可能是设置或改变一个变量,冲刷数据库,或者查看一下数据。这些都可以直接通过命令行来完成。

解决方案

        Redis自带了一个命令行客户端:redis-cli。Redis-cli是一个功能完善的交互客户端,它支持行编辑,操作历史和自动完成。在命令前加help,可以看到关于如何使用该命令的帮助。可以通过redis-cli连接本地或远程的redis服务器。把命令作为参数传给它,命令就会被执行。当然它也可以在交互模式下使用。

讨论

    获取命令列表:

redis-cli -h

    在交互模式下连接到远程服务器:

redis-cli -h serverip

    在交互模式下连接到本地的一个运行在非默认端口的服务器:

redis-cli -p 6380

    连接到本地的服务器,执行INFO命令并返回:

redis-cli INFO

    使用管道跟输出重定向进行更强大的交互:

cat command_list.txt | redis-cli > command_output.txt

    

在Python里使用Redis

问题

    用Python访问和操作Redis数据。

解决方案

    安装Andy McCurdy的redis-py。可以通过pip,easy_install安装,或者从源码编译安装。

讨论

    pip和easy_install让安装redis-py变得很简单,只需要几个命令就可以完成。让我们一起来看看如何通过pip安装redis-py:

pip install redis-py

    如果你使用的是easy_intall,命令看起来是这样的:

easy_install redis

    接下来,要在Python里使用Redis只需要简单的几步,导入redis模块依赖,连接到服务器,执行redis命令。请看下面的例子:

>>> import redis
>>> redis = redis.Redis(host='localhost', port=6379, db=0) 
>>> redis.smembers('circle:jdoe:soccer') set(['users:toby', 'users:adam',  'users:apollo', 'users:mike'])
>>> redis.sadd('circle:jdoe:soccer', 'users:fred') True
>>> redis.smembers('circle:jdoe:soccer') set(['users:toby', 'users:adam', 'users:apollo', 'users:mike', 'users:fred'])

    为了得到更好的性能,可以加入Hiredis。Hiredis是Redis的作者用C语言写的一个客户端包,需要安装Python适配器把它集成到redis-py里。可以通过pip或easy_install来安装适配器:

pip install hiredis

或者用easy_install:

easy_install hiredis

redis-py会自动检测适配器,然后通过Hiredis与服务端进行交互,速度要比之前快。

通过Jedis在Java里使用Redis

问题

你要用Java或其它JVM语言来访问和操作Redis数据。

解决方案

使用Jonathan Leibiusky的Jedis。

讨论

如果你在使用Maven,那么可以直接添加一个依赖到项目里:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.0.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

    如果没有,可以从项目主页上下载可以直接使用的jar包。

    接下来,在代码里导入类依赖:

import redis.clients.jedis.*;

    然后就可以完成其它步骤:

Jedis jedis = new Jedis("localhost");
jedis.set("foo", "bar");
String value = jedis.get("foo");
jedis.rpush("list", "element");
int length = jedis.llen("list").intValue();
String element = jedis.lpop("list");

    Jedis支持Redis的所有命令,还加入了分片机制和连接池。如果你在多线程环境下,一定要使用JedisPool访问同一个Redis连接,因为Jedis对象不是线程安全的。

在Ruby里通过redis-rb访问Redis

问题

    在Ruby里访问和操作Redis数据。

解决方案

    使用官方的redis-rb客户端访问和操作Redis数据。

讨论

    redis-rb是由Ezra Zygmuntowicz创建的一款功能完善的用Ruby写的Redis客户端。要在Ruby里使用它,需要先用gem install redis命令来安装,然后就可以用它操作Redis里的数据了。可以直接通过交互式的Ruby命令行来验证redis-rb是否安装正确:

> require 'rubygems'
=> true
> require 'redis'
=> true

    如果在请求Redis包的时候返回true,那么说明安装好了。有了redis-rb,使用Ruby语法调用Redis方法变得很容易。这里有一些使用set,get和smembers命令的例子。我们从初始化Redis类来连接Redis服务器开始:

> r = Redis.new    
=> #<Redis client v2.2.0 connected to
redis://127.0.0.1:6379/0 (Redis v2.2.11)>
> r.set 'hellofoo','hellobar'
=> "OK"
> r.get 'hellofoo'
=> "hellobar"
> r.sadd 'parkdogs', 'fido'
=> true
> r.sadd 'parkdogs', 'rudolph'
=> true
> r.sadd 'parkdogs', 'rex'
=> true
> r.smembers 'parkdogs'
=> ["rex", "rudolph", "fido"]

    为了简便,我们忽略了irb的一些输出。

    我们可以看到,在Ruby脚本里访问Redis是件很简单的事情。接下来,我们一起来看看如何在一个Rails应用里使用我们之前学到的东西。

通过RoR使用Redis

问题

    在RoR应用里存储和访问Redis数据。

解决方案

    在RoR应用里通过redis-rb访问和操作Redis数据。

讨论

    如果你已经有一个RoR应用,可以直接往里面添加Redis依赖,在Gemfile增加一行:

gem 'redis'

    然后在config/initializers目录创建一个文件,在文件里创建一个构造器让你的应用连接到Redis服务器:

$redis = Redis.new

    这行代码创建了一个叫$redis的全局变量,你可以用它来执行Redis命令。你可以给Reids.new方法传递:host和:port参数,告诉它连接到特定的服务器和端口,而不是使用默认的localhost:6379。redis-rb也允许你通过传递:path参数来使用Unix socket连接到Redis服务器。

    完成以上两个步骤,就可以在RoR应用里使用Redis了。在Rails控制台访问$redis变量可以验证之前的步骤是否正确,运行命令:

rails console

    然后就可以使用Redis命令设置或者获取键,哈希,集合和列表。

在ActiveRecord模型里添加Redis功能支持

    假设有一个User和Book模型,你想使用Redis集合来存储用户所拥有的书本,这样可以很容易地做一些特定的操作,比如查看用户们共同拥有的书本。你可以这样来实现User模型:

class User < ActiveRecord::Base
def books
b = $redis.smembers("books:#{self.id}")
Book.where :id=> b
end
def addbook(book)
$redis.sadd("books:#{self.id}", book.id)
end
def delbook(book)

$redis.srem("books:#{self.id}", book.id)
end
def common(user)
c = $redis.sinter("books:#{self.id}", "books:#{user.id}")
Book.where :id=> c
end
end

    接下来,我们可以很容易地在应用程序里或者Rails控制台使用这个方法。可以使用User.first.books获取第一个用户的书本列表,或者用User.first.addbook(Book.first)把第一本书添加到数据库的User集合里。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部