python连接Redis方式
参考文章
工作中用到了redis,想写篇文章复习以及学习一下python连接redis的几种原始方式,而不是框架中的连接方法,以此作为记录。
一、Redis类连接redis
python中要使用redis,首先需要导入redis模块:
import redis
使用redis.Reids创建实例化对象:
import redis
rdb = redis.Redis(host=to_host, port=to_port, db=to_db, decode_responses=True)
例如:
import redis
rdb = redis.Redis(host="127.0.0.1", port=6379, db=9)
rdb.set("name", "苍")
print(rdb.get("name"))
# 输出
b'\xe8\x8b\x8d'
可以看出,输出的是字节格式,存取的时候redis都会进行编码或者解码,redis直接返回二进制的结果,对于结果还需要进行解码才能得到某些字符的显示。
不过也别担心,Redis类提供了一个参数decode_responses (解码响应),设置decode_response=True即省去了获得的二进制结果解码的过程。
import redis
rdb = redis.Redis(host="127.0.0.1", port=6379, db=9, decode_responses=True)
rdb.set("name", "苍")
print(rdb.get("name"))
# 输出
苍
二、StrictRedis连接
StrictRedis 和 Redis的使用方式一样,参见源码:
StrictRedis = Redis
代码说明在目前版本redis 3.3.8中,StrictRedis 和 Redis一样,木有区别。(不知道说的对不对)
注意:在之前的某些版本中
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)。Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。简单说,官方推荐使用
StrictRedis方法。
不推荐
Redis类,原因是他和咱们在redis-cli操作有些不一样,主要不一样是下面这三个方面。·
LREM:参数‘num’和‘value’的顺序交换了一下,cli是lrem queueName 0 ‘string’。 这里的0时所有的意思。 但是Redis这个类,把控制和string调换了。
·ZADD:实现时score和value的顺序不小心弄反了,后来有人用了,就这样了
·SETEX:time和value的顺序反了
.Pool: 连接池
Redis的连接池的方法:pool = redis.ConnectionPool(host=‘localhost‘, port=6379, db=0) r = redis.Redis(connection_pool=pool)
StrictRedis的连接池的实现方式:pool = redis.ConnectionPool(host=‘127.0.0.1‘, port=6379) r = redis.StrictRedis(connection_pool=pool)
三、ConnectionPool连接池连接Redis
使用连接池ConnectionPool连接Redis
方式一: Redis连接池(不推荐)
from redis import ConnectionPool, Redis
pool = ConnectionPool(host=to_host, port=to_port, db=to_db, decode_responses=True)
rdb = Redis(connection_pool=pool)
方式二: StrictRedis连接池
from redis import ConnectionPool, StrictRedis
pool = ConnectionPool(host=to_host, port=to_port, db=to_db, decode_responses=True)
rdb = StrictRedis(connection_pool=pool)
例如:
from redis import ConnectionPool, Redis
pool = ConnectionPool(host="127.0.0.1", port=6379, db=9, decode_responses=True)
rdb = Redis(connection_pool=pool)
rdb.set("name", "苍")
print(rdb.get("name"))
# 输出
苍
四、Redis中管道pipeline
redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是 原子性操作。
方式一: Redis连接池管道(不推荐)
from redis import ConnectionPool, Redis
pool = ConnectionPool(host=to_host, port=to_port, db=to_db, decode_responses=True)
rdb = Redis(connection_pool=pool)
pipe = rdb.pipeline(transaction=True) # 默认transaction为True
# redis的操作1
# redis的操作2
# ...
pipe.execute()
方式二: StrictRedis连接池管道
from redis import ConnectionPool, StrictRedis
pool = ConnectionPool(host=to_host, port=to_port, db=to_db, decode_responses=True)
rdb = StrictRedis(connection_pool=pool)
pipe = rdb.pipeline(transaction=True) # 默认transaction为True
# redis的操作1
# redis的操作2
# ...
pipe.execute()
例如:
from redis import ConnectionPool, Redis
pool = ConnectionPool(host="127.0.0.1", port=6379, db=9, decode_responses=True)
rdb = Redis(connection_pool=pool)
pipe = rdb.pipeline(transaction=True)
rdb.set("name", "hero久诚")
rdb.set("age", 18)
pipe.execute()
print(rdb.get("name"))
print(rdb.get("age"))
# 输出
hero久诚
18