redis-py使用入门(1)

一.获取redis-py

Redis官网提供了很多python语言的客户端(http://redis.io/clients#python),但最被广泛认可的客户端是redis-py。redis-py需要python 2.7以上版本,有关python的安装本书不会介绍,因为作为使用python语言的开发者来说这个无需介绍,主要来看一下如何获取安装redis-py,安装redis-py有三种方法:

第一:使用pip进行安装(推荐)

1
pip install redis

第二:使用easy_install进行安装

1
easy_install redis

第三:使用源码安装(以2.10.5版本为例子)

1
2
3
4
wget https://github.com/andymccurdy/redis-py/archive/2.10.5.zip
unzip redis-2.10.5.zip
cd redis-2.10.5
python setup.py install

二.redis-py的基本使用

redis-py的使用方法也比较简单,我们逐步骤介绍:

1.导入依赖库

1
import redis

2.生成客户端连接:

需要Redis的节点IP和端口两个参数。

1
client = redis.StrictRedis(host='127.0.0.1', port=6379)

3.执行命令

redis-py的API保留了Redis API的原始风格,所以使用起来不会有不习惯的感觉

1
2
client.set(key, "python-redis")
client.get(key)

整个实例代码如下:

1
2
3
4
5
6
7
import redis
client = redis.StrictRedis(host='127.0.0.1', port=6379)
key = "hello"
setResult = client.set(key, "python-redis")
print setResult
value = client.get(key)
print "key:" + key + ", value:" + value

输出结果为:

1
2
True
key:hello, value:python-redis

下面代码给出redis-py操作Redis五种数据结构的示例,输出结果写在了注释中:

(1).string
1
2
3
4
5
6
#输出结果:True
client.set("hello","world")
#输出结果:world
client.get("hello")
#输出结果:1
client.incr("counter")
(2).hash

hgetall返回的是字典类型:

输出结果:{‘f1’: ‘v1’, ‘f2’: ‘v2’}

1
2
3
4
5
6
7
8
client.hset("myhash","f1","v1")
client.hset("myhash","f2","v2")
dict = client.hgetall("myhash")
for key in dict.keys():
print key + ":" + dict[key]
for (key,value) in dict.items():
print key + ":" + value;
(3).list

lrange返回的是列表类型:
输出结果:[‘1’, ‘2’, ‘3’]

1
2
3
4
5
6
client.rpush("mylist","1")
client.rpush("mylist","2")
client.rpush("mylist","3")
client.lrange("mylist", 0, -1)
for item in list:
print item
(4).set

smembers返回的是set类型

输出结果:set([‘a’, ‘b’])

1
2
3
4
5
6
client.sadd("myset","a")
client.sadd("myset","b")
client.sadd("myset","a")
set = client.smembers("myset")
for item in set
print item
(5).zset

输出结果:[(‘james’, 33.0), (‘peter’, 66.0), (‘tom’, 99.0)]

1
2
3
4
5
6
client.zadd("myzset","99","tom")
client.zadd("myzset","66","peter")
client.zadd("myzset","33","james")
tupleList = client.zrange("myzset", 0, -1, withscores=True)
for tuple in tupleList:
print tuple[0] + ", score: " + str(tuple[1])

3 redis-py中pipeline使用

redis-py支持Redis的pipeline功能,下面将用一个简单的示例进行说明:

(1).引入依赖,生成客户端连接

1
2
import redis
client = redis.StrictRedis(host='127.0.0.1', port=6379)

(2). 生成pipeline:注意client.pipeline包含了一个参数,如果transaction=False代表不使用事务。

1
pipeline = client.pipeline(transaction=False)

(3). 将命令封装到pipeline中,此时命令并没有真正执行

1
2
pipeline.set("hello","world")
pipeline.incr("counter")

(4). 执行pipeline

1
2
#[True, 3]
result = pipeline.execute()

我们将用redis-py的pipeline功能来mdel的功能

1
2
3
4
5
6
7
import redis
def mdel( keys ):
client = redis.StrictRedis(host='127.0.0.1', port=6379)
pipeline = client.pipeline(transaction=False)
for key in keys:
print pipeline.delete(key)
return pipeline.execute();

除此之外,pipeline还支持链式写法

1
pipeline.get("counter").get("key").execute()

4. redis-py中的lua脚本使用

redis-py中执行lua脚本和redis-cli十分类似,redis-py提供了三个重要的函数实现lua脚本的执行。

1
2
3
eval(String script, int keyCount, String... params)
script_load(String script)
evalsha(String sha1, int keyCount, String... params)
(1). eval函数有三个参数,分别是
1
2
3
script: lua脚本内容
keyCount: key的个数
params: 相关参数KEYS和ARGV

以一个最简单的lua脚本为例子进行说明: get key

1
return redis.call('get',KEYS[1])

在redis-py中执行,方法如下:

1
2
3
4
5
import redis
client = redis.StrictRedis(host='127.0.0.1', port=6379)
script = "return redis.call('get',KEYS[1])"
#输出结果为world
print client.eval(script,1,"hello")
(2) scriptLoad和evalsha函数

script_load和evalsha函数要一起使用,首先使用script_load将脚本加载到Redis中,代码如下

1
scriptSha = client.script_load(script)

evalsha函数用来执行脚本的哈希值,它需要三个参数

1
2
3
scriptSha:脚本的哈希值,就是scriptLoad的结果。
keyCount: key的个数
params: 相关参数KEYS和ARGV

执行效果如下:

1
print jedis.evalsha(scriptSha, 1, "hello");

整个完整代码:

1
2
3
4
5
import redis
client = redis.StrictRedis(host='127.0.0.1', port=6379)
script = "return redis.call('get',KEYS[1])"
scriptSha = client.script_load(script)
print client.evalsha(scriptSha, 1, "hello");