Python—redis
一、redis
redis 是一个 key-value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set -- 有序集合) 和 hash(哈希类型)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从) 同步。
Redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了 memcached 这类 key/value 存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便,Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得 Redis 可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布 / 订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。
二、python 操作 redis
1、连接方式
redis-py 提供两个类 Redis 和 StrictRedis 用于实现 Redis 的命令,StrictRedis 用于实现大部分官方的命令,并使用官方的语法和命令,Redis 是 StrictRedis 的子类
#!/usr/bin/env python # -*- coding:utf-8 -*- import redisr = redis.Redis(host='192.168.0.110', port=6379,db=0)
r.set('name', 'zhangsan') #添加
print (r.get('name')) #获取
2、连接池
redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销。默认,每个 Redis 实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池。
#!/usr/bin/env python # -*- coding:utf-8 -*- import redispool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('name', 'zhangsan') #添加
print (r.get('name')) #获取
3、操作
4、管道
redis-py 默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用 pipline 实现一次请求指定多个命令,并且默认情况下一次 pipline 是原子性操作。
#!/usr/bin/env python # -*- coding:utf-8 -*- import redis pool = redis.ConnectionPool(host='192.168.0.110', port=6379) r = redis.Redis(connection_pool=pool)pipe = r.pipeline(transaction=True)
r.set('name', 'zhangsan')
r.set('name', 'lisi')pipe.execute()
5、发布和订阅
首先定义一个 RedisHelper 类,连接 Redis,定义频道为 monitor,定义发布 (publish) 及订阅 (subscribe) 方法。
#!/usr/bin/env python #-*- coding:utf-8 -*- import redisclass RedisHelper(object):
def init(self):
self.__conn = redis.Redis(host='192.168.0.110',port=6379)#连接 Redis
self.channel = 'monitor' #定义名称<span style="color: rgba(0, 0, 255, 1)">def</span> publish(self,msg):<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">定义发布方法</span> self.<span style="color: rgba(128, 0, 128, 1)">__conn</span><span style="color: rgba(0, 0, 0, 1)">.publish(self.channel,msg) </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> True </span><span style="color: rgba(0, 0, 255, 1)">def</span> subscribe(self):<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">定义订阅方法</span> pub = self.<span style="color: rgba(128, 0, 128, 1)">__conn</span>.pubsub() pub.subscribe(self.channel)
pub.parse_response()
return pub
发布者
#!/usr/bin/env python # -*- coding:utf-8 -*- #发布 from RedisHelper import RedisHelperobj = RedisHelper()
obj.publish('hello')#发布
订阅者
#!/usr/bin/env python # -*- coding:utf-8 -*- #订阅 from RedisHelper import RedisHelperobj = RedisHelper()
redis_sub = obj.subscribe()#调用订阅方法while True:
msg= redis_sub.parse_response()
print (msg)