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 ...
随机推荐
- SoringCloud(四) - 微信获取用户信息
1.项目介绍 2.微信公众平台 和 微信开放文档 2.1 微信公众平台 2.1.1 网址链接 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?ac ...
- 【HarmonyOS】【ArkUI】在Service中使用Emitter
参考资料 1.相关基础知识:触发器Emitter2.启动服务:ServiceAbility开发 开发步骤 第一步:开发界面,界面内容由一个按钮组件+文本组件构成,然后在按钮组件中添加点击事件,开启 ...
- NC-日志配置及代码详解
目录 一.日志文件输出说明 二.日志配置说明 2.1 配置文件路径 2.2 配置格式 2.2.1 参数说明 三.代码说明 四.自定义日志实例 实例1-新建日志类 实例2-直接在代码中使用日志输出 五. ...
- 833(DIV2)——C题题解
题目链接 题目大意: 给定n个数,你可以对数值为0的数改变其为任意值,问最后前缀和为0的个数的最大值. 思路: 这题比较可惜,自己的思路没有问题,但是他少了一些东西.对数组进行前缀和处理,我们可以发现 ...
- 2022春每日一题:Day 14
题目:字符串归类 发现字符串长度总数不大,因此把每个字符串有的字母分离,存放到桶中,再枚举合并即可,时间复杂度O(len) 赛时代码: #include <cstdio> #include ...
- 区分mbr与gpt分区
查看分区类型 [root@localhost ~]# parted -l|egrep 'dev/|Part' Warning: Unable to open /dev/sr0 read-write ( ...
- windows10熄屏断网问题解决
以前用windowsserver的操作系统可以随时随地的远程,最近因工作需要安装了一个windows10的远程设备,发现windows10系统长时间未使用便连不上了,远程不了,ping不通,本地连接断 ...
- i春秋Test
点开是个莫名其妙的网站...看看源码, 第一排好像有点东西 最后也有点东西,所以我们直接百度海洋CMS漏洞(https://www.freebuf.com/vuls/150042.html) 所以这里 ...
- Linux C++目标中添加git版本信息
项目代码根目录下添加一个cmake文件git_version.cmake,内容如下: # get git hash macro(get_git_hash _git_hash) set(ENV{GIT_ ...
- 关于sublime text 3写一个插件
前言 我之前一直想写一个记录自己笔记的软件,可以给因为我都记录在桌面的便签上很乱,以至于便签上满满的全是字母,很难看,但是我有不想写图形化界面,所以最终我选择了写一个sublime 插件,功能就是记录 ...