本节主要介绍Redis的5种数据类型,同时使用来Python API来操作Redis。
API使用:
redis-py 的API的使用可以分类为:
(1)连接方式
(2)连接池
(3)操作
- String 操作
- Hash 操作
- List 操作
- Set 操作
- Sort Set 操作
(4)管道
(5)发布订阅
1. redis文件配置
(1)配置redis配置文件
在之前的博客https://www.cnblogs.com/xuejiale/p/10424885.html中安装并配置了redis,为了能够使用python操作redis,还需要再次配置redis的配置文件/etc/redis/6379.conf。
- 找到bind 127.0.0.1这一行,修改为bind 0.0.0.0
- 把protected-mode yes改为no
- 找到daemonize,可以看到reids默认情况下不是后台驻留程序,(将daemonize属性改为yes,表明需要在后台运行,这个根据你个人情况来搞,如果选择后台驻留,建议设一个密码)
(2)启动redis服务端
使用指定配置文件的方式启动
[root@centos redis]# /etc/init.d/redis_6379 stop Stopping ... Redis stopped [root@centos redis]# /etc/init.d/redis_6379 start Starting Redis server... 7759:C 02 Mar 15:48:23.397 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 7759:C 02 Mar 15:48:23.398 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=7759, just started 7759:C 02 Mar 15:48:23.398 # Configuration loaded [root@centos redis]# redis-cli 测试是否可以连接redis: 127.0.0.1:6379> PING PONG 127.0.0.1:6379>
(3)其他操作
在Python中运行时有时候会报相关错误,要把防火墙关掉
暂时关闭防火墙:(立即生效,开机重启,会重新打开)
service iptables stop
永久关闭防火墙(关机重启才会生效)
chkconfig iptables off
(3)redis设置密码
- 在配置文件中设置
在配置文件中找到requirepass foobared行,打开注释并设置密码为redis123,requirepass redis123,保存退出并重启redis:
重启之后连接redis,并测试需要输入密码:
[root@centos redis]# redis-cli 127.0.0.1:6379> SET name lisi (error) NOAUTH Authentication required. 127.0.0.1:6379> AUTH redis123 OK 127.0.0.1:6379> SET name lisi OK
- 在客户端设置
开两个窗口,在一个窗口设置,如下
127.0.0.1:6379> config set requirepass newredis123 OK
在另一个窗口登录:
[root@centos redis]# redis-cli 127.0.0.1:6379> SET name wangwu (error) NOAUTH Authentication required. 127.0.0.1:6379> AUTH newredis123 OK 127.0.0.1:6379> SET name wangwu OK 127.0.0.1:6379>
(4)python redis API安装与运行redis
首先要安装python 操作redis的API接口模块:
sudo pip install redis
or
sudo easy_install redis
or
源码安装
详见:https://github.com/WoLpH/redis-py
为了方便测试,目前及后续我们不设置redis的密码,使用Windows连接Linux上安装的redis,测试程序如下:
1 import redis 2 3 r = redis.Redis(host='192.168.30.134', port=6379) 4 r.set('foo', 'Bar') 5 print(r.get('foo'))
执行结果:
2. 连接方式
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
默认情况下,往redis里插入数据后再读出来时所有键与值都是byte类型的,就是说如果你要使用这些值全部都得转换编码。为了读出的数据是string类型,有一个参数decode_responses可以设置,改参数默认为False,连接redis,加上decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。例如:
1 import redis 2 3 r = redis.Redis(host='192.168.30.134', port=6379) 4 #r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, decode_responses=True) 5 r.set('subject', 'python') 6 7 print(r['subject']) # 如果subject不存在则会报错 8 print(r.get('subject')) # 如果subject不存在则会返回None 9 print(type(r.get('subject')))
执行结果:
1 import redis 2 3 r = redis.Redis(host='192.168.30.134', port=6379, decode_responses=True) 4 #r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, decode_responses=True) 5 r.set('subject', 'Go') 6 7 print(r['subject']) # 如果subject不存在则会报错 8 print(r.get('subject')) # 如果subject不存在则会返回None 9 print(type(r.get('subject')))
执行结果:
注意:如果你设置decode_responses=True,在往数据库里真的写二进制数据的时候,那么再读取的时候就会出错。除非你明确可以知道你没有使用二进制value。
3. 连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
2. 热身
首先了解几个基础命令,打开redis-cli
(1)获得符合规则的键名列表
KEYS pattern
可以通过help COMMAND来获取该命令的使用信息。比如:
127.0.0.1:6379> help KEYS KEYS pattern summary: Find all keys matching the given pattern since: 1.0.0 group: generic
pattern支持glob风格通配符格式,具体规则如下:
使用KEYS *能够获的Redis中所有的键,如
127.0.0.1:6379> KEYS * 1) "num" 2) "key" 3) "foo" 4) "bar" 5) "name"
注意:KEYS命令需要遍历Redis中所有的键,当键的数量较多时会影响性能,不建议在生产环境中使用。
提示:Redis不区分命令大小写,但习惯于使用大写字母表示Redis命令。
(2)判断一个键是否存在
EXISTS key [key ...] summary: Determine if a key exists
如果键存在则返回整数类型1,否则返回0。
127.0.0.1:6379> EXISTS foo (integer) 1 127.0.0.1:6379> EXISTS noexists (integer) 0
(3)删除键
DEL key [key ...]
summary: Delete a key
可以删除一个或者多个键,返回值是删除的键的个数。如:
127.0.0.1:6379> DEL foo (integer) 1 127.0.0.1:6379> DEL foo (integer) 0
第二次执行 DEL 命令时因为 bar 键已经删除了,实际上并没有删除任何键,所以返回0。
技巧: DEL命令的参数不支持通配符,但是可以结合Linux的管道和xargs命令自行实现删除所有符合规则的键。比如要删除所有以“user:”开头的键,就可以执行redis-cli KEYS "user:*" | xargs redis-cli DEL。另外由于DEL命令支持多个键作为参数,所以还可以执行redis-cli DEL `redis-cli KEYS "user:"`来达到同样的效果,但是性能更好。
(4)获得键值的数据类型
TYPE key
summary: Determine the type stored at key
TYPE命令用来获得键值的数据类型,返回值可能是string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。例如:
127.0.0.1:6379> SET foo 1 OK 127.0.0.1:6379> TYPE foo string 127.0.0.1:6379> LPUSH bar 1 (integer) 1 127.0.0.1:6379> TYPE bar list 127.0.0.1:6379>
3. 字符串类型
String操作,redis中的String在在内存中按照一个name对应一个value来存储。字符串类型是Redis中基本的数据类型,他能存储任何形式的字符串,包括二进制数据。你可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型的键允许存储的最大容量是512M。
(1)赋值与取值
SET key value [EX seconds] [PX milliseconds] [NX|XX] summary: Set the string value of a key
参考文献:
- Redis入门指南 (第二版)
- https://www.cnblogs.com/LearningOnline/p/9456806.html (linux上部署redis实现与Python上的redis交互)