etcd基本使用

news/2024/11/29 9:00:22/

目录

  • 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: 17237436991929493444member_id: 9372538179322589801revision: 2raft_term: 4
}
ID: 3632582335366158369
TTL: 4
grantedTTL: 5==========0============
refresh_lease resp:[header {cluster_id: 17237436991929493444member_id: 9372538179322589801revision: 2raft_term: 4
}
ID: 3632582335366158369
TTL: 5
]
==========1============
refresh_lease resp:[header {cluster_id: 17237436991929493444member_id: 9372538179322589801revision: 2raft_term: 4
}
ID: 3632582335366158369
TTL: 5
]
==========2============
refresh_lease resp:[header {cluster_id: 17237436991929493444member_id: 9372538179322589801revision: 2raft_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 += 1print(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_iteratorfor 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.ppmy.cn/news/380572.html

相关文章

【每日一题Day237】LC1375二进制字符串前缀一致的次数 | 技巧题

二进制字符串前缀一致的次数【LC1375】 给你一个长度为 n 、下标从 1 开始的二进制字符串&#xff0c;所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位&#xff08;即&#xff0c;将 0 变为 1&#xff09;。 给你一个下标从 1 开始的整数数组 flips &#xff0c;其…

Java的垃圾回收机制详解

目录 1、C语言与Java语言垃圾回收区别 2、System.gc() 3、面试题引入Java垃圾回收 3.1 jvm怎么确定哪些对象应该进行回收 3.1.1 引用计数法 3.1.2 可达性分析算法 3.2 jvm会在什么时候进行垃圾回收的动作 3.2 jvm到底是怎么回收垃圾对象的 4、来回收算法 4.1 标记-清…

Qt6之样式表2

一、样式选择器类型 一般情况下组件最终都会产生父子、子孙等关系&#xff0c;此时样式选择器类型非常重要&#xff0c;它决定着你的类型是否互相直接独立、互相影响和便捷高效的快速设置样式。 1、如下图常见的一个工具栏&#xff0c;切换时鼠标划过是灰色&#xff0c;选中后是…

电动汽车车载充电机 (OBC) 与车载 DC/DC 转换器技术

电动汽车车载充电机 (OBC) 与车载 DC/DC 转换器技术一、高性能电动汽车车载充电机(OBC) 电路二、双向充电机(Bi-OBC &#xff09;技术方案三、车载DC/DC 转换器电路拓扑比较四、充电桩电力电子变换器 电动汽车车载充电机 (OBC) 与车载 DC/DC 转换器技术&#xff1a;https://pan…

18款美规奔驰S500升级车载冰箱系统,提升舒适性

凉爽餐饮随时唾手可得–后排冷藏箱让乘客能够随时享受美味。它完美集成于后排扶手中&#xff0c;容积约为8.5升。

23款迈巴赫S480升级原厂车载冰箱,冰爽冷饮随时唾手可得

大家好&#xff0c;我是小志bzs878&#xff0c;专注名车原厂升级&#xff0c;欢迎戳戳右上角“”号关注一下&#xff0c;持续为您带来精彩改装案例 迈巴赫S480升级原厂车载冰箱&#xff0c; 车载冰箱的配件有&#xff1a;冰箱主体 、储物盒底座、中间板等组成。 冷饮可以随时冷…

车载常见面试题

一.音乐怎么测试&#xff1f; 蓝牙音乐 1.手机端蓝牙不同设置下是否能正常连接&#xff1a;蓝牙打开、蓝牙关闭。 2.手机端播放音乐-手机端操作车载同步&#xff0c;音量、进度条、暂停、播放&#xff1b; 3.手机端播放音乐-车载端操作手机同步&#xff0c;音量、进度条、暂…

【Android车载系列】第2章 车载系统启动与CarService

1 车载启动流程 车载Android启动流程基本是在Android系统的启动流程中&#xff0c;多了Car相关服务。其他流程基本一致&#xff0c;下面我们来看一下Android系统的启动流程。 1.1 Android系统启动流程 Android系统的启动&#xff0c;从设备的开机键长按开始到Android桌面展示&…