实现一个CRDT工具库——LWWReg
LWWReg
LWW Register是一种数据结构,用于存储一个值和一个时间戳,支持读取和写入操作。在写入时,如果新的时间戳比原来的时间戳更大,那么就更新值和时间戳;在读取时,直接返回当前的值。这个数据结构可以用于分布式系统中,支持多个节点对同一个值进行读写操作,最终保证一致性。其中,merge函数用于合并两个LWW Register,返回时间戳更大的那个。
举例说明各个函数的运行功能:
- LWWReg()函数返回一个字典,包含'value'和'timestamp'两个键值对,分别表示当前存储的值和时间戳。
- zero()函数返回一个空的LWW Register。
- value(r)函数返回LWW Register中存储的值。
- set_val(r, value, timestamp)函数用于向LWW Register中写入新的值和时间戳。如果新的时间戳比原来的时间戳更大,那么就更新值和时间戳。最后返回更新后的LWW Register。
- 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的更多相关文章
- 如何手写一个js工具库?同时发布到npm上
自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)
所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)
我们接着上一篇的继续,在上一篇我们完成了工具库的架构,本文扩展字符串去空格的方法, 一共有3个 1,trimLeft: 去除字符串左边的空格 2,trimRight: 去除字符串右边的空格 3,tri ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展字符串位置方法(4)
本文,我们接着之前的框架继续扩展,这次扩展了一共有5个与字符串位置相关的方法 between( left, right ) 返回两个字符串之间的内容, 如果第二个参数没有传递,返回的是找到的第一个参数 ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展camelize与dasherize方法(3)
在此之前,我们已经完成了4个方法: trimLeft, trimRight, trim, capitalize 本文,我们扩展驼峰式与下划线转化这两个对称的方法 camelize: 把空格,下划线,中 ...
- 一个PHP高性能、多并发、restful的工具库(基于multi_curl)
This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...
- Underscore.js工具库
Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:“如果我面对一个空白的 HTML ...
- JavaScript工具库
jPublic 交流QQ群:1017567122 前言 在我们开发项目的时候,无论项目规模大小,在所难免会写一些工具型函数来解决一些问题,随着项目开发和维护的时间越来越长,这些工具型函数会越来越多,同 ...
- 手把手教你使用Rollup打包📦并发布自己的工具库🔧
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...
- 自己的一个LESS工具函数库
自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...
随机推荐
- Android---mediaplayer 创建和调用顺序
Android mediaframework创建mediaplayer // java层 ///frameworks/base/media/java/android/media/MediaPlayer ...
- svn批量的添加ignore
svn没有批量添加ignore file的功能,只能一个个目录去设置,故写了脚本自动化的执行 使用了svn propset,故改了ignore file,可以反复的执行此脚本 #!/usr/bin/p ...
- .net core 接收并存储客户端上传的文件
1 文件是上传到Host,非上传到阿里云OSS 2 在Program.cs或StartUp中使用静态文件的中间件 public void Configure(IApplicationBuilder a ...
- 通过Linux的socket套接字实现客户端与服务器端的通信
具体案例:使用树莓派ds18b20温度传感器实现温度上报 首先需要获得传感器文件中保存的温度信息: 温度信息通常保存在路径为"/sys/bus/w1/devices/28-xxxxxxxxx ...
- 第13章 MVC和Razor Pages过滤器管道(ASP.NET Core in Action, 2nd Edition)
本章包括 过滤器管道及其与中间件的区别 创建自定义筛选器以重构复杂的操作方法 使用授权筛选器保护您的操作方法和Razor页面 短路筛选器管道以绕过操作和页面处理程序执行 将依赖项注入筛选器 在第1部分 ...
- vs xamarin获取sha1申请百度sdk密钥
请查看微软帮助文档 查找密钥存储的签名 - Xamarin | Microsoft Docs
- re相关正则表达式(re.sub、re.I 、re.S、re.M)
re.I 表示忽略大小写 re.S 表示全文匹配 re.M 表示全文拼配行尾段位的字符或者数字,影响^和$ re.sub 表示替换 使用方法: re.sub(pattern, repl, string ...
- binary与进制转换
精华笔记: 什么是二进制:逢2进1的计数规则.计算机中的变量/常量都是按照2进制来计算的 2进制: 规则:逢2进1 数字:0 1 基数:2 权:128 64 32 16 8 4 2 1 如何将2进制转 ...
- 【Unity】利用C#反射打印类的字段信息
最近在用protobuf-net序列化功能生成.bytes配置文件时,遇到了需要把.bytes配置文件再另外转成Lua配置文件(Lua配置表内容举例)的需求.Lua配置文件需要记录配置类的各个字段名和 ...
- logrotate linux 系统日志管理
logrotatelogrotate简介 logrorare一定程度上可以简化对会生成大量日志文件的系统的管理.logrotate可以实现自动轮替.删除.压缩和mail日志的功能. 执行命令logro ...