Redis 简介 + Python 操作发布订阅

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 今天和大家分享下 Redis 基础,后面准备基于此,来做一个简单的在线聊天室。

初识 Redis


众所周知,Redis 是一个高性能的内存 key-value 数据库。

它主要有三个有点:

  • Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
  • Redis 支持数据的备份,即 master-slave 模式的数据备份。


Redis 支持的数据类型


Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。


String

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"


Hash(哈希)

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"


List(列表)

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>


Set(集合)

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"


zset(sorted set:有序集合)

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 键(Key)命令

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 字符串(String) 命令

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 发布订阅


Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 发布订阅命令

命令 描述
PSUBSCRIBE pattern [pattern …] 订阅一个或多个符合给定模式的频道
PUBSUB subcommand [argument [argument …]] 查看订阅与发布系统状态
PUBLISH channel message 将信息发送到指定的频道
PUNSUBSCRIBE [pattern [pattern …]] 退订所有给定模式的频道
SUBSCRIBE channel [channel …] 订阅给定的一个或多个频道的信息
UNSUBSCRIBE [channel [channel …]] 只退订给定的频道


Python 操作 Redis


如果现在没有 Redis 服务器,那么可以尝试用用 redislabs 这个在线免费服务器,只需要注册一个账号,就可以免费使用一个低配置的 Redis 服务器,挺方便的。

我这里就申请了一个:

image.png

下面使用 pip 来安装 Python 操作 Redis 的库

pip install redis


先简单的连接 Redis 服务器并设置一个 Key 来试试

import redis
r = redis.Redis(host='redis-12143.c8.us-east-1-3.ec2.cloud.redislabs.com',
                port=12143, password='that is a secrty')
r.set('name', 'zhangsan')   # 添加 Key
print(r.get('name'))   # 获取 Key 的值


如果不出意外,在控制台就会打印 zhangsan 这个字符串啦。

下面我们主要来看看发布订阅的操作

在 sub_redis.py 文件中写入如下代码:

import redis
 if __name__ == "__main__":
     conn = redis.Redis(host='redis-12143.c8.us-east-1-3.ec2.cloud.redislabs.com',
                        port=12143, password='that is a secrty')
     ps = conn.pubsub()
     ps.subscribe('chat')  # 从 chat 订阅消息
    for item in ps.listen():  # 监听状态:有消息发布了就拿过来
        if item['type'] == 'message':
            print(item['channel'])
            print(item['data'])


运行 sub_redis.py 脚本,监听订阅的 channel

在文件 publish_redis.py 中写入如下代码:

import redis
 if __name__ == "__main__":
     number_list = ['300033', '300032', '300031', '300030']
     signal = ['1', '-1', '1', '-1']
     conn = redis.Redis(host='redis-12143.c8.us-east-1-3.ec2.cloud.redislabs.com',
                        port=12143, password='that is a secrty')
     for i in range(len(number_list)):
        value_new = str(number_list[i]) + ' ' + str(signal[i])
        conn.publish("chat", value_new)


每次执行 publish_redis.py 文件时,sub_redis.py 脚本的控制台都会输出接收到的信息

b'chat'
b'Hello World'
b'chat'
b'300033 1'
b'chat'
b'300032 -1'


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL Unix 网络安全
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
|
3天前
|
NoSQL Linux Redis
linux安装单机版redis详细步骤,及python连接redis案例
这篇文章提供了在Linux系统中安装单机版Redis的详细步骤,并展示了如何配置Redis为systemctl启动,以及使用Python连接Redis进行数据操作的案例。
17 2
|
1月前
|
SQL 存储 NoSQL
Redis6入门到实战------ 一、NoSQL数据库简介
这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
Redis6入门到实战------ 一、NoSQL数据库简介
|
13天前
|
数据采集 算法 数据处理
Python中的列表推导式:简介与应用
【9月更文挑战第14天】本文旨在介绍Python中一种强大且简洁的构造列表的方法——列表推导式。我们将从基础语法入手,通过实例演示其用法,并探讨在数据处理和算法优化中的应用价值。文章将不包含代码示例,而是专注于概念理解和应用场景的描述,以促进读者对列表推导式的深入认识。
18 3
|
20天前
|
JavaScript Java C语言
Python简介
Python简介。
18 4
|
1月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】 Python连接Azure Redis, 使用redis.ConnectionPool 出现 "ConnectionResetError: [Errno 104] Connection reset by peer"
【Azure Redis 缓存】 Python连接Azure Redis, 使用redis.ConnectionPool 出现 "ConnectionResetError: [Errno 104] Connection reset by peer"
|
1月前
|
缓存 监控 NoSQL
【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)
【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)
|
1月前
|
NoSQL 网络安全 Redis
用python安装redis并设置服务自启
用python安装redis并设置服务自启
17 0
|
14天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案