### 概述
复制即主从(master-replica),读写分离。
**运行机制:**
1、主副本连接良好的情况下,主节点会把所有改动通过发送命令流的方式同步到副本节点。
包括客户端写,key过期或者淘汰,和其他在主节点的改动。
2、连接出现问题时,副本节点会尝试重新连接,并且会尝试重新同步连接异常期间丢失的数据。
3、如果同步丢失的数据失败,副本会要求同步完整数据,这个就需要主节点快照整个数据集,再发送到副本节点,之后才会接着正常同步。
默认使用低延时高性能的异步复制模式,适用于大多数Redis用例。副本实例会用异步ACK的方式把自己收到的数据量通告给主节点,所以主节点不需要等待副本节点执行完命令。
客户端可以用`WAIT`命令请求对数据进行同步复制,但是`WAIT`只能确认指定数量的ACK确认复制。
**关于redis复制的说明:**
1、redis使用异步复制(也可以同步复制),副主(replica-to-master)之间会异步确认(ack)处理的数据量。
2、一个主可以有多个副。
3、...
发布日期:
2022-04-19
分类:
数据库
浏览量:
1469
Gin模型数据绑定验证器用的是go-playground/validator/v10。默认提示是英文内容,我们需要翻译成中文内容。
创建一个文件`validator.go`:
```go
package utils
import (
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhtranslations "github.com/go-playground/validator/v10/translations/zh"
"log"
)
var trans ut.Translator
//设置验证器中文翻译
func init() {
if trans != nil {
...
发布日期:
2021-12-08
分类:
Go
浏览量:
2168
安全和活性失效保障按照我们的思路和设计方案,算法只需具备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
分类:
数据库
浏览量:
1603
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
分类:
数据库
浏览量:
4467
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
分类:
其他
浏览量:
4904
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
浏览量:
4120
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
分类:
前端
浏览量:
4801
场景是我们在本地电脑上安装了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
分类:
其他
浏览量:
5433
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
分类:
后端
浏览量:
4082
**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"
...