为了提供服务发现以及健康检测,Consul提供了非常容易使用的键/值对存储。它能被用于存储动态配置信息,帮助服务协作,建构leader选举机制,以及开发者可以想到的建构任何其它的东西。

本篇假设你至少有一个Consul代理在运行。

简单使用

为了展示存储键/值对是非常简单的,我们将在键/值存储里维护一些键。

我们在运行代理步骤中展示了查询本地代理,我们先验证键/值存储中没有任何键存在:

$ curl -v http://localhost:8500/v1/kv/?recurse
* About to connect() to localhost port 8500 (#0)
*   Trying 127.0.0.1... connected
> GET /v1/kv/?recurse HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 404 Not Found
< X-Consul-Index: 1
< Date: Fri, 11 Apr 2014 02:10:28 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host localhost left intact
* Closing connection #0

因为没有任何键,所以我们得到了404的响应,我们可以用 PUT 来存储一些键:

$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1
true
$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key2?flags=42
true
$ curl -X PUT -d 'test'  http://localhost:8500/v1/kv/web/sub/key3
true
$ curl http://localhost:8500/v1/kv/?recurse
[{"CreateIndex":97,"ModifyIndex":97,"Key":"web/key1","Flags":0,"Value":"dGVzdA=="},{"CreateIndex":98,"ModifyIndex":98,"Key":"web/key2","Flags":42,"Value":"dGVzdA=="},{"CreateIndex":99,"ModifyIndex":99,"Key":"web/sub/key3","Flags":0,"Value":"dGVzdA=="}]

这里我们创建了3个键,每个都关联了值"test"。注意  字段的返回是基于base64的编码,该编码允许非UTF8字符集。对于键"web/key2",我们为其设置了一个42的 标记。所有的键都支持设置一个64位长的整形标记值。这个标记并不是由Consul内部使用的,它可以被用于存储任意键值对的元数据信息。

在设置值之后,我们使用 ?recurse 参数发出了 GET 请求来接收多个键的信息。

你也可以非常容易地获取单个键的信息:

$ curl http://localhost:8500/v1/kv/web/key1
[{"CreateIndex":97,"ModifyIndex":97,"Key":"web/key1","Flags":0,"Value":"dGVzdA=="}]

删除一个键也同样非常简单,使用 DELETE 来删除一个键。我们可以指定完整路径来删除单独一个键,或者使用"?recurse"递归删除所有的键:

$ curl -X DELETE http://localhost:8500/v1/kv/web/sub?recurse
$ curl http://localhost:8500/v1/kv/web?recurse
[{"CreateIndex":97,"ModifyIndex":97,"Key":"web/key1","Flags":0,"Value":"dGVzdA=="},{"CreateIndex":98,"ModifyIndex":98,"Key":"web/key2","Flags":42,"Value":"dGVzdA=="}]

使用一个 PUT 请求相同的URI并且提供一个不同的消息体就可以修改指定的键,Consul提供了一个 检测并设置 的操作,对应的操作是原子的。通过在GET请求中提供 ?cas= 参数以及指定最新的 ModifyIndex 值我们就可以得到原子CAS操作。例如,假设我们想要更新"web/key1":

$ curl -X PUT -d 'newval' http://localhost:8500/v1/kv/web/key1?cas=97
true
$ curl -X PUT -d 'newval' http://localhost:8500/v1/kv/web/key1?cas=97
false

这里,第一个CAS更新成功了因为最新的 ModifyIndex 是97,而第二个操作失败了因为最新的 ModifyIndex 不再是97了。

我们可以使用 ModifyIndex 来等待指定键值的改变,例如,假设我们想要等待Key2的修改:

$ curl "http://localhost:8500/v1/kv/web/key2?index=101&wait=5s"
[{"CreateIndex":98,"ModifyIndex":101,"Key":"web/key2","Flags":42,"Value":"dGVzdA=="}]

通过提供"?index="参数,我们请求等待直到键包含了一个大于101的 ModifyIndex 的值。无论如何由于"?wait=5"参数限制了查询最多等待5秒,之后会返回当前没有修改的值。该操作可以高效地等待键的更新。另外相同的方法可以用于等待一个键的集合,直到键集合中任何一个键发生的更新。

下一步

这里的例子仅仅展示了部分的API使用。如果需要完整的文档,请查询the /kv/ route of the HTTP API。

下一步,我们将看看Consul支持的[web界面]()中的选项

Consul入门06 - 键/值对数据相关推荐

  1. 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 追加键值对数据 | 更新键值对数据 )

    文章目录 一.追加键值对数据 二.更新键值对数据 三.完整代码示例 一.追加键值对数据 在上一篇博客 [C 语言]文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取 ...

  2. 封装批量获取键值对数据的方法

    有时候,我们通过 array_column 或者循环做了一个键值对 key value,如果是根据一个key获取数据就很简单直接用 isset($list[$key])?$list[$key]:&qu ...

  3. Redis入门-基础键值对、list、set、hashlist基础操作

    关于Redis Redis是非关系型数据库(NoSQL)的一种,区别于关系型数据库.其内部数据间相互独立,性能表现优秀.即使是在大量数据下性能也很好,这都得益于其数据结构简单,数据间相互独立的特性.而 ...

  4. mysql主键自增为什么在插入的时候还要自己写主键值_数据库主键自增插入显示值...

    SQL Server 2008 数据库主键自增插入显示值 前几天在工作的时候遇到在删除数据库中表的数据的时候,删除之后,重新添加的数据没有得到原来的数据的id值(表中id为主键,且设置为自增) ,使用 ...

  5. html键值对与名称值对的区别,使用网络存储存储键值对的数据-HTML5教程

    本节课的内容是介绍网络存储,使用它在浏览器里存储键值对的数据,功能上像以前的cookie一样,不过他更好,存储的数据可以大小.有两种类型的网络存储:本地存储和会话存储,他们使用相同的实现机制,只是可见 ...

  6. map,存储多个键值对的数据集合

    在ES5中,我们使用的是对象的方式来存储键值对,键是属性名,值是属性值,这种方法有以下问题 1)键名只能是字符串 2)获取数据的数量不方便 3)键名容易跟原型上的名称冲突 ES6中新增了map集合专门 ...

  7. Android官方开发文档Training系列课程中文版:数据存储之键值对序列存储

    原文地址:http://android.xsoftlab.net/training/basics/data-storage/index.html 引言 大多数的安卓APP需要保存数据,即使仅仅存储在o ...

  8. Hive 数据聚合成键值对时,根据值大小进行排序

    背景 最近对用户的行为数据进行统计分析时,需要列出不同用户的具体详情,方便进行观察,在hive中虽然有排序函数,但是处理键值对数据时,不能根据值进行排序,需要巧妙借助中间过程来处理,总结出来与大家进行 ...

  9. Matlab使用键值数据读取和分析 MAT 文件

    为 MAT 文件中的键值对数据创建数据存储,该文件是mapreduce. 然后,该示例展示了如何读取数据存储中的所有数据并对其进行排序.此示例假定 MAT 文件中的数据适合内存. mapredout. ...

最新文章

  1. 使用css实现瀑布流的效果
  2. 怎么定义list_常用的List接口下集合
  3. Enterprise Library1.0 -- DataAccess Application Block
  4. pstools套件在渗透中的应用详解
  5. Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)...
  6. 日照职业单招计算机专业,日照职业技术学院单招专业介绍-机电一体化技术
  7. asp.net电子商务开发实战 视频 第二讲 (下)
  8. 西邮计算机学院院长,西安邮电大学计算机学院
  9. STC 芯片编写串口数据方法。
  10. 做图工具pyecharts
  11. openresty ngx.ctx表
  12. 读叔本华之《人生的智慧》
  13. 浅谈机器学习之深度学习
  14. mysql高效查出重复的手机号_Mysql必读MySQL大表中重复字段的高效率查询方法
  15. 解决utf-8‘ codec can‘t decode byte 0xca in position 0: invalid continuation byte
  16. 【Linux编程】进程间通信(IPC)C语言实现
  17. 暑假实训-3_Oracle数据库-3_单行函数
  18. TextView设置MaxLength
  19. 看这玩意复习你还会挂科?《数据结构篇》
  20. 微信小程序版博客——开发汇总总结(附源码)

热门文章

  1. Highcharts在IE中不能一次性正常显示的一种解决办法
  2. OCR磁盘的导出和导入、备份和恢复以及移动(ocrconfig命令的应用)
  3. 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null
  4. 窗口!窗口!- Windows程序设计(SDK)003
  5. 《火球——UML大战需求分析》(第2章 耗尽脑汁的需求分析工作)——2.3 给客户带来价值,需求分析之正路...
  6. SQL Server 2012 Express LocalDB
  7. linux下bochs启动黑屏解决办法
  8. linux DNS服务器配置
  9. windows下live555+rtsp+ffmpeg媒体源,nginx+rtmp转发服务器,vlc播放rtmp媒体流
  10. 在非UI线程中处理Bitmap