Redis集群原理详细分析

作者:上后左爱 时间:2021-08-06 07:34:00 

一致性哈希

节点的增加和减少,大部分节点的 Hash一致

Redis集群原理详细分析

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的池化

Redis集群原理详细分析

go-commons-pool比较好使用的go的池化工具

各种命令方式

ping 不需要转发

get/set 通过一致性hash 转发到其他节点

flushdb: 全发方式 所有节点数据清空

来源:https://blog.csdn.net/qq_27217017/article/details/126915758

标签:Redis,集群
0
投稿

猜你喜欢

  • Java中驼峰命名与下划线命名相互转换

    2021-10-01 00:56:47
  • Java Thread.currentThread().getName() 和 this.getName()区别详解

    2021-10-31 01:46:18
  • Java应用开源框架实现简易web搜索引擎

    2023-08-22 20:20:54
  • Java如何根据不同系统动态获取换行符和盘分割符

    2022-02-27 10:33:10
  • Java CompletableFuture实现多线程异步编排

    2023-07-22 22:57:02
  • java.lang.Runtime.exec的左膀右臂:流输入和流读取详解

    2023-08-06 04:59:03
  • spring-mybatis获取mapper的四种方式汇总

    2023-11-23 06:24:39
  • android分享纯图片到QQ空间实现方式

    2023-07-20 10:56:03
  • 基于Java文件输入输出流实现文件上传下载功能

    2023-08-10 11:50:32
  • mybatis根据表逆向自动化生成代码的实现

    2023-03-12 15:39:02
  • springboot+vue部署按照及运行方法

    2023-07-15 06:16:09
  • MyBatis-plus中的模糊查询解读

    2022-06-16 08:27:03
  • Java十分钟精通类 封装 继承

    2023-11-25 10:55:58
  • java实现仿射密码加密解密

    2022-10-09 04:04:49
  • Java 日期转换详解及实例代码

    2021-06-30 02:15:43
  • 图解Java线程的生命周期

    2022-04-12 15:16:10
  • java中文传值乱码问题的解决方法

    2023-11-25 16:26:47
  • Spring Security OAuth2实现使用JWT的示例代码

    2022-11-02 22:46:25
  • 详解Java中对象池的介绍与使用

    2023-07-25 13:13:48
  • springboot读取resources下文件的方式详解

    2022-05-21 16:14:48
  • asp之家 软件编程 m.aspxhome.com