LWWReg

LWW Register是一种数据结构,用于存储一个值和一个时间戳,支持读取和写入操作。在写入时,如果新的时间戳比原来的时间戳更大,那么就更新值和时间戳;在读取时,直接返回当前的值。这个数据结构可以用于分布式系统中,支持多个节点对同一个值进行读写操作,最终保证一致性。其中,merge函数用于合并两个LWW Register,返回时间戳更大的那个。

举例说明各个函数的运行功能:

  1. LWWReg()函数返回一个字典,包含'value'和'timestamp'两个键值对,分别表示当前存储的值和时间戳。
  2. zero()函数返回一个空的LWW Register。
  3. value(r)函数返回LWW Register中存储的值。
  4. set_val(r, value, timestamp)函数用于向LWW Register中写入新的值和时间戳。如果新的时间戳比原来的时间戳更大,那么就更新值和时间戳。最后返回更新后的LWW Register。
  5. merge(r1, r2)函数用于合并两个LWW Register。如果r1的时间戳更大,就返回r1;否则返回r2。
def LWWReg():
return {'value': None, 'timestamp': 0} def zero():
return LWWReg() def value(r: LWWReg):
return r['value'] def set_val(r: LWWReg, value, timestamp):
if (r['timestamp'] < timestamp):
r['value'] = value
r['timestamp'] = timestamp
return r def merge(r1: LWWReg, r2: LWWReg):
if (r1['timestamp'] > r2['timestamp']):
return r1
else:
return r2
public class LWWReg {
public static Map<String, Object> LWWReg() {
Map<String, Object> map = new HashMap<>();
map.put("value", null);
map.put("timestamp", 0);
return map;
} public static Map<String, Object> zero() {
return LWWReg();
} public static Object value(Map<String, Object> r) {
return r.get("value");
} public static Map<String, Object> set_val(Map<String, Object> r, Object value, int timestamp) {
if ((int)r.get("timestamp") < timestamp) {
r.put("value", value);
r.put("timestamp", timestamp);
}
return r;
} public static Map<String, Object> merge(Map<String, Object> r1, Map<String, Object> r2) {
if ((int)r1.get("timestamp") > (int)r2.get("timestamp")) {
return r1;
} else {
return r2;
}
}
}

实现一个CRDT工具库——LWWReg的更多相关文章

  1. 如何手写一个js工具库?同时发布到npm上

    自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...

  2. [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)

    所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...

  3. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)

    我们接着上一篇的继续,在上一篇我们完成了工具库的架构,本文扩展字符串去空格的方法, 一共有3个 1,trimLeft: 去除字符串左边的空格 2,trimRight: 去除字符串右边的空格 3,tri ...

  4. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展字符串位置方法(4)

    本文,我们接着之前的框架继续扩展,这次扩展了一共有5个与字符串位置相关的方法 between( left, right ) 返回两个字符串之间的内容, 如果第二个参数没有传递,返回的是找到的第一个参数 ...

  5. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展camelize与dasherize方法(3)

    在此之前,我们已经完成了4个方法: trimLeft, trimRight, trim, capitalize 本文,我们扩展驼峰式与下划线转化这两个对称的方法 camelize: 把空格,下划线,中 ...

  6. 一个PHP高性能、多并发、restful的工具库(基于multi_curl)

    This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...

  7. Underscore.js工具库

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:“如果我面对一个空白的 HTML ...

  8. JavaScript工具库

    jPublic 交流QQ群:1017567122 前言 在我们开发项目的时候,无论项目规模大小,在所难免会写一些工具型函数来解决一些问题,随着项目开发和维护的时间越来越长,这些工具型函数会越来越多,同 ...

  9. 手把手教你使用Rollup打包📦并发布自己的工具库🔧

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...

  10. 自己的一个LESS工具函数库

    自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...

随机推荐

  1. Calendar设定月份时要注意日期

    先看下代码 public static void main(String[] args) { int dataMonth = 4; DateFormat dateFormat = new Simple ...

  2. Layui分页与springboots

    service.java public List<Menu> listAllMenuPage(PageData pd) throws Exception{ List<Menu> ...

  3. js-classList用法学习记录1

    classList introduction: 学习后我的个人理解是,在给html中创建的类一系列操作的方法调用. detailed method: 网站具体介绍(菜鸟) add:添加类,已有则不添加 ...

  4. selenium定位元素位置-xpath

    xpath定位元素位置: 1.定位父兄节点: <div> <span>我是span1标签</span> <a id="1" href=&q ...

  5. RS485总线常用拓扑结构

    RS485总线拓扑结构一般可分为以下4种,分别是:总线型拓扑结构.星型拓扑结构.树形拓扑结构.环形拓扑结构.根据RS485总线布线规范,只能按照总线拓扑结构布线,但是由于现场环境复杂多变,为了能够使整 ...

  6. mysql创建数据库,用户,授权基操

    # 创建数据库create database test; # 创建用户并设置密码 create user 'test'@'%' identified by '123456';# 设置密码SET PAS ...

  7. 8.Vuex状态管理

    一.Vuex 概述 1.1 组件之间共享数据的方式 父传子: v-bind 属性绑定 子传父: v-on 事件绑定 兄弟组件之间共享数据: EventBus $on 接收数据的那个组件 (数据接收方) ...

  8. 【随笔】记录Centos7 firewall-cmd防火墙的文档与命令记录

    注意:firewall-cmd命令后面的参数前面是两个短-,这里显示的不是很清晰 查看firewall-cmd运行状态 # firewall-cmd --state 开放8080端口 # firewa ...

  9. C++ 几款IDE和编程平台的选择分析

    最近闲来无事,就研究了一下几个编程平台和IDE.首先,我必须强调一下,这些方案研究并不一定适用于商业公司内部编程平台选择,而是给个人学习或者闲暇之余把玩用的.主要从以下几个指标考量:使用体验.跨平台. ...

  10. 关于QT编译程序找不到MSVCRT.DLL和其他动态链接库的解决办法

    先上图(一大堆无法解析的外部符号): 解决办法分两个步骤: 1.系统环境变量设置,把这些dll文件所在目录加入到PATH中.比如C:\Windows\SysWOW64, C:\Windows\Syst ...