Redis集群原理详细分析

 更新时间:2022年12月19日 11:53:40   作者:上后左爱  
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。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: 全发方式 所有节点数据清空

到此这篇关于Redis集群原理详细分析的文章就介绍到这了,更多相关Redis集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RabbitMq的5种模式及实例解读

    RabbitMq的5种模式及实例解读

    这篇文章主要介绍了RabbitMq的5种模式及实例解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • java编程中拷贝数组的方式及相关问题分析

    java编程中拷贝数组的方式及相关问题分析

    这篇文章主要介绍了java编程中拷贝数组的方式及相关问题分析,分享了Java中数组复制的四种方式,其次对二维数组的简单使用有一段代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java中的内部类使用详情

    Java中的内部类使用详情

    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟
    2022-03-03
  • 基于SpringAop中JoinPoint对象的使用说明

    基于SpringAop中JoinPoint对象的使用说明

    这篇文章主要介绍了基于SpringAop中JoinPoint对象的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • mybatis的Configuration详解

    mybatis的Configuration详解

    这篇文章主要介绍了mybatis的Configuration详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • JAVA Springboot配置i18n国际化语言详细步骤

    JAVA Springboot配置i18n国际化语言详细步骤

    国际化(Internationalization,缩写为i18n)是指根据来展示不同的内容,使应用程序能够适应不同的语言和文化习惯,下面这篇文章主要给大家介绍了关于JAVA Springboot配置i18n国际化语言的详细步骤,需要的朋友可以参考下
    2024-08-08
  • Mybatis调用Oracle存储过程的方法图文详解

    Mybatis调用Oracle存储过程的方法图文详解

    这篇文章主要介绍了Mybatis调用Oracle存储过程的方法介绍,需要的朋友可以参考下
    2017-09-09
  • SpringBoot项目整合mybatis的方法步骤与实例

    SpringBoot项目整合mybatis的方法步骤与实例

    今天小编就为大家分享一篇关于SpringBoot项目整合mybatis的方法步骤与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SpringBoot中Get请求和POST请求接收参数示例详解

    SpringBoot中Get请求和POST请求接收参数示例详解

    文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServletRequest接收参数、@PathVariable接收参数、数组参数接收、集合参数接收、Map接收参数以及通过@RequestBody接收JSON格式的参数,感兴趣的朋友一起看看吧
    2024-12-12
  • linux系统下java项目在后台启动的4种方式总结

    linux系统下java项目在后台启动的4种方式总结

    Linux是集多种功能于一身的操作系统,它可以让用户查看和管理当下正在运行的进程,包括Java程序,这篇文章主要给大家总结介绍了关于linux系统下java项目在后台启动的4种方式,需要的朋友可以参考下
    2023-10-10

最新评论