注册 登录

清河洛

python操作redis

qingheluo2019-09-11清河洛262
安装redis模块:pip install redisredis提供两个类Redis和StrictRedis用于实现Redis的连接和操作命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py,推荐使用StricRedis。StrictRedis尽量使用官方语法和命令,除了以下命令: select没有实现,考虑到了线程安全 del是Python的关键字,用delete代替 config get|set命令用config_get/config_set实现 multi、exec和watch作为Pipeline类的一部分实现 redi...

安装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原版的事务实现步骤和原理都相同


网址导航