Redis是一个基于内存的高效的键值型非关系型数据库,存取效率极高,并且支持多种存储数据结构,使用也很是简单。本节中,咱们就来介绍一下Python的Redis操做,主要介绍RedisPy这个库的用法。html
在开始以前,请确保已经安装好了Redis及RedisPy库。若是要作数据导入/导出操做的话,还须要安装RedisDump。若是没有安装,能够参考第1章。redis
RedisPy库提供两个类Redis
和StrictRedis
来实现Redis的命令操做。数据库
StrictRedis
实现了绝大部分官方的命令,参数也一一对应,好比set()
方法就对应Redis命令的set
方法。而Redis
是StrictRedis
的子类,它的主要功能是用于向后兼容旧版本库里的几个方法。为了作兼容,它将方法作了改写,好比lrem()
方法就将value
和num
参数的位置互换,这和Redis命令行的命令参数不一致。json
官方推荐使用StrictRedis
,因此本节中咱们也用StrictRedis类
的相关方法做演示。bash
如今咱们已经在本地安装了Redis并运行在6379端口,密码设置为foobared。那么,能够用以下示例链接Redis并测试:微信
1
2
3
4
5
|
from redis import StrictRedis
redis = StrictRedis(host='localhost', port=6379, db=0, password='foobared')
redis.set('name', 'Bob')
print(redis.get('name'))
|
这里咱们传入了Redis的地址、运行端口、使用的数据库和密码信息。在默认不传的状况下,这4个参数分别为localhost
、6379
、0
和None
。首先声明了一个StrictRedis
对象,接下来调用set()
方法,设置一个键值对,而后将其获取并打印。网络
运行结果以下:数据结构
1
|
b'Bob'
|
这说明咱们链接成功,并能够执行set()
和get()
操做了。架构
固然,咱们还可使用ConnectionPool
来链接,示例以下:app
1
2
3
4
|
from redis import StrictRedis, ConnectionPool
pool = ConnectionPool(host='localhost', port=6379, db=0, password='foobared')
redis = StrictRedis(connection_pool=pool)
|
这样的链接效果是同样的。观察源码能够发现,StrictRedis
内其实就是用host
和port
等参数又构造了一个ConnectionPool
,因此直接将ConnectionPool
看成参数传给StrictRedis
也同样。
另外,ConnectionPool
还支持经过URL来构建。URL的格式支持有以下3种:
1
2
3
|
redis://[:password]@host:port/db
rediss://[:password]@host:port/db
unix://[:password]@/path/to/socket.sock?db=db
|
这3种URL分别表示建立Redis TCP链接、Redis TCP+SSL链接、Redis UNIX socket链接。咱们只须要构造上面任意一种URL便可,其中password
部分若是有则能够写,没有则能够省略。下面再用URL链接演示一下:
1
2
3
|
url = 'redis://:foobared@localhost:6379/0'
pool = ConnectionPool.from_url(url)
redis = StrictRedis(connection_pool=pool)
|
这里咱们使用第一种链接字符串进行链接。首先,声明一个Redis链接字符串,而后调用from_url()
方法建立ConnectionPool
,接着将其传给StrictRedis
便可完成链接,因此使用URL的链接方式仍是比较方便的。
表5-5总结了键的一些判断和操做方法。
表5-5 键的一些判断和操做方法
方法 |
做用 |
参数说明 |
示例 |
示例说明 |
示例结果 |
---|---|---|---|---|---|
|
判断一个键是否存在 |
|
|
是否存在 |
|
|
删除一个键 |
|
|
删除 |
1 |
|
判断键类型 |
|
|
判断 |
|
|
获取全部符合规则的键 |
|
|
获取全部以 |
|
|
获取随机的一个键 |
|
获取随机的一个键 |
|
|
|
重命名键 |
|
|
将 |
|
|
获取当前数据库中键的数目 |
|
获取当前数据库中键的数目 |
100 |
|
|
设定键的过时时间,单位为秒 |
|
|
将 |
|
|
获取键的过时时间,单位为秒,-1表示永久不过时 |
|
|
获取 |
-1 |
|
将键移动到其余数据库 |
|
|
将 |
|
|
删除当前选择数据库中的全部键 |
|
删除当前选择数据库中的全部键 |
|
|
|
删除全部数据库中的全部键 |
|
删除全部数据库中的全部键 |
|
Redis支持最基本的键值对形式存储,用法总结如表5-6所示。
表5-6 键值对形式存储
方法 |
做用 |
参数说明 |
示例 |
示例说明 |
示例结果 |
---|---|---|---|---|---|
|
给数据库中键为 |
|
|
给 |
|
|
返回数据库中键为 |
|
|
返回 |
|
|
给数据库中键为 |
|
|
赋值 |
|
|
返回多个键对应的 |
|
|
返回 |
|
|
若是不存在这个键值对,则更新 |
|
|
若是 |
第一次运行结果是 |
|
设置能够对应的值为 |
|
|
将 |
|
|
设置指定键的 |
|
|
设置 |
11,修改后的字符串长度 |
|
批量赋值 |
|
|
将 |
|
|
键均不存在时才批量赋值 |
|
|
在 |
|
|
键为 |
|
|
|
1,即修改后的值 |
|
键为 |
|
|
|
-1,即修改后的值 |
|
键为 |
|
|
向键为 |
13,即修改后的字符串长度 |
|
返回键为 |
|
|
返回键为 |
|
|
获取键的 |
|
|
返回键为 |
|
Redis还提供了列表存储,列表内的元素能够重复,并且能够从两端存储,用法如表5-7所示。
表5-7 列表操做
方法 |
做用 |
参数说明 |
示例 |
示例说明 |
示例结果 |
---|---|---|---|---|---|
|
在键为 |
|
|
向键为 |
3,列表大小 |
|
在键为 |
|
|
向键为 |
4,列表大小 |
|
返回键为 |
|
|
返回键为 |
4 |
|
返回键为 |
|
|
返回起始索引为1终止索引为3的索引范围对应的列表 |
|
|
截取键为 |
|
|
保留键为 |
|
|
返回键为 |
|
|
返回键为 |
b’2′ |
|
给键为 |
|
|
将键为 |
|
|
删除 |
|
|
将键为 |
1,即删除的个数 |
|
返回并删除键为 |
|
|
返回并删除名为 |
|
|
返回并删除键为 |
|
|
返回并删除名为 |
|
|
返回并删除名称在 |
|
|
返回并删除键为 |
|
|
返回并删除键为 |
|
|
返回并删除名为 |
|
|
返回并删除名称为 |
|
|
将键为 |
|
Redis还提供了集合存储,集合中的元素都是不重复的,用法如表5-8所示。
表5-8 集合操做
方法 |
做用 |
参数说明 |
示例 |
示例说明 |
示例结果 |
---|---|---|---|---|---|
|
向键为 |
|
|
向键为 |
3,即插入的数据个数 |
|
从键为 |
|
|
从键为 |
1,即删除的数据个数 |
|
随机返回并删除键为 |
|
|
从键为 |
|
|
从 |
|
|
从键为 |
|
|
返回键为 |
|
|
获取键为 |
3 |
|
测试 |
|
|
判断 |
|
|
返回全部给定键的集合的交集 |
|
|
返回键为 |
|
|
求交集并将交集保存到 |
|
|
求键为 |
1 |
|
返回全部给定键的集合的并集 |
|
|
返回键为 |
|
|
求并集并将并集保存到 |
|
|
求键为 |
3 |
|
返回全部给定键的集合的差集 |
|
|
返回键为 |
|
|
求差集并将差集保存到 |
|
|
求键为tags |
3 |
|
返回键为 |
|
|
返回键为 |
|
|
随机返回键为 |
|
|
随机返回键为 |
有序集合比集合多了一个分数字段,利用它能够对集合中的数据进行排序,其用法总结如表5-9所示。
表5-9 有序集合操做
方法 |
做用 |
参数说明 |
示例 |
示例说明 |
示例结果 |
---|---|---|---|---|---|
|
向键为 |
|
|
向键为 |
2,即添加的元素个数 |
|
删除键为 |
|
|
从键为 |
1,即删除的元素个数 |
|
若是在键为 |
|
|
键为 |
98.0,即修改后的值 |
|
返回键为 |
|
|
获得键为 |
1 |
|
返回键为 |
|
|
获得键为 |
2 |
|
返回键为 |
|
|
返回键为 |
|
|
返回键为 |
|
|
返回键为 |
|
|
返回键为 |
|
|
返回键为 |
2 |
|
返回键为 |
|
|
获取键为 |
3 |
|
删除键为 |
|
|
删除键为 |
1,即删除的元素个数 |
|
删除键为 |
|
|
删除 |
1,即删除的元素个数 |
Redis还提供了散列表的数据结构,咱们能够用name
指定一个散列表的名称,表内存储了各个键值对,用法总结如表5-10所示。
表5-10 散列操做
方法 |
做用 |
参数说明 |
示例 |
示例说明 |
示例结果 |
---|---|---|---|---|---|
|
向键为 |
|
|
向键为 |
1,即添加的映射个数 |
|
若是映射键名不存在,则向键为 |
|
|
向键为 |
1,即添加的映射个数 |
|
返回键为 |
|
|
获取键为 |
5 |
|
返回键为 |
|
|
获取键为 |
|
|
向键为 |
|
|
向键为 |
|
|
将键为 |
|
|
|
6,修改后的值 |
|
键为 |
|
|
键为 |
|
|
在键为 |
|
|
从键为 |
|
|
从键为 |
|
|
从键为 |
6 |
|
从键为 |
|
|
从键为 |
|
|
从键为 |
|
|
从键为 |
|
|
从键为 |
|
|
从键为 |
|
RedisDump提供了强大的Redis数据的导入和导出功能,如今就来看下它的具体用法。
首先,确保已经安装好了RedisDump。
RedisDump提供了两个可执行命令:redis-dump
用于导出数据,redis-load
用于导入数据。
首先,能够输入以下命令查看全部可选项:
1
|
redis-dump -h
|
运行结果以下:
Usage: redis-dump [global options] COMMAND [command options] -u, --uri=S Redis URI (e.g. redis://hostname[:port]) -d, --database=S Redis database (e.g. -d 15) -s, --sleep=S Sleep for S seconds after dumping (for debugging) -c, --count=S Chunk size (default: 10000) -f, --filter=S Filter selected keys (passed directly to redis' KEYS command) -O, --without_optimizations Disable run time optimizations -V, --version Display version -D, --debug --nosafe复制代码
其中-u
表明Redis链接字符串,-d
表明数据库代号,-s
表明导出以后的休眠时间,-c
表明分块大小,默认是10000,-f
表明导出时的过滤器,-O
表明禁用运行时优化,-V
用于显示版本,-D
表示开启调试。
咱们拿本地的Redis作测试,运行在6379端口上,密码为foobared,导出命令以下:
1
|
redis-dump -u :foobared@localhost:6379
|
若是没有密码的话,能够不加密码前缀,命令以下:
1
|
redis-dump -u localhost:6379
|
运行以后,能够将本地0至15号数据库的全部数据输出出来,例如:
1
2
3
4
5
6
7
8
|
{"db":0,"key":"name","ttl":-1,"type":"string","value":"James","size":5}
{"db":0,"key":"name2","ttl":-1,"type":"string","value":"Durant","size":6}
{"db":0,"key":"name3","ttl":-1,"type":"string","value":"Durant","size":6}
{"db":0,"key":"name4","ttl":-1,"type":"string","value":"HelloWorld","size":10}
{"db":0,"key":"name5","ttl":-1,"type":"string","value":"James","size":5}
{"db":0,"key":"name6","ttl":-1,"type":"string","value":"James","size":5}
{"db":0,"key":"age","ttl":-1,"type":"string","value":"1","size":1}
{"db":0,"key":"age2","ttl":-1,"type":"string","value":"-5","size":2}
|
每条数据都包含6个字段,其中db
即数据库代号,key
即键名,ttl
即该键值对的有效时间,type
即键值类型,value
即内容,size
即占用空间。
若是想要将其输出为JSON行文件,可使用以下命令:
1
|
redis-dump -u :foobared@localhost:6379 > ./redis_data.jl
|
这样就能够成功将Redis的全部数据库的全部数据导出成JSON行文件了。
另外,可使用-d
参数指定某个数据库的导出,例如只导出1号数据库的内容:
1
|
redis-dump -u :foobared@localhost:6379 -d 1 > ./redis.data.jl
|
若是只想导出特定的内容,好比想导出以adsl
开头的数据,能够加入-f
参数用来过滤,命令以下:
1
|
redis-dump -u :foobared@localhost:6379 -f adsl:* > ./redis.data.jl
|
其中-f
参数即Redis的keys
命令的参数,能够写一些过滤规则。
一样,咱们能够首先输入以下命令查看全部可选项:
1
|
redis-load -h
|
运行结果以下:
redis-load --help Try: redis-load [global options] COMMAND [command options] -u, --uri=S Redis URI (e.g. redis://hostname[:port]) -d, --database=S Redis database (e.g. -d 15) -s, --sleep=S Sleep for S seconds after dumping (for debugging) -n, --no_check_utf8 -V, --version Display version -D, --debug --nosafe复制代码
其中-u
表明Redis链接字符串,-d
表明数据库代号,默认是所有,-s
表明导出以后的休眠时间,-n
表明不检测UTF-8编码,-V
表示显示版本,-D
表示开启调试。
咱们能够将JSON行文件导入到Redis数据库中:
1
|
< redis_data.json redis-load -u :foobared@localhost:6379
|
这样就能够成功将JSON行文件导入到数据库中了。
另外,下面的命令一样能够达到一样的效果:
1
|
cat redis_data.json | redis-load -u :foobared@localhost:6379
|
本节中,咱们不只了解了RedisPy对Redis数据库的一些基本操做,还演示了RedisDump对数据的导入导出操做。因为其便捷性和高效性,后面咱们会利用Redis实现不少架构,如维护代理池、Cookies池、ADSL拨号代理池、Scrapy-Redis分布式架构等,因此Redis的操做须要好好掌握。
本资源首发于崔庆才的我的博客静觅: Python3网络爬虫开发实战教程 | 静觅
如想了解更多爬虫资讯,请关注个人我的微信公众号:进击的Coder
weixin.qq.com/r/5zsjOyvEZ… (二维码自动识别)