etcd基本使用

news2025/2/13 1:53:01

目录

  • CRUD
    • 1、基本的put/get/del
    • 2、获取当前所有的key
    • 3、获取/删除带有前缀的键
  • lease使用
    • 1、创建lease,续租lease,撤销lease
    • 2、将lease attach到key上
  • watch使用
    • watch、watch_once
    • replace
    • delete
    • watch_prefix、watch_prefix_once
    • cancel_watch
    • add_watch_callback
  • 参考

CRUD

1、基本的put/get/del

#普通的get与delete
res = etcd.put('bar')
value, kv_msg = etcd.get('bar')
print(value)
print(etcd.delete('bar'))
print(etcd.get('bar'))

2、获取当前所有的key

print(etcd.put('demo/bar1', 'doot'))
print(etcd.put('demo/bar2', 'doot'))
list_of_kv = list(etcd.get_all())
for value, kv_msg in list_of_kv:
    print("key:{}, value:{}" .format(kv_msg.key, value))

3、获取/删除带有前缀的键

# [2]获取带有前缀的键
list_of_kv = list(etcd.get_prefix('demo/'))
for value, kv_msg in list_of_kv:
    print("key:{}, value:{}" .format(kv_msg.key, value))
# [3]删除带有前缀的键
res = etcd.delete_prefix('demo/')
print(res)
list_of_kv = list(etcd.get_prefix('demo/'))
for value, kv_msg in list_of_kv:
    print("key:{}, value:{}" .format(kv_msg.key, value))

lease使用

1、创建lease,续租lease,撤销lease

import etcd3
import json
import time
etcd = etcd3.client(host='127.0.0.1', port=2379)


# lease使用
# 创建新租约。返回lease对象
new_lease = etcd.lease(5)
print("new_lease:{}" .format(new_lease.__str__()))
etcd.get_lease_info(new_lease.id)
print("get_lease_info:{}" .format(etcd.get_lease_info(new_lease.id)))
# 如果租约到期,附加到该租约的所有密钥都将过期并删除。
# 可以发送租约保持活动消息以刷新 ttl。如果超时了的话续租仍然是可以成功的
for i in range(3):
    # 续租
    print("=========={}============" .format(i))
    res = list(etcd.refresh_lease(new_lease.id))
    # 打印续租是否成功信息
    time.sleep(3)
    print("refresh_lease resp:{}" .format(res))
# time.sleep(5) # 超时的话,打印error
# 撤销租约
try:
    res = etcd.revoke_lease(new_lease.id)
    print("revoke_lease resp:{}" .format(res.__str__()))
except:
    print("revoke_lease error")

# 打印信息如下:
'''
new_lease:<etcd3.leases.Lease object at 0x7fdb5f709220>
get_lease_info:header {
  cluster_id: 17237436991929493444
  member_id: 9372538179322589801
  revision: 2
  raft_term: 4
}
ID: 3632582335366158369
TTL: 4
grantedTTL: 5

==========0============
refresh_lease resp:[header {
  cluster_id: 17237436991929493444
  member_id: 9372538179322589801
  revision: 2
  raft_term: 4
}
ID: 3632582335366158369
TTL: 5
]
==========1============
refresh_lease resp:[header {
  cluster_id: 17237436991929493444
  member_id: 9372538179322589801
  revision: 2
  raft_term: 4
}
ID: 3632582335366158369
TTL: 5
]
==========2============
refresh_lease resp:[header {
  cluster_id: 17237436991929493444
  member_id: 9372538179322589801
  revision: 2
  raft_term: 4
}
ID: 3632582335366158369
TTL: 5
]
revoke_lease resp:None
'''

2、将lease attach到key上

import etcd3
import json
import time
etcd = etcd3.client(host='127.0.0.1', port=2379)

# 基础操作 put get delete
# 获取当前所有存储的key
print(list(etcd.get_all()))

# 创建新租约。返回lease对象
new_lease = etcd.lease(5)
print("new_lease:{}" .format(new_lease.__str__()))
etcd.get_lease_info(new_lease.id)
print("get_lease_info:{}" .format(etcd.get_lease_info(new_lease.id)))
# 将lease attach 到某个key上
etcd.put('/demo/key', 'hello world',lease=new_lease)
# 查看key是否存在
print(list(etcd.get_all()))
time.sleep(6)
# 查看key是否存在
print(list(etcd.get_all()))
etcd.close()

# 打印结果如下:
# [(b'hello', <etcd3.client.KVMetadata object at 0x7f0011933370>)]
# new_lease:<etcd3.leases.Lease object at 0x7f0011933280>
# get_lease_info:header {
#   cluster_id: 17237436991929493444
#   member_id: 9372538179322589801
#   revision: 2
#   raft_term: 4
# }
# ID: 3632582335366158376
# TTL: 4
# grantedTTL: 5

# [(b'hello world', <etcd3.client.KVMetadata object at 0x7f0011933430>), (b'hello', <etcd3.client.KVMetadata object at 0x7f00119333a0>)]
# [(b'hello', <etcd3.client.KVMetadata object at 0x7f0011933400>)]

watch使用

watch、watch_once

我们这里开一个进程watch某一个key,在另外一个进程里进行替换或者删除key。

import etcd3
import json
import time
etcd = etcd3.client(host='127.0.0.1', port=2379)

# 查看当前集群的kv
list_of_kv = list(etcd.get_all())
for value, kv_msg in list_of_kv:
    print("key:{}, value:{}" .format(kv_msg.key, value))
# key:b'key', value:b'hello'

# 对一个key进行watch
# 这里是阻塞的,我们在其他的程序中进行key的修改
events_iterator, cancel = etcd.watch('key')
for event in events_iterator:
    print(event)
print(cancel)
etcd.close()
import etcd3
import json
etcd = etcd3.client(host='127.0.0.1', port=2379)

# 修改key的value
print(etcd.replace('key', initial_value='hello', new_value='hello2'))
print(etcd.get('key'))
# 删除key
print(etcd.delete('key'))
print(etcd.get('key'))
etcd.close()

replace

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YvPzKAbQ-1686715594694)(https://secure2.wostatic.cn/static/gZVLh9NmYvZznHesuyWADS/image.png?auth_key=1686715582-pUevXFKRZcHvGykUC5Tyf6-0-9eca14837447e7675c6f07197ec98296)]

delete

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kvyo8UX-1686715594696)(https://secure2.wostatic.cn/static/v7KA96aRvX5DiwB3UVELAm/image.png?auth_key=1686715582-d29b4JjJVL7XUBhFwgruRs-0-7dd9c4823fe99206dea0c5ea0a435a48)]

可以看到在接收到事件后watch进程仍在监听状态

我们可以使用watch_once在第一个事件后停止

watch_prefix、watch_prefix_once

监视一系列key

import etcd3
import json
import time
etcd = etcd3.client(host='127.0.0.1', port=2379)

print(etcd.put('demo/bar1', 'doot'))
print(etcd.put('demo/bar2', 'doot'))
print(etcd.put('demo/bar3', 'doot'))
print(etcd.put('demo/bar4', 'doot'))
# 查看当前集群的kv
list_of_kv = list(etcd.get_all())
for value, kv_msg in list_of_kv:
    print("key:{}, value:{}" .format(kv_msg.key, value))
# key:b'key', value:b'hello'

# 对一个key进行watch
# 这里是阻塞的,我们在其他的程序中进行key的修改
events_iterator, cancel = etcd.watch_prefix('demo/')
for event in events_iterator:
    print(event)
print(cancel)
etcd.close()


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvevE01p-1686715594696)(https://secure2.wostatic.cn/static/adt2Utq2XXRY8eqqV3vCeX/image.png?auth_key=1686715582-dwyd5YNbmAB61oWtdHyPkY-0-4ad235dce615d1feea8c5052decbbfce)]

cancel_watch

当我们不想继续watch后,我们可以显式取消watch

这里我们在第3次处理watch事件后进行取消

import etcd3
import json
import time
etcd = etcd3.client(host='127.0.0.1', port=2379)

# 查看当前集群的kv
list_of_kv = list(etcd.get_all())
for value, kv_msg in list_of_kv:
    print("key:{}, value:{}" .format(kv_msg.key, value))
# key:b'key', value:b'hello'

# 对一个key进行watch
# 这里是阻塞的,我们在其他的程序中进行key的修改
cnt = 0
events_iterator, cancel = etcd.watch('key')
for event in events_iterator:
    cnt += 1
    print(event)
    print("handle times:{}" .format(cnt))
    if 3 == cnt:
        cancel() # cancel底层调用的就是cancel_watch(watchid)
        print("cancel watch")
etcd.close()

在这里插入图片描述

很显然,如果我们在主线程进行event监控,会造成主线程阻塞。

add_watch_callback

我们可以向watch加入回调函数,这样就不会阻塞主进程了。

import etcd3
import time
etcd = etcd3.client(host='127.0.0.1', port=2379)

def callback(resp):
    # resp is a events_iterator
    for event in resp.events:
        print("Key:{}发生改变, 新的value是:{}" .format(event.key, event.value))

etcd.add_watch_callback('key', callback)
# 程序主流程
while True:
    time.sleep(1)


在这里插入图片描述

参考

https://www.modb.pro/db/53046

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音整治短剧类小程序内容

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 短剧CPS项目这两年不是挺火的吗&#xff0c;很多草根创业者都在做短剧CPS当副业。 前两天&#xff0c;抖音开放平台团队发布公告&#xff1a; 近期&#xff0c;在微短剧类小程序内容合规排查中&am…

【LeetCode】HOT 100(11)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

工作多年的工作焦虑症-广泛性焦虑症

我相信工作多年的人都会有自己的工作焦虑症的情况&#xff0c;而我们普通人最多的最容易的也就是广泛性焦虑症&#xff0c;广泛性焦虑障碍&#xff08;GAD&#xff09;是一种常见的慢性焦虑障碍&#xff0c;患者长时间处于一种担心、紧张、无法放松的状态。它会让一种广泛的担心…

采购协同:企业数字化转型的关键环节

企业数字化转型已成为当今市场的主流趋势&#xff0c;而采购协同作为企业数字化转型的关键环节&#xff0c;对于企业的成本控制、供应链管理等方面都有着至关重要的影响。本文将围绕采购协同的重要性、数字化转型的方法和优势、以及实现采购协同的关键环节展开讨论。 一、采购协…

Java并发容器 并发队列

并发容器概览 ConcurrentHashMap : 线程安全的HashMap CopyOnWriteArrayList: 线程安全的List BlockingQueue:这是一个接口&#xff0c;表示阻塞队列&#xff0c;非常适合用于作为数据共享的通道 ConcurrentLinkedQueue : 高效的非阻塞并发队列&#xff0c;使用链表实现。可…

目标检测数据集---道路破损缺陷数据集

✨✨✨✨✨✨目标检测数据集✨✨✨✨✨✨ 本专栏提供各种场景的数据集,主要聚焦:工业缺陷检测数据集、小目标数据集、遥感数据集、红外小目标数据集,该专栏的数据集会在多个专栏进行验证,在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显的数据集会在该…

Java list安全删除元素详解

背景 前一段时间被问到了关于 List 集合的安全删除元素问题。一时间没反应过来这问题问的是什么&#xff0c;安全体现在什么地方&#xff0c;线程安全&#xff1f;线程安全可以保证元素粒度的数据唯一吗&#xff1f;删除是指什么&#xff0c;list.remove()&#xff1f; 带着这…

5外包功能测试做完,人废了一半····

先说一下自己的情况。大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近5年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

剑指offer35 复杂链表的复制

复杂链表的复制 文章目录 复杂链表的复制方法一 回溯哈希表第二种解释 方法二&#xff1a;拼接拆分算法流程 参考文献 本题要求我们对一个复杂链表进行复制。在复杂链表中&#xff0c;每个节点除了有一个next指针指向下一个节点&#xff0c;还有一个random指针指向链表中的任意…

SpringBoot+Vue 车辆充电桩系统

文章目录 1、效果演示效果图技术栈 2、 前言介绍&#xff08;完整源码请私聊&#xff09;3、主要技术3.4.1 数据库概念结构设计3.4.2 数据库具体设计 4 系统功能的具体实现4.1 前台功能模块4.1.1 首页功能4.1.2 用户后台管理 4.2 后台功能模块4.2.1 管理员功能4.2.2 维修员功能…

后端(三):后端实战(表白墙的设计)

上一章结束了 Servlet 的学习&#xff0c;ok&#xff0c;现在我们已经学会了 1 1 了&#xff0c;现在开始我们要学会 百以内的加减乘除法。 本章就做一个最简单的 小小项目&#xff1a;表白墙。 在开始表白墙项目开始之间&#xff0c;我们先提前说好&#xff0c;这里主要跟关…

海思3559万能平台搭建:SPI输出h264码流

前言 面对各种各样的客户需求&#xff0c;spi接口也是一种传码流的形式&#xff0c;spi同步422可以保证抗干扰能力强的同时传输距离也很长&#xff0c;本文会介绍海思平台spi作为主机的发送功能以及发送码流的处理方式 1. 管脚复用&#xff1a; 首先需要配置的肯定是管脚复用&…

java容器排序

Java的容器 在Java中&#xff0c;我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸&#xff0c;而通常来说&#xff0c;程序总是在运行时根据条件来创建对象&#xff0c;我们无法预知将要创建对象的个数以及类型&#xff0c;所以Java推出了容器…

动态规划-最长的回文序列

这里写自定义目录标题 1 描述2 样例2.1 样例12.2 样例2 3 解题思路以及实现方法3.1 解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 题解3.2.1 C实现3.2.2 java实现 该题是lintcode上 667 最长的回文序列&#xff0c;该题的解题思路亦是参…

方法选对,事半功倍:数据分析方法

人们发明了数据可视化&#xff0c;利用人类大脑更善于处理图像信息的特点&#xff0c;透过图形化的手段&#xff0c;用图表清晰有效地传达和沟通信息。把以往庞杂、繁乱的数据报表转化成简洁明了的可视化图表。 通过数据可视化制作出的图表&#xff0c;不再像传统分析方案那样…

JavaScript Web APIs学习总结

以后声明变量我们有限使用哪一个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#xff0c;只要地址不变&…

月入6000+的CSGO游戏搬砖项目操作细节和要求

月入6000的CSGO游戏搬砖项目操作细节和要求 最近咨询CSGO搬砖项目的人较多&#xff0c;在此整理一份统一的项目操作细节和要求。 1、什么是国外Steam游戏装备汇率差项目&#xff1f; 这个项目的基本原理是&#xff1a;购买国外Steam游戏平台上的装备&#xff0c;再在国内网易…

SSR渲染--02--nuxt demo(vue)

cmd 打开命令提示符&#xff0c;创建nuxt npm i create-nuxt-app -g create-nuxt-app vue-honor-of-kings&#xff08;这个是我的项目名&#xff0c;输入自己的项目名&#xff09; npm run dev创建的具体配置 【写demo为了方便&#xff0c;我直接下载了Element的包&#xff0…

游戏画面延迟的原因及解决方法

游戏画面延迟&#xff0c;是玩家在游戏中操作后&#xff0c;画面反应出现滞后或卡顿的现象。这会严重影响玩家的游戏体验和竞技水平&#xff0c;尤其是在一些需要高速反应和精确操作的3A大作中&#xff0c;画面延迟可能导致玩家错失良机或者被敌人击败。 那么&#xff0c;游戏…

电能质量监测装置在某半导体公司的应用

摘 要&#xff1a;半导体生产制造业在国民经济中起着举足轻重的作用&#xff0c;相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证&#xff0c;还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…