Redis集群原理详细分析
作者:上后左爱 发布时间:2021-08-06 07:34:00
标签:Redis,集群
一致性哈希
节点的增加和减少,大部分节点的 Hash一致
package consistenthash
import (
"hash/crc32"
"sort"
)
// HashFunc defines function to generate hash code
type HashFunc func(data []byte) uint32
// NodeMap consistent hash hashFunc and you can pick node form NodeMap
type NodeMap struct {
hashFUnc HashFunc
nodeHashs []int // sorted
nodehashMap map[int]string // 通过节点 找到具体的hash 值
}
func NewNodeMap(fn HashFunc) *NodeMap {
nodeMap := &NodeMap{
hashFUnc: fn,
nodehashMap: make(map[int]string),
}
// default func
if nodeMap.hashFUnc == nil {
nodeMap.hashFUnc = crc32.ChecksumIEEE
}
return nodeMap
}
func (m *NodeMap) IsEmpty() bool {
return len(m.nodeHashs) == 0
}
func (m *NodeMap) AddNode(keys ...string) {
for _, key := range keys {
if key == "" {
continue
}
hash := int(m.hashFUnc([]byte(key)))
m.nodeHashs = append(m.nodeHashs, hash)
m.nodehashMap[hash] = key
}
sort.Ints(m.nodeHashs)
}
func (m *NodeMap) PickNode(key string) string {
if m.IsEmpty() {
return ""
}
hash := int(m.hashFUnc([]byte(key)))
// Binary Search sorted hash
idx := sort.Search(len(m.nodeHashs), func(i int) bool {
return m.nodeHashs[i] >= hash
})
if idx == len(m.nodeHashs) {
idx = 0
}
return m.nodehashMap[m.nodeHashs[idx]]
}
Redis 集群
每个单机版本redis 有 standalone_database, 在其上在封装一个 cluster_database ,cluster_database 主要的功能是进行 集群之间的通信。
当某个节点被推选出 主节点后,需要将信息转发给其副的节点,在转发的过程中涉及到cluster的池化
go-commons-pool比较好使用的go的池化工具
各种命令方式
ping 不需要转发
get/set 通过一致性hash 转发到其他节点
flushdb: 全发方式 所有节点数据清空
来源:https://blog.csdn.net/qq_27217017/article/details/126915758


猜你喜欢
- Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticse
- 如何实现首先 * 是属于web这块的,那我们需要引入springboot web模块,具体版本在parent中<dependency&
- 在html中大家都知道布局是什么意思了,简单来说就是将页面划分模块,比如html中的div、table等。那么Android中也是这样的。A
- JAVA堆内存管理是影响性能主要因素之一。堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。
- Java常用类包装类由于Java语言中的基本类型不是面向对象,并不具备对象的性质,实际使用存在很多不便。Java在java.lang包中提供
- 最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的
- 功能目标使用Treeview控件实现点左边的节点,在右边显示相关的页面知识点Treeview命名空间:System.Windows.Form
- 前文传送门:Netty分布式高性能工具类recycler的使用及创建从对象回收站中获取对象我们回顾上一小节demo的main方法中从回收站获
- 写在前面:使用springboot作为web框架,方便开发许多,做分布式开发,dubbo又不可少,那么怎么整合在一起呢,跟我学一遍,至少会用
- 导入maven项目各个注解均报错所遇问题导入maven项目各个注解均报错了思考1:这个项目使用了springboot;spring是个”大容
- 使用HTTPclient访问url获得数据最近项目上有个小功能需要调用第三方的http接口取数据,用到了HTTPclient,算是做个笔记吧
- 1.使用API设置主题如下所示,在Activity中使用setThemesetTheme(R.style.MyTheme1);2.调用API
- SpringBoot对actuator进行关闭management: endpoint: health
- 本文实例讲述了获取Android系统唯一识别码的方法。分享给大家供大家参考。具体如下:在计算机上,我们习惯用MAC地址来标志一台计算机。在A
- 本文实例为大家分享了Android仿大众点评星星评分控件的具体代码,供大家参考,具体内容如下话不多说,直接上代码,这里采用的是自定Viewp
- 之前写轮播条或者指示器的时候都是UI图里面直接有,这样的效果并不好,给用户的体验比较差,所以闲暇之余自己写了个指示器,可以展现出一个优雅的效
- @Cacheable在同一类中方法调用无效上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoo
- 本文实例为大家分享了Android系统级悬浮按钮的具体代码,供大家参考,具体内容如下具体的需求1、就是做一个系统级的悬浮按钮,就像iPhon
- 针对最近练习项目时出现的乱码问题 -- tomcat编码出现的问题问题出现原因:web.xml中已经加了中文过滤器和json数据转换器,但依
- 本文实例为大家分享了C#实现简单串口通讯的具体代码,供大家参考,具体内容如下参数设置界面代码:using System;using Syst