redis连接池-python语言
文章目录
一、python使用redis
redis-py的使用很简单,只需要用redis.Redis建立连接,即可对Redis进行操作。
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')
r.get('foo')
r = redis.StrictRedis
# StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,
# Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接,
一般情况下, 这是没问题的, 但当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响。
于是, 连接池就发挥作用了:
二、python操作Redis之连接池
连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作。
这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能。
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。
默认,每个Redis实例都会维护一个自己的连接池。
可以直接建立一个连接池connection pool,然后作为参数初始化Redis,这样就可以实现多个Redis实例共享一个连接池。
import redis # 把连接池做成单例,写在一个文件里面,import它
Pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='xx', max_connections=10) # 拿到一个redis的连接池
conn = redis.Redis(connection_pool=pool,decode_responses=True) # 从池子中拿一个连接
print(conn.get('name').decode('utf-8'))
redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。
连接池大小:
连接池大小默认是2 ** 31,可以通过设置max_connections来限制连接池大小。
- 因为Redis服务器设置的连接数是有限的,在大并发的情况下,可能会导致客户端连接数超过redis server设置的最大连接数,从而会报错。
- 但是也不能设置太小,连接池设置太小会导致在大并发的时候没有可用连接而抛出异常。
三、设置Redis连接超时时间
当配置出现问题,或者redis服务挂了的时候,那么对redis的操作就会一直没有响应,那么可以通过设置redis的连接池的连接超时时间参数socket_connect_timeout。
再通过ping()方法来检查Redis的连接有效性。
# 这里把连接时间设置为1秒
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, socket_connect_timeout=1)
rs = redis.Redis(connection_pool=pool)
try:
re.ping()
except TimeoutError:
pring('redis connection timeout')
timeout相关:
-
1、socket_timeout
指Redis发出命令接收响应的时间不能超过此参数设置时间. 如果超过了此时间, 将会抛出异常:redis.exceptions.TimeoutError: Timeout reading from socket, 即读取响应超时。
建议设置这个时间,防止程序读取redis数据超时导致服务卡住,同时增加对这个的异常处理。 -
2、socket_connect_timeout
指Redis建立连接超时时间. 当设置此参数时, 如果在此时间内没有建立连接, 将会抛出异常redis.exceptions.TimeoutError: Timeout connecting to server。
socket_connect_timeout不设置时,这个值等于socket_timeout。
可以只设置socket_timeout。 -
3、retry_on_timeout
Boolean类型,建议设置为True。
当设置False时, 一个命令超时后, 将会直接抛出timeout异常。
当设置为True时, 命令超时后,将会重试一次, 重试成功则正常返回; 失败则抛出timeout异常。
四、使用阻塞连接池 (BlockingConnectionPool)
BlockingConnectionPool和ConnectionPool功能是一样的,但是是线程安全的,在多线程的环境下,建议用BlockingConnectionPool,比如gunicorn使用了多线程的worker。
同时,当所有连接都在使用时,获取可用连接不会抛异常,而是可以设置等待时间。
阻塞连接池的特点是:当连接池中没有空闲的连接时,会等待timeout秒,直到获取到连接或超时报错。
pool = redis.BlockingConnectionPool(host='localhost', port=6379, db=0, max_connections=2, timeout=5)
redis_client = redis.Redis(connection_pool=pool)
这里创建了一个阻塞连接池,其容量为2,超时等待时间为5秒。
五、参数介绍

六、redis的多种模式:单机模式、主从模式、哨兵模式、集群模式
更多推荐

所有评论(0)