经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python 异步集群使用
来源:cnblogs  作者:金色旭光  时间:2023/2/2 9:23:17  对本文有异议

目前在做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

  1. docker pull redis:5.0.4
  1. docker pull redis:5.0.4
  2. 5.0.4: Pulling from library/redis
  3. 29b80961214d: Pull complete
  4. 4c417db3b6fe: Pull complete
  5. 262a0c65662c: Pull complete
  6. 36db11a6661e: Pull complete
  7. d5d8b9326480: Pull complete
  8. 4e9148e44a67: Pull complete
  9. Digest: sha256:2dfa6432744659268d001d16c39f7be52ee73ef7e1001ff80643f0f7bdee117e
  10. Status: Downloaded newer image for redis:5.0.4
  11. docker.io/library/redis:5.0.4
  1. ljk@192 ~ % docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. redis 5.0.4 b61ab367aee1 3 years ago 90MB

启动redis单机版

  1. docker run -itd --name=redis0 redis:5.0.4
  1. (ymir) ? docker run -itd --name=redis0 redis:5.0.4
  2. 75ec79bd233c917fb681e224559c67a5e90c55089ffd01b1df8d939795b70746
  3. (ymir) ? nacos git:(dev) docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 4e7ab577003c redis:5.0.4 "docker-entrypoint.s…" 53 seconds ago Up 52 seconds 6379/tcp redis0

查看docker的ip地址

  1. docker inspect redis0

可以得到redis0的ip地址是 172.17.0.8

同步连接redis单机

导入 StrictRedis 模块,连接redis。这里留意一下:
Redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。所以优先使用StrictRedis。

  1. import asyncio
  2. def sync_singal():
  3. from redis import StrictRedis
  4. ip = "172.17.0.8"
  5. redis_conn = StrictRedis(
  6. host=ip,
  7. port=6379,
  8. encoding="utf8",
  9. decode_responses=True,
  10. db=0,
  11. )
  12. redis_conn.set("name", "sync singal")
  13. res = redis_conn.get("name")
  14. print(res)
  15. sync_singal()

结果:

  1. (ymir) ? Desktop python redis_learn.py
  2. sync singal

异步连接redis单机

异步编程用官方模块asyncio实现,注意导入的库是redis.asyncio。需要在连接、设置、获取等使用redis的地方可等待。

  1. import asyncio
  2. async def async_singal():
  3. from redis.asyncio import StrictRedis
  4. ip = "172.17.0.8"
  5. redis_conn = await StrictRedis(
  6. host=ip,
  7. port=6379,
  8. encoding="utf8",
  9. decode_responses=True,
  10. db=0,
  11. )
  12. await redis_conn.set("name", "async singal")
  13. res = await redis_conn.get("name")
  14. print(res)
  15. asyncio.run(async_singal())

结果:

  1. (ymir) ? Desktop python redis_learn.py
  2. async singal

docker 部署 redis cluster 集群

redis的集群有三种,这里以cluster集群为例,使用docker快速搭建一个cluster集群。
cluster集群要求至少三个节点组建成3个master节点,下面使用6个节点,组成三主三从经典集群。

1.启动docker

  1. docker run -itd --name redis-nodes1 redis:5.0.4 --cluster-enabled yes
  2. docker run -itd --name redis-nodes2 redis:5.0.4 --cluster-enabled yes
  3. docker run -itd --name redis-nodes3 redis:5.0.4 --cluster-enabled yes
  4. docker run -itd --name redis-nodes4 redis:5.0.4 --cluster-enabled yes
  5. docker run -itd --name redis-nodes5 redis:5.0.4 --cluster-enabled yes
  6. docker run -itd --name redis-nodes6 redis:5.0.4 --cluster-enabled yes

2.查询所有docker的ip
查询出所有docker的ip,用于组建集群

  1. 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,执行集群创建命令
  1. 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,将所有节点信息打包成一个列表

  1. import asyncio
  2. def sync_cluster():
  3. from redis.cluster import ClusterNode
  4. from redis.cluster import RedisCluster
  5. cluster_nodes = [
  6. ClusterNode("172.17.0.2", 6379),
  7. ClusterNode("172.17.0.3", 6379),
  8. ClusterNode("172.17.0.4", 6379),
  9. ClusterNode("172.17.0.5", 6379),
  10. ClusterNode("172.17.0.6", 6379),
  11. ClusterNode("172.17.0.7", 6379),
  12. ]
  13. redis_conn = RedisCluster(
  14. startup_nodes=cluster_nodes,
  15. password=None,
  16. encoding="utf8",
  17. decode_responses=True,
  18. )
  19. redis_conn.set("name", "sync cluster")
  20. res = redis_conn.get("name")
  21. print(res)
  22. sync_cluster()
  1. (ymir) ? Desktop python redis_learn.py
  2. async singal

异步连接redis cluster集群

redis.asyncio.cluster中导入ClusterNodeRedisCluster,注意不能用同步模块的ClusterNode,两者名称一致但是方法不同。

  1. async def async_cluster():
  2. from redis.asyncio.cluster import ClusterNode
  3. from redis.asyncio.cluster import RedisCluster
  4. cluster_nodes = [
  5. ClusterNode("172.17.0.2", 6379),
  6. ClusterNode("172.17.0.3", 6379),
  7. ClusterNode("172.17.0.4", 6379),
  8. ClusterNode("172.17.0.5", 6379),
  9. ClusterNode("172.17.0.6", 6379),
  10. ClusterNode("172.17.0.7", 6379),
  11. ]
  12. redis_conn = await RedisCluster(
  13. startup_nodes=cluster_nodes,
  14. password=None,
  15. encoding="utf8",
  16. decode_responses=True,
  17. )
  18. await redis_conn.set("name", "async cluster")
  19. res = await redis_conn.get("name")
  20. print(res)
  21. asyncio.run(async_cluster())

结果:

  1. (ymir) ? Desktop python redis_learn.py
  2. async cluster

异步集群需要注意的是,如果集群有密码,需要在ClusterNode中设置密码,如下:

  1. cluster_nodes = [
  2. ClusterNode("172.17.0.2", 6379, password="xxx"),
  3. ClusterNode("172.17.0.3", 6379, password="xxx"),
  4. ClusterNode("172.17.0.4", 6379, password="xxx"),
  5. ClusterNode("172.17.0.5", 6379, password="xxx"),
  6. ClusterNode("172.17.0.6", 6379, password="xxx"),
  7. ClusterNode("172.17.0.7", 6379, password="xxx"),
  8. ]

看起来比较奇怪,从redis-py的源码和实际使用中看确实如此。

参考:
https://blog.csdn.net/zyooooxie/article/details/123760358

原文链接:https://www.cnblogs.com/goldsunshine/p/17083787.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号