Python 异步集群使用

目前在做Python项目用到同步和异步的方法使用Redis单机,现在要增加兼容Redis集群。也就说当前项目用到中以下4种Python使用Redis的方法都用到了。
| - | 同步 | 异步 |
|---|---|---|
| 单机 | 涉及 | 涉及 |
| 集群 | 涉及 | 涉及 |
并且由于Redis单机版用的是redis-py这个官方模块,所以集群也需要使用同样的模块。

早期的redis-py不支持集群的连接,网上能查到集群的连接是用另一个模块redis-py-cluster。其实redis-py后面整合了redis-py-cluster集群相关的连接,所以也能支持集群连接。
可以参见包的介绍:https://pypi.org/project/redis/

本文介绍以上4种连接方法。
本地环境:
Python:3.8
Redis:4.3.4
下载docker镜像
redis到目前已经更新到redis7.0.2,本文使用redis5.0.4,同时使用较为简单的docker来部署。首先下载docker镜像 redis 5.0.4
docker pull redis:5.0.4
docker pull redis:5.0.4
5.0.4: Pulling from library/redis
29b80961214d: Pull complete
4c417db3b6fe: Pull complete
262a0c65662c: Pull complete
36db11a6661e: Pull complete
d5d8b9326480: Pull complete
4e9148e44a67: Pull complete
Digest: sha256:2dfa6432744659268d001d16c39f7be52ee73ef7e1001ff80643f0f7bdee117e
Status: Downloaded newer image for redis:5.0.4
docker.io/library/redis:5.0.4
ljk@192 ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5.0.4 b61ab367aee1 3 years ago 90MB
启动redis单机版
docker run -itd --name=redis0 redis:5.0.4
(ymir) ➜ docker run -itd --name=redis0 redis:5.0.4
75ec79bd233c917fb681e224559c67a5e90c55089ffd01b1df8d939795b70746
(ymir) ➜ nacos git:(dev) docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e7ab577003c redis:5.0.4 "docker-entrypoint.s…" 53 seconds ago Up 52 seconds 6379/tcp redis0
查看docker的ip地址
docker inspect redis0

可以得到redis0的ip地址是 172.17.0.8
同步连接redis单机
导入 StrictRedis 模块,连接redis。这里留意一下:
Redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。所以优先使用StrictRedis。
import asyncio
def sync_singal():
from redis import StrictRedis
ip = "172.17.0.8"
redis_conn = StrictRedis(
host=ip,
port=6379,
encoding="utf8",
decode_responses=True,
db=0,
)
redis_conn.set("name", "sync singal")
res = redis_conn.get("name")
print(res)
sync_singal()
结果:
(ymir) ➜ Desktop python redis_learn.py
sync singal
异步连接redis单机
异步编程用官方模块asyncio实现,注意导入的库是redis.asyncio。需要在连接、设置、获取等使用redis的地方可等待。
import asyncio
async def async_singal():
from redis.asyncio import StrictRedis
ip = "172.17.0.8"
redis_conn = await StrictRedis(
host=ip,
port=6379,
encoding="utf8",
decode_responses=True,
db=0,
)
await redis_conn.set("name", "async singal")
res = await redis_conn.get("name")
print(res)
asyncio.run(async_singal())
结果:
(ymir) ➜ Desktop python redis_learn.py
async singal
docker 部署 redis cluster 集群
redis的集群有三种,这里以cluster集群为例,使用docker快速搭建一个cluster集群。
cluster集群要求至少三个节点组建成3个master节点,下面使用6个节点,组成三主三从经典集群。
1.启动docker
docker run -itd --name redis-nodes1 redis:5.0.4 --cluster-enabled yes
docker run -itd --name redis-nodes2 redis:5.0.4 --cluster-enabled yes
docker run -itd --name redis-nodes3 redis:5.0.4 --cluster-enabled yes
docker run -itd --name redis-nodes4 redis:5.0.4 --cluster-enabled yes
docker run -itd --name redis-nodes5 redis:5.0.4 --cluster-enabled yes
docker run -itd --name redis-nodes6 redis:5.0.4 --cluster-enabled yes

2.查询所有docker的ip
查询出所有docker的ip,用于组建集群
docker inspect redis-nodes1
得到所有节点的ip
| 节点 | IP地址 |
|---|---|
| redis-nodes1 | 172.17.0.2 |
| redis-nodes2 | 172.17.0.3 |
| redis-nodes3 | 172.17.0.4 |
| redis-nodes4 | 172.17.0.5 |
| redis-nodes5 | 172.17.0.6 |
| redis-nodes6 | 172.17.0.7 |
- 创建集群
登录到其中一个redis,执行集群创建命令
redis-cli --cluster create 172.17.0.2:6379 172.17.0.3:6379 172.17.0.4:6379 172.17.0.5:6379 172.17.0.6:6379 172.17.0.7:6379 --cluster-replicas 1
--cluster-replicas 1 表示主从节点比例是1:1。如果是0则表示没有从节点

4.检查集群是否创建成功
进入redis客户端,执行命令cluster nodes

如上就表示cluster集群创建成功
同步连接redis cluster集群
从redis.cluster导入RedisCluster,将所有节点信息打包成一个列表
import asyncio
def sync_cluster():
from redis.cluster import ClusterNode
from redis.cluster import RedisCluster
cluster_nodes = [
ClusterNode("172.17.0.2", 6379),
ClusterNode("172.17.0.3", 6379),
ClusterNode("172.17.0.4", 6379),
ClusterNode("172.17.0.5", 6379),
ClusterNode("172.17.0.6", 6379),
ClusterNode("172.17.0.7", 6379),
]
redis_conn = RedisCluster(
startup_nodes=cluster_nodes,
password=None,
encoding="utf8",
decode_responses=True,
)
redis_conn.set("name", "sync cluster")
res = redis_conn.get("name")
print(res)
sync_cluster()
(ymir) ➜ Desktop python redis_learn.py
async singal
异步连接redis cluster集群
从redis.asyncio.cluster中导入ClusterNode和RedisCluster,注意不能用同步模块的ClusterNode,两者名称一致但是方法不同。
async def async_cluster():
from redis.asyncio.cluster import ClusterNode
from redis.asyncio.cluster import RedisCluster
cluster_nodes = [
ClusterNode("172.17.0.2", 6379),
ClusterNode("172.17.0.3", 6379),
ClusterNode("172.17.0.4", 6379),
ClusterNode("172.17.0.5", 6379),
ClusterNode("172.17.0.6", 6379),
ClusterNode("172.17.0.7", 6379),
]
redis_conn = await RedisCluster(
startup_nodes=cluster_nodes,
password=None,
encoding="utf8",
decode_responses=True,
)
await redis_conn.set("name", "async cluster")
res = await redis_conn.get("name")
print(res)
asyncio.run(async_cluster())
结果:
(ymir) ➜ Desktop python redis_learn.py
async cluster
异步集群需要注意的是,如果集群有密码,需要在ClusterNode中设置密码,如下:
cluster_nodes = [
ClusterNode("172.17.0.2", 6379, password="xxx"),
ClusterNode("172.17.0.3", 6379, password="xxx"),
ClusterNode("172.17.0.4", 6379, password="xxx"),
ClusterNode("172.17.0.5", 6379, password="xxx"),
ClusterNode("172.17.0.6", 6379, password="xxx"),
ClusterNode("172.17.0.7", 6379, password="xxx"),
]
看起来比较奇怪,从redis-py的源码和实际使用中看确实如此。
参考:
https://blog.csdn.net/zyooooxie/article/details/123760358
Python 异步集群使用的更多相关文章
- 实现Redis Cluster并实现Python链接集群
目录 一.Redis Cluster简单介绍 二.背景 三.环境准备 3.1 主机环境 3.2 主机规划 四.部署Redis 4.1 安装Redis软件 4.2 编辑Redis配置文件 4.3 启动R ...
- rocketmq 两主两从异步集群搭建
1.安装JDK 需要先卸载系统默认的OPENJDK,安装 JDK1.8 64位的版本. 卸载open-jdk rpm -qa|grep java 查到open jdk的安装. 使用命令 rpm -e ...
- python codis集群客户端(二) - 基于zookeeper对实例创建与摘除
在这一篇中我们实现了不通过zk来编写codis集群proxys的api,http://www.cnblogs.com/kangoroo/p/7481567.html 如果codis集群暴露zk给你的话 ...
- python连接集群mongodb,封装增删改查
1.下载pymongo pip install pymongo 2.直接上代码 [ini配置文件] 封装读ini省略~~ [db.py] class Database(): def __init__( ...
- python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护
在使用codis时候,我们遇到的场景是,公司提供了HA的Proxy(例如N个),但是不暴露zookeeper(也就是说没有codis后端服务列表). 如果暴露zk的话,可以看这一篇,http://ww ...
- Python 检测系统时间,k8s版本,redis集群,etcd,mysql,ceph,kafka
一.概述 线上有一套k8s集群,部署了很多应用.现在需要对一些基础服务做一些常规检测,比如: 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒 k8s版本,要求:k8s的每一个节点的版本必 ...
- 高可用性、负载均衡的mysql集群解决方案
高可用性.负载均衡的mysql集群解决方案 一.mysql的市场占有率 二.mysql为什么受到如此的欢迎 三.mysql数据库系统的优缺点 四.网络服务器的需求 五.什么是mysql的集群 六.什么 ...
- 【MySQL大系】《Mysql集群架构》
原文地址(微信):[技术文章]<Mysql集群架构> 本文地址:http://www.cnblogs.com/aiweixiao/p/7258444.html 点击关注微信公众号 1.主要 ...
- RocketMQ 简单梳理 及 集群部署笔记【转】
一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...
- RocketMQ集群部署记录
RocketMQ集群部署记录 #引用 https://cloud.tencent.com/developer/article/1147765 一.RocketMQ基础知识介绍 A ...
随机推荐
- iptables综合实验: 两个私有网络的互相通迅
环境准备: 主机A IP:192.168.0.6/24 网关改为192.168.0.8 firewallA IP:eth1 192.168.0.8/24 eth0 10.0.0.8/24 删除默认路由 ...
- RDF/RDFS/OWL
RDF(Resource Description Framework 资源描述框架) 知识总是以三元组形式出现: (subject, predicate, object) 即 (主,谓,宾) 资源和属 ...
- .Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
准备俩个项目 第一个是控制台 第二个项目是类库 类库项目中只有一个示例class 将类库的代码生成dll 并且设置属性为复制到输出目录 using System.Runtime.Loader; var ...
- 题解合集 (update on 11.5)
收录已发布的题解 按发布时间排序. 部分可能与我的其他文章有重复捏 qwq . AtCoder for Chinese: Link ZHOJ: Link 洛谷 \(1\sim 5\) : [题解]CF ...
- ES文件传输助手1.0.0
软件下载地址 1.软件功能 与 ES文件浏览器 的快传功能 直接传输文件 支持接受文件点击预览 可以多台电脑使用该软件,从而实现电脑与电脑局域网互传文件 单个文件夹上传会递归上传该文件夹下所有文件夹与 ...
- Windows机器下VSCode安装及使用CmakeLists编译工程demo
使用VSCode, Mingw and Cmake写工程代码,从零开始写的那种,全过程分享...... 你若发现该帖中有待商榷的地方,还请指正赐教,先行拜谢了! 1 软件下载 1.1 vscode下载 ...
- JavaScript入门①-基础知识筑基
01.JavaScript基础知识 JavaScript(缩写:JS)是一种具有面向对象能力的.解释型的程序语言,基于对象和事件驱动,具有相对安全性的客户端脚本语言.JavaScript是一门完备的 ...
- SpringBoot3.x中spring.factories功能被移除的解决方案
背景 笔者所在项目组在搭建一个全新项目的时候选用了SpringBoot3.x,项目中应用了很多SpringBoot2.x时代相关的第三方组件例如baomidou出品的mybatis-plus.dyna ...
- 过两年 JVM 可能就要被 GraalVM 替代了
大家好,我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 今天说一说 Graal ...
- gitlab修改代码提交后显示中文名称
公司要求提交的代码能显示出是哪位提交的,所以要求显示中文名称以便统计工作 修改方法: 打开CMD命令提示符输入页面,输入修改指令: git config --global user.name &quo ...