python redis 操作

󰃭 2016-04-12

redis server安装

我用的ubuntu

 sudo apt-get install redis-server

安装完成后就会启动一个redis 服务, 默认端口6379, 配置文件路径是/etc/redis/redis.conf,有必要的时候对服务的配置进行修改

比如, 默认的配置绑定了本地ip 127.0.0.1 即不允许远程连接redis-server, 我们将配置中的

bind 127.0.0.1

改成

bind 0.0.0.0

即可允许任意远程连接

安装python redis 模块

sudo pip install redis

如果无法安装成功, 可能是无法连接pipy的国外源, 可以指定国内的源, 比如douban, 就可以快速安装成功

sudo pip install redis -i http://pypi.douban.com/simple

实践

打开解释器终端, 这里我使用ipython

import redis
r_con = redis.Redis("127.0.0.1",6379) #连接redis 服务

key-value 存取

r_con.set("name", "Yi_Zhi_Yu") #True
r_con.get("name") #'Yi_Zhi_Yu'

这是最近本的键值存取

r_con.append("name","Tony Wang") #18L
r_con.get("name") # 'Yi_Zhi_YuTony Wang'

append 会往一个已有key的value拼接字符串, 并返回新的value长度, 如果key不存在,则创建之, 并赋值value, 返回key的value长度

队列

redis 可以作为队列服务器, 对并发的写入操作进行有序处理

r_con.lpush("names", "Yi_Zhi_Yu") #1L
r_con.lpush("names", "Tony") # 2L
r_con.lpush("names", "Wang") # 3L

每次的push 都会返回队列长度,如 1L,2L(L表示long类型的整数)

或者通过llen 获取队列长度

r_con.llen("names") #3

从队列中依次获取队列的消息

r_con.rpop("names") #"Yi_Zhi_Yu"
r_con.rpop("names") #"Tony"
r_con.rpop("names") #"Wang"

如上是一种先进先出的队列操作, 实际上, 上面的lpushrpop 中的push和pop 都带了表示方向的前缀,即lr, 将队列想象为一根管子 “L ========= R”, lpush 就表示从L端写入, rpop就表示从R端读取, 所以可以举一反三, 还有rpush, lpop, 其队列的存取也根据前缀一目了然

队列操作还有带"x“的函数, 比如lpushx,rpushx , 与对应的lpushrpush 区别只是前者不会往不存在的队列里推消息,而后者则会创建并推入消息

还有redis可以从一个队列里获取消息, 然后写入另一个队列, rpoplpush, 这里就不做说明了

数据库大小

r_con.dbsize() #2L

dbsize 会返回redis 数据库中已有的keys的数量, 我们可以通过keys 来验证

r_con.keys() #['name', 'names']

删除key

r_con.delete("names") #1

删除keys(允许多个key)的值,成功返回1, 失败返回0

自增(incr)和自减(decr)

对一个数值类型的值进行自增和自减, 常用语页面点击量等动态数据统计用

r_con.set("click",1) #True
r_con.incr("click") #2
r_con.incr("click",1) #3
r_con.incr("click",5) #8

第二个参数可以用于指定步进值

decrincr正好相反

ping

通过ping, 可以验证客户端与服务端的连接情况, 如果连接正常, 就返回True, 如果连接断了, 则会抛出一个ConnectionError

expire

key设置一个过期时间, key存在返回True, 不存在返回False

r_con.set("name","test") #True
r_con.expire("name", 10) #True

10s 内可获取name的value 10s 后就不可获取了

此外还有一个expireat可以设置在具体的时间点作为过期时间, 可以理解为expire at, 接受一个timestamp或者datetime 作为过期时间点的参数

exists

判读key是否存在

r_con.set("name","test") #True
r_con.expire("name", 10) #True
r_con.exists("name") #True

10s 后

r_con.exists("name") #False

flush 操作

表示删除数据库中的keys 有两种, 一种是删除当前数据库的,使用flushdb 还有一种是删除当前主机上的keys, 使用flushall

待续