今天和大家分享下 Redis 基础,后面准备基于此,来做一个简单的在线聊天室。
众所周知,Redis 是一个高性能的内存 key-value 数据库。 它主要有三个有点:
Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
string 是 Redis 中最最基本的数据类型,一个 key 对应一个 value。
1redis 127.0.0.1:6379> SET name "hello world"
2OK
3redis 127.0.0.1:6379> GET name
4"hello world"
Redis hash 是一个键值( key => value )对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
1redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
2"OK"
3redis 127.0.0.1:6379> HGET myhash field1
4"Hello"
5redis 127.0.0.1:6379> HGET myhash field2
6"World"
Redis 列表是简单的字符串列表,按照插入顺序排序。
1redis 127.0.0.1:6379> lpush mylist redis
2(integer) 1
3redis 127.0.0.1:6379> lpush mylist mongodb
4(integer) 2
5redis 127.0.0.1:6379> lpush mylist rabitmq
6(integer) 3
7redis 127.0.0.1:6379> lrange mylist 0 5
81) "rabitmq"
92) "mongodb"
103) "redis"
11redis 127.0.0.1:6379>
Redis 的 Set 是 string 类型的无序集合。
1redis 127.0.0.1:6379> sadd myset redis
2(integer) 1
3redis 127.0.0.1:6379> sadd myset mongodb
4(integer) 1
5redis 127.0.0.1:6379> sadd myset rabitmq
6(integer) 1
7redis 127.0.0.1:6379> sadd myset rabitmq
8(integer) 0
9redis 127.0.0.1:6379> smembers myset
10
111) "redis"
122) "rabitmq"
133) "mongodb"
Redis zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。
zset 的成员是唯一的,但分数(score)却可以重复。
1redis 127.0.0.1:6379> zadd myzset 2 redis
2(integer) 1
3redis 127.0.0.1:6379> zadd myzset 0 mongodb
4(integer) 1
5redis 127.0.0.1:6379> zadd myzset 1 rabitmq
6(integer) 1
7redis 127.0.0.1:6379> zadd myzset 0 rabitmq
8(integer) 0
9redis 127.0.0.1:6379> > ZRANGEBYSCORE myzset 0 1000
101) "mongodb"
112) "rabitmq"
123) "redis"
就如同上面所示,使用 Redis 客户端连接上 Redis 服务器之后,就可以执行相应的命令来操作 Redis 数据库了。
Redis 键命令用于管理 Redis 的键。 下面简单罗列了些键相关的基本命令
命令 | 描述 |
---|---|
DEL key | 该命令用于在 key 存在时删除 key |
EXISTS key | 检查给定 key 是否存在 |
EXPIRE key seconds | 为给定 key 设置过期时间,以秒计 |
EXPIREAT key timestamp | EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp) |
TYPE key | 返回 key 所储存的值的类型 |
TTL key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live) |
RANDOMKEY | 从当前数据库中随机返回一个 key |
Redis 字符串数据类型的相关命令用于管理 Redis 字符串值。 下面简单罗列了些字符串相关的基本命令
命令 | 描述 |
---|---|
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
SETNX key value | 只有在 key 不存在时设置 key 的值 |
SETEX key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) |
STRLEN key | 返回 key 所储存的字符串值的长度 |
对于其他数据类型的命令,可以自行查看官方文档哈。
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
命令 | 描述 |
---|---|
PSUBSCRIBE pattern [pattern …] | 订阅一个或多个符合给定模式的频道 |
PUBSUB subcommand [argument [argument …]] | 查看订阅与发布系统状态 |
PUBLISH channel message | 将信息发送到指定的频道 |
PUNSUBSCRIBE [pattern [pattern …]] | 退订所有给定模式的频道 |
SUBSCRIBE channel [channel …] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel …]] | 只退订给定的频道 |
如果现在没有 Redis 服务器,那么可以尝试用用 redislabs 这个在线免费服务器,只需要注册一个账号,就可以免费使用一个低配置的 Redis 服务器,挺方便的。 我这里就申请了一个:
下面使用 pip 来安装 Python 操作 Redis 的库
1pip install redis
先简单的连接 Redis 服务器并设置一个 Key 来试试
1import redis
2
3
4r = redis.Redis(host='redis-12143.c8.us-east-1-3.ec2.cloud.redislabs.com',
5 port=12143, password='that is a secrty')
6r.set('name', 'zhangsan') # 添加 Key
7print(r.get('name')) # 获取 Key 的值
如果不出意外,在控制台就会打印 zhangsan 这个字符串啦。
下面我们主要来看看发布订阅的操作
在 sub_redis.py 文件中写入如下代码:
1import redis
2
3
4if __name__ == "__main__":
5 conn = redis.Redis(host='redis-12143.c8.us-east-1-3.ec2.cloud.redislabs.com',
6 port=12143, password='that is a secrty')
7
8 ps = conn.pubsub()
9 ps.subscribe('chat') # 从 chat 订阅消息
10 for item in ps.listen(): # 监听状态:有消息发布了就拿过来
11 if item['type'] == 'message':
12 print(item['channel'])
13 print(item['data'])
运行 sub_redis.py 脚本,监听订阅的 channel
在文件 publish_redis.py 中写入如下代码:
1import redis
2
3
4if __name__ == "__main__":
5 number_list = ['300033', '300032', '300031', '300030']
6 signal = ['1', '-1', '1', '-1']
7 conn = redis.Redis(host='redis-12143.c8.us-east-1-3.ec2.cloud.redislabs.com',
8 port=12143, password='that is a secrty')
9 for i in range(len(number_list)):
10 value_new = str(number_list[i]) + ' ' + str(signal[i])
11 conn.publish("chat", value_new)
每次执行 publish_redis.py 文件时,sub_redis.py 脚本的控制台都会输出接收到的信息
1b'chat'
2b'Hello World'
3b'chat'
4b'300033 1'
5b'chat'
6b'300032 -1'