python操作redis
安装redis模块:pip install redis
redis提供两个类Redis和StrictRedis用于实现Redis的连接和操作命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py,推荐使用StricRedis。
StrictRedis尽量使用官方语法和命令,除了以下命令:
select没有实现,考虑到了线程安全 del是Python的关键字,用delete代替 config get|set命令用config_get/config_set实现 multi、exec和watch作为Pipeline类的一部分实现
redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例(或Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。所以,python的redis没有实现select命令
Redis类是StricRedis的子类,提供向后的兼容性。Redis覆盖了几个命令:
lrem(key value count),count设置了默认值0,redis和StricRedis类中是lrem(key count value) zadd:args的形式为:name1,score1,name2,score2,...而redis和StricRedis类中是score1,name1,score2,name2,... setex(key,value,time),在redis和StricRedis类中是:setex(key,time,value)
创建一个连接实例:
r=redis.StrictRedis(host=‘localhost‘, port=6379, db=0, password=None, socket_timeout=None, socket_connect_timeout=None, socket_keepalive=None, socket_keepalive_options=None, connection_pool=None, unix_socket_path=None, encoding=‘utf-8‘, encoding_errors=‘strict‘, charset=None, errors=None, decode_responses=False, retry_on_timeout=False, ssl=False, ssl_keyfile=None, ssl_certfile=None, ssl_cert_reqs=‘required‘, ssl_ca_certs=None, max_connections=None, single_connection_client=False, health_check_interval=0)
所有参数都是以关键字参数的形式传入 decode_responses,设置为True,写入的键值对中的value为str类型,否则为字节类型。 connection_pool,使用指定的连接池进行连接
连接池:
默认每个Redis实例都会维护一个自己的连接池,可以建立一个连接池,这样就可以实现多个Redis实例共享一个连接池,避免每次建立、释放连接的开销。
使用ConnectionPool类创建一个连接池实例对象:
pool = redis.ConnectionPool(host=‘localhost‘,port=6379,decode_responses=True)
r = redis.StrictRedis(connection_pool=pool)
set(name, value, ex=None, px=None, nx=False, xx=False)
设置值,默认不存在则创建,存在则修改 ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行 xx,如果设置为True,则只有name存在时,当前set操作才执行
管道(pipeline)
redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline是原子性操作。
pipeline是redis在提供单个请求中缓冲多条服务器命令的基类的子类。它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能。
pipe = r.Pipeline(transaction=True,shard_hint=None)
ransaction参数值设置为False可以关闭原子性 常规操作: pipe.set(‘foo‘, ‘bar‘) pipe.sadd(‘faz‘,‘baz‘) …… pipe.execute() 链式操作: pipe.set(‘foo‘,‘bar‘).sadd(‘faz‘,‘baz‘).…….execute()
以上操作已经是简单的事务实现了,如果要使用redis原版的key监视从而实现事务:
pipe.watch(key1,key2,...) pipe.multi() pipe.set(‘foo‘, ‘bar‘) pipe.sadd(‘faz‘,‘baz‘) …… pipe.exec() 这种方式和redis原版的事务实现步骤和原理都相同