目前在做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
  1. 创建集群

    登录到其中一个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中导入ClusterNodeRedisCluster,注意不能用同步模块的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 异步集群使用的更多相关文章

  1. 实现Redis Cluster并实现Python链接集群

    目录 一.Redis Cluster简单介绍 二.背景 三.环境准备 3.1 主机环境 3.2 主机规划 四.部署Redis 4.1 安装Redis软件 4.2 编辑Redis配置文件 4.3 启动R ...

  2. rocketmq 两主两从异步集群搭建

    1.安装JDK 需要先卸载系统默认的OPENJDK,安装 JDK1.8 64位的版本. 卸载open-jdk rpm -qa|grep java 查到open jdk的安装. 使用命令 rpm -e ...

  3. python codis集群客户端(二) - 基于zookeeper对实例创建与摘除

    在这一篇中我们实现了不通过zk来编写codis集群proxys的api,http://www.cnblogs.com/kangoroo/p/7481567.html 如果codis集群暴露zk给你的话 ...

  4. python连接集群mongodb,封装增删改查

    1.下载pymongo pip install pymongo 2.直接上代码 [ini配置文件] 封装读ini省略~~ [db.py] class Database(): def __init__( ...

  5. python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护

    在使用codis时候,我们遇到的场景是,公司提供了HA的Proxy(例如N个),但是不暴露zookeeper(也就是说没有codis后端服务列表). 如果暴露zk的话,可以看这一篇,http://ww ...

  6. Python 检测系统时间,k8s版本,redis集群,etcd,mysql,ceph,kafka

    一.概述 线上有一套k8s集群,部署了很多应用.现在需要对一些基础服务做一些常规检测,比如: 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒 k8s版本,要求:k8s的每一个节点的版本必 ...

  7. 高可用性、负载均衡的mysql集群解决方案

    高可用性.负载均衡的mysql集群解决方案 一.mysql的市场占有率 二.mysql为什么受到如此的欢迎 三.mysql数据库系统的优缺点 四.网络服务器的需求 五.什么是mysql的集群 六.什么 ...

  8. 【MySQL大系】《Mysql集群架构》

    原文地址(微信):[技术文章]<Mysql集群架构> 本文地址:http://www.cnblogs.com/aiweixiao/p/7258444.html 点击关注微信公众号 1.主要 ...

  9. RocketMQ 简单梳理 及 集群部署笔记【转】

    一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...

  10. RocketMQ集群部署记录

    RocketMQ集群部署记录 #引用    https://cloud.tencent.com/developer/article/1147765         一.RocketMQ基础知识介绍 A ...

随机推荐

  1. 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 删除默认路由 ...

  2. RDF/RDFS/OWL

    RDF(Resource Description Framework 资源描述框架) 知识总是以三元组形式出现: (subject, predicate, object) 即 (主,谓,宾) 资源和属 ...

  3. .Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集

    准备俩个项目 第一个是控制台 第二个项目是类库 类库项目中只有一个示例class 将类库的代码生成dll 并且设置属性为复制到输出目录 using System.Runtime.Loader; var ...

  4. 题解合集 (update on 11.5)

    收录已发布的题解 按发布时间排序. 部分可能与我的其他文章有重复捏 qwq . AtCoder for Chinese: Link ZHOJ: Link 洛谷 \(1\sim 5\) : [题解]CF ...

  5. ES文件传输助手1.0.0

    软件下载地址 1.软件功能 与 ES文件浏览器 的快传功能 直接传输文件 支持接受文件点击预览 可以多台电脑使用该软件,从而实现电脑与电脑局域网互传文件 单个文件夹上传会递归上传该文件夹下所有文件夹与 ...

  6. Windows机器下VSCode安装及使用CmakeLists编译工程demo

    使用VSCode, Mingw and Cmake写工程代码,从零开始写的那种,全过程分享...... 你若发现该帖中有待商榷的地方,还请指正赐教,先行拜谢了! 1 软件下载 1.1 vscode下载 ...

  7. JavaScript入门①-基础知识筑基

    01.JavaScript基础知识 JavaScript(缩写:JS)是一种具有面向对象能力的.解释型的程序语言,基于对象和事件驱动,具有相对安全性的客户端脚本语言.JavaScript是一门完备的 ...

  8. SpringBoot3.x中spring.factories功能被移除的解决方案

    背景 笔者所在项目组在搭建一个全新项目的时候选用了SpringBoot3.x,项目中应用了很多SpringBoot2.x时代相关的第三方组件例如baomidou出品的mybatis-plus.dyna ...

  9. 过两年 JVM 可能就要被 GraalVM 替代了

    大家好,我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 今天说一说 Graal ...

  10. gitlab修改代码提交后显示中文名称

    公司要求提交的代码能显示出是哪位提交的,所以要求显示中文名称以便统计工作 修改方法: 打开CMD命令提示符输入页面,输入修改指令: git config --global user.name &quo ...