Redis数据库Python API (连接池,过期时间)

爬虫的日常工作中,会经常使用redis做任务队列/去重/等工作,操作方便,而且可支持上万的并发。

引用自官方文档:
1. Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
2. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
3. Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

1. 安装

pip install redis

2. 连接

最简单的单连接方式

import redis
# 由于redis输出数据类型是bytes,所以连接配置提供decode_responses选项,可以选择直接输出str类型数据
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
r.set('tag', 'student')

有关Redis连接的几个特性需要注意一下:

  1. Redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。
  2. 如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。
  3. Redis Python API不提供select db切换Redis 数据库的命令。

要提到的是,Redis Python API同时提供RedisStrictRedis用于实现Redis的命令,其中:

  1. StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令
  2. Redis是StrictRedis的子类,用于向后兼容旧版本的Redis Python API。

官方推荐使用StrictRedis类, 不推荐Redis类,原因是Redis类的部分操作和在操作redis-cli操作有些不一样,主要有以下几点:

  • LREM:写入numvalue与客户端相反
  • ZADD:写入scorevalue与客户端相反
  • SETEX: 写入timevalue与客户端相反
  • Pool: 构建连接池的细微差别

3. 连接池

为什么需要连接池?

使用连接池管理所有连接,减少每次建立、释放连接的开销

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, db=0)
r = redis.StrictRedis(connection_pool=pool)

4. 关于过期时间

在Redis中主要使用过期时间这个功能的是String类型数据

创建String类型数据,类似于redis-cli中的 set key value
set(name, value, ex=None, px=None, nx=False, xx=False)

参数含义:
ex 过期时间(秒)
px 过期时间(毫秒)
nx 如果设置为True,则只有name不存在时,当前set操作才执行,否则不执行
xx 如果设置为True,则只有name存在时,当前set操作才执行,否则不执行

setnx(name, value)             设置值,只有name不存在时,执行设置添加操作
setex(name, value, time)       设置值和过期时间(秒或timedelta对象)
psetex(name, time_ms, value)   设置值过期时间(毫秒或timedelta对象)

推荐阅读
http://www.redis.cn/topics/faq.html Redis官方文档FAQ

参考文章
http://www.bubuko.com/infodetail-2062680.html
https://www.jianshu.com/p/2639549bedc8
https://redis.io/
http://www.redis.cn/documentation.html

更多文章可以访问我的个人博客:码练

你可能感兴趣的:(数据库)