「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。
本文首先介绍如何使用 Python 连接 Redis 数据库,如何引入进程池的概念,并介绍如何通过进程池连接 Redis。
连接 Redis
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
在 Python 中,可以使用 redis 模块连接 redis 数据库,redis 模块的安装命令为:
pip install redis
导入该模块之后,我们就可以连接并操作数据库:
import redis
conn = redis.Redis(host= os.environ.get('REDIS_HOST', '127.0.0.1'), port= 6379)
conn.set('Hello', 'Juejin')
conn.get('Hello')
Redis
与 StrictRedis
在上面的代码中,连接数据库,使用的是 Redis
类。在一些文章中,使用了 StrictRedis
类,并有一些文章介绍了这两个类的区别。
但在查看了 4.1.0
版本的 redis 库后发现,其实现在二者是一样的,在源代码 redis/client.py
第 1199 行:
StrictRedis = Redis
为什么使用连接池
在连接数据库时,如果没有连接池,每一次的存取都需要打开一个连接,使用完后再断开。当面对并发的场景时,频繁的访问使得需要进行很多的建立和释放连接的操作,造成系统的性能低下。
连接池就是用于解决这一问题:在应用程序启动时建立足够的数据库连接,并把这些连接放在连接池中,由应用程序动态地对池中的连接进行申请、使用和释放。当并发请求超过连接池中的连接数时,可以将请求放入请求队列中排队等待。并且应用程序还可以根据池中连接的使用率,动态增加或减少池中的连接数。
使用连接池
那么,我们如何在连接 Redis 时也使用连接池呢?
在创建 Redis
类时,有一个参数 connection_pool
,这个参数的默认值是 None
。那么,我们就可以先创建一个连接池,在初始化 Redis
类的时候把连接池作为参数传递进去:
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
con = redis.Redis(connection_pool= pool)
而在进一步查看(4.1.0
版本的 redis 库)源码后发现,其实即使我们不指定连接池(初始化 Redis
类时,参数 connection_pool
的值为 None
),得到的 Redis
类依然使用了连接池的方式连接数据库。
在源码 redis/client.py
第 963 和 964 行,如果参数 connection_pool
值是 None
,则会执行:
connection_pool = ConnectionPool(**kwargs)
self.connection_pool = connection_pool
也就是说,即使我们不显式地声明使用连接池,在使用 Python 连接 Redis 数据库时,默认就会采用连接池的方式进行连接。