安全和活性失效保障按照我们的思路和设计方案,算法只需具备3个特性就可以实现一个最低保障的分布式锁。安全属性(Safety property): 独享(相互排斥)。在任意一个时刻,只有一个客户端持有锁。活性A(Liveness property A): 无死锁。即便持有锁的客户端崩溃(crashed)或者网络被分裂(gets partitioned),锁仍然可以被获取。活性B(Liveness property B): 容错。 只要大部分Redis节点都活着,客户端就可以获取和释放锁.为什么基于故障转移的实现还不够为了更好的理解我们想要改进的方面,我们先分析一下当前大多数基于Redis的分布式锁现状和实现方法.实现Redis分布式锁的最简单的方法就是在Redis中创建一个key,这个key有一个失效时间(TTL),以保证锁最终会被自动释放掉(这个对应特性2)。当客户端释放资源(解锁)的时候,会删除掉这个key。从表面上看,似乎效果还不错,但是这里有一个问题:这个架构中存在一个严重的单点失败问题。如果Redis挂了怎么办?你可能会说,可以通过增加一个slave节点解决这个问题。但这通常是行...
 发布日期: 2021-12-07    分类: 数据库    浏览量: 1106   0条评论  
ElasticSearch分组聚合分页 ====== 类似SQL里面`group by`后分页输出列表。 这里需要分成两个步骤,一个是计算总数,第二个是输出列表。 ### 数据场景: 展示一个车主列表,输入关键字,可以通过车主的姓名、车辆的车牌来搜索出对应的车主数据列表。 添加一个车辆索引:`car`,里面包括车主姓名:`name`,车主id:`uid`,车牌:`car_no` 因为车主和车辆是一对多的关系,所以我们在车辆索引里面搜索车主的时候需要对uid去重,这里就用到了聚合。 ### 计算聚合桶的个数 方法就是用`cardinality`聚合和`sum_bucket`聚合结合起来计算。 ```json { "size": 0, "query": { "bool": { //这里用前缀搜索name和car_no "should": [ { "prefix": { "name": "113566" } }, { "...
 发布日期: 2020-10-28    分类: 数据库    浏览量: 3687   2条评论  
JetBrains IntelliJ IDEA 最新激活码 适用于JetBrains家族所有ide,包括IntelliJ IDEA ,PhpStorm,WebStorm,GoLand,PyCharm,DataGrip等 有人搭建了网站:https://jetbra.in/s 下载顶部提示的文件: ja-netfilter-all.zip,按照说明使用。 ja-netfilter-all.zip 下载提示的下面一行是一些收集的授权服务器。 ...
 发布日期: 2020-09-28    分类: 其他    浏览量: 4348   0条评论  
go从1.11版本开始,实验性的加入了`WebAssembly`的支持。 ## `hellow world`程序 ```go package main import "fmt" func main() { fmt.Println("Hello, WebAssembly!") } ``` 设置go编译`WebAssembly`环境变量值,`GOOS=js`和`GOARCH=wasm`。 设置方法有两种: - 修改默认变量值,执行命令:`go env -w GOOS=js GOARCH=wasm` - 编译的时候指定值:`cd`到项目根目录,执行命令:`GOOS=js GOARCH=wasm go build -o main.wasm` 这时将生成一个`main.wasm`文件,`.wasm`后缀的文件可以通过`http`设置合适的`Content-Type`http头来使用。 需要注意的一点是,只能编译`main`包,否则是不能在`WebAssembly`里面使用的。 **在浏览器里面运行`main.wasm`** ...
 发布日期: 2020-01-09    分类: Go    浏览量: 3588   0条评论  
material-ui的官方示例css都是用`makeStyles`创建的,用在`function`组件上。 但是如果我用的是`class`组件该怎么用呢?答案是用不了。 `makeStyles`只能用在`function`组件上,要在`class`组件上使用需要用`withStyles`。 用法如下: ```js import React, { Component } from 'react'; import { withStyles } from '@material-ui/core/styles'; import Button from '@material-ui/core/Button'; const styles = { root: { background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)', border: 0, borderRadius: 3, boxShadow: '0 3px 5px 2px rgba(255, 105...
 发布日期: 2020-01-03    分类: 前端    浏览量: 4300   0条评论  
场景是我们在本地电脑上安装了git,并初始化了一个测试仓库,但是并没有安装`gitlab`这种东西,那我们怎么可以通过`url`来`git pull`和`git push`仓库的内容呢。 这里以linux系统为例,在不再多添加其他依赖的情况下操作。 测试仓库路径`/home/dev/git/test`,初始化仓库的时候需要初始化成一个裸仓库`git init --bare`,否则需要做一些其他设置才能正常`push`。 1. 和git仓库在同一台电脑上面 这种情况可以用`file`协议来操作就可以,`git clone file:///home/dev/git/test`。 比如你在本机测试`Jenkins`的时候,配置`Pipeline`的git仓库,就可以这样填写仓库地址:`file:///home/dev/git/test`。 2. 在不同电脑上面操作git仓库 这种情况可以用ssh协议来操作,`git clone ssh://dev@192.168.2.199:/home/dev/git/test`,`dev`是登录用户。 `19...
 发布日期: 2019-07-22    分类: 其他    浏览量: 4932   0条评论  
protocol buffers(简称**protobuf**)是google搞的,是用来序列化数据的一种数据格式,类似于json、xml等这种。 本文其他概念不讲直接讲基本用法了。 首先需要定义数据结构,数据结构定义写在一个扩展名是`.proto`的文本文件里面,这个文件叫做`proto`文件。 protobuf的数据叫`message`,每一个消息都是一系列名值对,我们把他叫做`fields`,当然还有更复杂的结构,这就不在这里讨论了。 例如: ``` syntax = "proto3"; #版本 package tutorial; #包名 message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3; } ``` `package`包名是为了避免不同项目的名字冲突。 上面就是我们定义的数据结构,然后用protobuf的编译器`protoc`去生成指定语言的数据访问代码,提供了简便的方法来操作整个结构的二进制数据。 pr...
 发布日期: 2019-06-18    分类: 后端    浏览量: 3588   0条评论  
**editor config**: ```javascript ClassicEditor .create( editorElement, { ckfinder: { uploadUrl: '/ckfinder/upload.php' #配置上传地址 } } ) .then( ... ) .catch( ... ); ``` `uploadUrl` response format,服务器响应格式: ```json { "uploaded ": true, "error": { "message": "no error" }, "url": "https://example.com/upload/images/213432434.png" } ``` ```json { "uploaded ": false, "error": { "message": "file extension not allow" ...
 发布日期: 2018-11-23    分类: Javascript    浏览量: 6306   0条评论  
利用RabbitMQ来做一个RPC的客户端和服务端。 输出斐波那契数列为例子。 rpc_server.php: ```php ...
 发布日期: 2018-11-15    分类: 其他    浏览量: 4897   0条评论  
Routing那一文是日志系统还是有不足的地方,如果我们想既基于选择和发送消息的来源来接收日志呢? 比如像Linux的`syslog`一样,可以基于消息的级别(info/warn..),产生消息的来源(auth/cron)来记录日志。 要实行这样的功能,就需要`topic`类型的exchange了。 `topic`类型的exchange,`routing_key`参数值不能随便设置,需要是一个点(`.`)分隔的词列表,词可以随意设置,一般是使用有意义的内容。比如`stock.usd.nyse`,数据长度是最大是255个字符。 `binding key`也是同样的格式,可以有两个特殊的字符: - `*`:匹配单个词。 - `#`:匹配0个或多个词。 比如`*.orange.*`、`lazy.#`,这里的词指的是点分隔的完整字符。 生产者: ```php ...
 发布日期: 2018-11-15    分类: 其他    浏览量: 4292   0条评论