首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用Python命名当前的Redis主程序(在Docker中运行)

用Python命名当前的Redis主程序(在Docker中运行)
EN

Stack Overflow用户
提问于 2019-08-29 08:06:45
回答 1查看 237关注 0票数 0

如果主人关机,如何使Python故障转移到Redis从服务器?

使用当前的配置,哨兵会选择一个新的主机,但是Python会写stop。

我想我不应该像在docker-come.yml文件中那样使用redis-master;有什么可供选择的?

在网络模式下,我无法让哨兵认出对方。

docker-compose.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3'

services:

  redis-master:
    container_name: redis-master
    image: redis:latest
    command: redis-server --port 6379
    ports:
      - "6379:6379"
    volumes:
      - .:/app

  redis-slave:
    container_name: redis-slave
    image: redis:latest
    command: redis-server --slaveof redis-master 6379 --protected-mode no
    volumes:
       - .:/app

  sentinel-1:
    container_name: sentinel-1
    build: sentinel
    environment:
      - SENTINEL_DOWN_AFTER=5000
      - SENTINEL_FAILOVER=5000

  sentinel-2:
    container_name: sentinel-2
    build: sentinel
    environment:
      - SENTINEL_DOWN_AFTER=5000
      - SENTINEL_FAILOVER=5000

  sentinel-3:
    container_name: sentinel-3
    build: sentinel
    environment:
      - SENTINEL_DOWN_AFTER=5000
      - SENTINEL_FAILOVER=5000

  app:
    container_name: python-app
    image: pyredis
    command: python app.py

Python应用程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import redis
import random
import time

r = redis.StrictRedis(host="redis-master", port=6379, db=0)

for i in range(0, 1000):
    timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
    num = random.randint(1,101)
    r.set(timestamp, num)
    time.sleep(2)

谢谢,如有任何意见请见谅。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-29 08:17:16

您需要一个函数来重新定义您的r值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import redis
from redis.exceptions import ConnectionError

def get_connection(host):
    global r
    other_host = "redis-slave" if "master" in host else "redis-master"

    try:
        r = redis.StrictRedis(host=host, port=6379, db=0)
    except ConnectionError:
        # connection against host failed, try other_host
        host = other_host
        r = redis.StrictRedis(host=host, port=6379, db=0)
    return host


host = get_connection('redis-master')

for i in range(0, 1000):
    timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
    num = random.randint(1,101)
    try:
        r.set(timestamp, num)
    # handles explicitly redis.exceptions.ConnectionError
    except ConnectionError: 
        host = get_connection(host)
        r.set(timestamp, num)
    time.sleep(2)

在主程序下降的情况下,将调用该函数,并将连接切换到从服务器,反之亦然。如果两者都关闭,则外部Exception将引发except,程序将崩溃。

编辑

对于通常是大不-不的可变默认值,这可能是一个非常有趣的用例。Note,我仍然不会在任何生产代码中实现这一点,只是在这里显示了副作用。

deque支持就地旋转,因此您可以使用它来切换hostother_host,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import deque

d = deque(('redis-master', 'redis-slave'), maxlen=2)

d
deque(['redis-master', 'redis-slave'], maxlen=2)

d.rotate()
d
deque(['redis-slave', 'redis-master'], maxlen=2)

现在,您可以使用它作为缓存,只需交换订单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_connection(d=deque(('redis-master', 'redis-slave'), maxlen=2)):
    global r
    host, other_host = d # unpacks the two values

    try:
        r = redis.StrictRedis(host=host, port=6379, db=0)
    except ConnectionError:
        r = redis.StrictRedis(host=other_host, port=6379, db=0)
        d.rotate() # changes the order of the hosts

为了显示这是如何工作的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_connection(d=deque(('redis-master', 'redis-slave'), maxlen=2)):
    print(d)
    try:
        raise ValueError # as a test
    except ValueError:
        print("Caught error")
        d.rotate()
        print(d)


get_connection()
deque(['redis-master', 'redis-slave'], maxlen=2)
Caught error
deque(['redis-slave', 'redis-master'], maxlen=2)

get_connection()
deque(['redis-slave', 'redis-master'], maxlen=2)
Caught error
deque(['redis-master', 'redis-slave'], maxlen=2)

现在,您的外部程序不需要了解host,它只需在必要时调用retry函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i in range(0, 1000):
    timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
    num = random.randint(1,101)
    try:
        r.set(timestamp, num)
    # handles explicitly redis.exceptions.ConnectionError
    except ConnectionError: 
        get_connection() # host doesn't need to be returned anymore
        r.set(timestamp, num)
    time.sleep(2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57714028

复制
相关文章
知识图谱项目前端可视化图论库——Cytoscape.js简介
知识图谱项目是一个强视觉交互性的关系图可视化分析系统,很多模块都会涉及到对节点和关系的增删改查操作,常规的列表展示类数据通过表格展示,表单新增或编辑,而图谱类项目通常需要关系图(力导向图:又叫力学图、力导向布局图,是绘图的一种算法,关系图一般采用这种布局方式)去展示,节点和关系的新增编辑也需要前端去做一些复杂的交互设计。除此之外还有节点和关系的各种布局算法,大量数据展示的性能优化,节点动态展开时的局部布局渲染,画布的可扩展性,样式的自定义等等诸多技术难点。目前国内使用最多的两个已开源的前端可视化框架:阿里的AntV、百度的Echarts对于关系图的支持都比较弱,不能完全满足项目中的需求。
用户7293182
2020/07/20
6.2K0
知识图谱项目前端可视化图论库——Cytoscape.js简介
xml布局异步预加载
项目中针对xml布局加载,一般是使用LayoutInflate.from(context).inflate或则View.inflate来进行,其他方式则是直接new XXXView
人力鹿
2022/12/14
2.5K1
大数据分析:数据可视化图形库(1)
在开源世界中,某些库为数据可视化提供了许多可能性,包括图形或网络表示。其他库仅专注于网络图表示。通常,这些库比通用库提供更多的功能。
加米谷大数据
2019/10/15
1.7K0
大数据分析:数据可视化图形库(1)
62个有用的图形可视化库
在开源世界中,某些库为数据可视化提供了许多可能性,包括图形或网络表示。其他库仅专注于网络图表示。通常,这些库比通用库提供更多的功能。您还将找到商业图形可视化库。商业图书馆的优势在于可以保证持续的技术支持和先进的性能。
IT阅读排行榜
2019/10/23
5.3K0
62个有用的图形可视化库
【Java AWT 图形界面编程】LayoutManager 布局管理器总结 ( FlowLayout 布局 | BorderLayout 布局 | BoxLayout 布局 )
在上一篇博客 【Java AWT 图形界面编程】Container 容器 ③ ( ScrollPane 可滚动容器示例 ) 中 , 向 ScrollPan 中添加了 TextField 文本框 和 Button 按钮 , 但是显示的时候效果如下 :
韩曙亮
2023/03/30
4.2K0
【Java AWT 图形界面编程】LayoutManager 布局管理器总结 ( FlowLayout 布局 | BorderLayout 布局 | BoxLayout 布局 )
R语言图形交互基础二(页面布局)
前面我们介绍了shiny这个包的基础用法,今天我们给大家介绍下如何设定各个元素的布局。其中用到了很多函数我们在此进行一一的描述,真正让大家体验下R语言中的网页前端。首先我们看下页面的类型:
一粒沙
2019/07/31
1.8K0
【Java AWT 图形界面编程】LayoutManager 布局管理器 ③ ( BorderLayout 布局 )
BorderLayout 布局 将 Container 容器 分割成 5 个部分 , 分别是 :
韩曙亮
2023/03/30
8160
【Java AWT 图形界面编程】LayoutManager 布局管理器 ③ ( BorderLayout 布局 )
【Java AWT 图形界面编程】LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )
BoxLayout 布局 不是 AWT 中的布局 , 而是 Swing 中引入的 ;
韩曙亮
2023/03/30
7170
【Java AWT 图形界面编程】LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )
【笔记】《计算机图形学》(8)——图形管线
这系列的笔记来自著名的图形学虎书《Fundamentals of Computer Graphics》,这里我为了保证与最新的技术接轨看的是英文第五版,而没有选择第二版的中文翻译版本。不过在记笔记时多少也会参考一下中文版本
ZifengHuang
2020/08/25
2.7K0
【笔记】《计算机图形学》(8)——图形管线
python图形界面开发之tkinter-布局
任何界面都有自己的布局风格,有些是横向布局,有些是纵向布局,有些是流水布局,还有些是网格布局,总之布局就是一种考虑如何放置元素或者组件的一种说明方式。
程序那些事儿
2023/03/07
8610
python图形界面开发之tkinter-布局
《计算机图形学》
《计算机图形学》与大多数传统的计算机图形学教材不同,它仅简要介绍交互式计算机图形学方面的基本知识,主要侧重于介绍计算机图形学在数学及其他科学领域的应用,解决实际问题。《计算机图形学》按照计算机图形学的传统顺序介绍视觉交流、视图变换和投影处理、建模、绘制、光照、着色处理,以及OpenGL API如何实现基本概念和技术,使学生理解并学会使用图形API实现图形操作,为观察者创造有效的图像。
用户3157710
2018/10/10
6380
《计算机图形学》
Kivy 5种常用图形界面布局初探
它就像人体的骨骼、房屋的钢筋混凝土梁架,支撑起整个图形界面、条理好各个小部件的位置。
州的先生
2021/03/03
3.7K0
Kivy 5种常用图形界面布局初探
【Java AWT 图形界面编程】LayoutManager 布局管理器 ② ( FlowLayout 流式布局 )
如 : 下面的布局就是从左向右的流式布局 , 将 6 个组件放在 FlowLayout 流式布局中 , 1 , 2 , 3 组件放入后 , 再 放入 4 组件 , 发现第 1 排位置不够了 , 遇到障碍 , 此时折 返回左侧 , 另起一行 , 在第 2 排继续从左到右排列 ;
韩曙亮
2023/03/30
8940
【Java AWT 图形界面编程】LayoutManager 布局管理器 ② ( FlowLayout 流式布局 )
计算器界面布局JAVA_用JAVA写的一个简单的图形界面计算器
/*** Created by YunFeng on 2014/12/6 0009.
用户7886150
2021/04/29
1.4K0
php实现图形计算器
存档: index.php 1 <html> 2 <head> 3 <title>图形计算器开发</title> 4 <meta http-equiv="Content-type" content="text/html;charset=utf-8"> 5 </head> 6 7 <body> 8 <center> 9 <h1>图形(周长&面积)计算器</h1> 10
Angel_Kitty
2018/04/08
1.7K0
php实现图形计算器
【笔记】《计算机图形学》(17)——使用图形硬件
这一章介绍了计算机与图形硬件和实际编程相关的内容, 其中主要利用OpenGL简单介绍了实际的图形编程部分, 但是如果想要真正开始OpenGL编程, 查阅其它资料是必不可少的. 注意这一章最新的英文版和中文版由于时代不同所以内容差别非常大, 建议还是阅读英文版本.
ZifengHuang
2021/07/23
1.6K0
【笔记】《计算机图形学》(17)——使用图形硬件
为何云计算巨头都在布局机密计算?
众所周知,数据安全的三大支柱分别是:保护静态数据、传输中数据和使用中数据。其中,静态加密和传输中的数据加密,大家都很熟悉。
科技云报道
2022/04/16
8180
为何云计算巨头都在布局机密计算?
【Java AWT 图形界面编程】LayoutManager 布局管理器 ④ ( GridLayout 网格布局 | GridBagLayout 网格包布局 )
GridLayout 网格布局管理器 可以将 当前的 Container 容器 划分成 网格 , 每个网格 区域 相同 ;
韩曙亮
2023/03/30
2.7K0
【Java AWT 图形界面编程】LayoutManager 布局管理器 ④ ( GridLayout 网格布局 | GridBagLayout 网格包布局 )
【计算机图形学】计算机图形学中的坐标系统
  马三最近开始学习计算机图形学了,买了两本书,其中一本是国内的,还是什么大学的教材,不过写得真不咋样啊。另外一本是大名鼎鼎的《计算机图形学》第四版。最近接触了下计算机图形学中的坐标系统,做个笔记。
马三小伙儿
2018/12/11
1.4K0
【计算机图形学】计算机图形学中的坐标系统
Android布局练习—计算器
小菜鸟布局第一次布局,orz <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TableLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_alignParentBottom=
用户1515472
2019/07/24
8280

相似问题

将命令输出重定向到ksh中的变量和标准输出

239

转位及标准

15

将非标准联接转换为标准连接

10

沉默标准/标准标准

25

GhostScript和标准输入,标准

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文