极客兔兔Gee-Cache Day4

  • 缓存雪崩:缓存在同一时刻全部失效(例如设置相同过期时间,服务器宕机),均需要去访问DB,造成DB瞬间访问量过大

    • 解决1:设置不同的过期时间
    • 解决2:保证热点数据永不过期
    • 解决3:缓存降级,降级是指返回一些默认值或者部分数据
    • 解决4:熔断,请求量过高时,自动拒绝请求
  • 一致性哈希

    • 过程
      • 1.开辟一个大小为 2 32 2^{32} 232的空间,将数字首尾相连形成环
      • 2.计算节点的Hash值,并映射到环的对应位置
      • 3.计算keyHash值,找到距离key最近的节点,发送请求
    • 数据倾斜
      • 节点数量过小,会导致key都被分配给某个节点
      • 解决:为真实节点引入虚拟节点,同时维护真实节点和虚拟节点的映射关系
  • day4需要实现一致性哈希的过程,一致性哈希的主要结构由Map进行维护

    • Map中有四个熟悉:hashreplicaskeyshashMap
    • hash:哈希函数类型,这样定义允许在一致性哈希中使用不同的哈希函数
    • replicas:表示一个真实节点对应的虚拟节点的数量
    • keys:整形切片,存储某个真实节点对应的虚拟节点的哈希值,方便二分快速定位虚拟节点的位置(实际是找大于等于key哈希值的最小节点)
    • hashMap:虚拟节点->真实节点的映射
  • 一致性哈希代码

    • package consistenthashimport ("hash/crc32""sort""strconv"
      )type hash func(data []byte) uint32type Map struct {hash     hash           // 哈希函数replicas int            // 对应虚拟节点数量keys     []int          // 虚拟节点列表hashMap  map[int]string // 虚拟节点->真实节点映射
      }func New(replicas int, fn hash) *Map {m := &Map{hash:     fn,replicas: replicas,hashMap:  make(map[int]string),}if m.hash == nil {m.hash = crc32.ChecksumIEEE}return m
      }func (m *Map) Add(keys ...string) {for _, key := range keys {for i := 0; i < m.replicas; i++ {hash := m.hash([]byte(strconv.Itoa(i) + key)) // 通过在前缀添加数字作为虚拟节点m.keys = append(m.keys, int(hash))m.hashMap[int(hash)] = key}}sort.Ints(m.keys) // 排序方便二分
      }func (m *Map) Get(key string) string {if len(m.keys) == 0 {return ""}hash := m.hash([]byte(key))idx := sort.Search(len(m.keys), func(i int) bool { // 二分查找最近的节点return m.keys[i] >= int(hash)})return m.hashMap[m.keys[idx%len(m.keys)]]
      }
      
  • 测试代码

    • package consistenthashimport ("strconv""testing"
      )func TestHashing(t *testing.T) {hash := New(3, func(key []byte) uint32 { // 假设key全为数字字符串,因此自定义hash值为对应数字i, _ := strconv.Atoi(string(key))return uint32(i)})hash.Add("6", "4", "2")testDates := map[string]string{ // key应该对应的节点"2":  "2","11": "2","23": "4","27": "2",}for k, v := range testDates {if hash.Get(k) != v {t.Errorf("%s获取节点错误~", k)}}hash.Add("8")testDates["27"] = "8"for k, v := range testDates {if hash.Get(k) != v {t.Errorf("%s获取节点错误~", k)}}}
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch基础_4.ES搜索功能

文章目录 一、搜索辅助功能1.1、指定返回的字段1.2、结果计数1.3、结果分页 二、搜索匹配功能2.1、查询所有文档2.2、term级别查询2.2.1、term查询2.2.2、terms查询2.2.3、range查询2.2.4、exists查询 2.3、布尔查询2.3.1、must&#xff0c;should&#xff0c;must_not2.3.2、f…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合&#xff0c;这是因为工科要求都必须是8开头的专业课&#xff0c;里面参考课本还是没变的&#xff0c;无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…

uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app

uniapp一个很是用的功能&#xff0c;就是在我们发布新版本的app后&#xff0c;需要提示用户进行app更新&#xff0c;并告知用户我们新版的app更新信息&#xff0c;以使得用户能及时使用上我们新开发的功能&#xff0c;提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…

创建django项目时,不同的编译类型有什么区别

这里主要提及的是 project venv 和 Custom environment 两种类型。 简单来说&#xff0c;project venv 是Python 3.3及以上版本中自带的虚拟环境管理工具&#xff0c;使用venv可以为每个项目创建一个独立的环境&#xff1a;python -m venv myprojectenv &#xff08;项目名后e…

如何评估一个副业项目的可行性?

在当今社会&#xff0c;越来越多的人开始考虑开展副业&#xff0c;以增加收入、拓宽职业发展道路或追求个人兴趣。然而&#xff0c;并非所有的副业项目都能取得成功&#xff0c;因此在投入时间和精力之前&#xff0c;对副业项目进行全面的可行性评估至关重要。 首先&#xff0c…

profile-spec-ref元素

profile-spec-ref 元素的使用讲解 profile-spec-ref 元素在 JAIN SLEE (Service Logic Execution Environment) 中用于引用用户配置&#xff08;Profile Specification&#xff09;。这种引用使得 SBB&#xff08;Service Building Block&#xff09;能够在运行时动态获取和使…

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

ROS同步解包 引言1 鱼香ROS一键安装ros-docker脚本&#xff1a;2 指定目录映射3 数据解包3.1 解包脚本3.2 依赖安装3.3 运行脚本&#xff0c;解包 引言 总结步骤如下&#xff1a; 采集同步数据&#xff1a;ROS录制&#xff08;推荐&#xff09;&#xff0c;或者代码同步触发采…

【论文阅读】Simulating 500 million years of evolution with a language model

Simulating 500 million years of evolution with a language model 1、概述 展示了语言模型在蛋白质设计和进化模拟方面的能力。通过对 ESM3 模型的研究,发现其能够生成与自然蛋白质差异较大且具有功能的新蛋白质,如新型绿色荧光蛋白(GFP),表明语言模型可以达到自然进化…

如何使用工具删除 iPhone 上的图片背景

在 iPhone 上删除背景图像变得简单易行。感谢最近 iOS 更新中引入的新功能。如今&#xff0c;iOS 用户现在可以毫不费力地删除背景&#xff0c;而无需复杂的应用程序。在这篇文章中&#xff0c;您将学习如何使用各种方法去除 iPhone 上的背景。这可确保您可以选择最适合您偏好的…

通信工程学习:什么是IP网际协议

IP&#xff1a;网际协议 IP网际协议&#xff08;Internet Protocol&#xff0c;简称IP&#xff09;是整个TCP/IP协议栈中的核心协议之一&#xff0c;它负责在网络中传送数据包&#xff0c;并提供寻址和路由功能。以下是对IP网际协议的详细解释&#xff1a; 一、对IP网际协议的…

哈尔滨自闭症学校寄宿条件与优势解析

自闭症儿童的希望之光&#xff1a;广州星贝育园寄宿制学校深度解析 在当今社会&#xff0c;自闭症儿童作为一群需要特别关注和照顾的群体&#xff0c;其教育与康复问题日益受到社会各界的重视。自闭症儿童不仅需要专业的康复训练&#xff0c;还需要一个稳定、温馨且充满爱的环…

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序&#xff1a;所谓的排序&#xff0c;就是使一串记录&#xff0c;按照某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个…

Linux基础命令uname详解

uname 是一个在 Linux 和 Unix 系统中用来显示系统信息的命令。它通常用于获取有关操作系统和内核的基本信息。以下是 uname 命令的基本用法和常用参数的详解。 基本用法 uname [OPTION]... 常用选项详解 -a, --all 显示系统的所有信息&#xff0c;包括内核名称、主机名、内…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

关于Generator,async 和 await的介绍

在本篇文章中我们主要围绕下面几个问题来介绍async 和await &#x1f370;Generator的作用&#xff0c;async 及 await 的特点&#xff0c;它们的优点和缺点分别是什么&#xff1f;await 原理是什么&#xff1f; &#x1f4c5;我的感受是我们先来了解Generator&#xff0c;在去…

【AI学习】Mamba学习(二):线性注意力

上一篇《Mamba学习&#xff08;一&#xff09;&#xff1a;总体架构》提到&#xff0c;Transformer 模型的主要缺点是&#xff1a;自注意力机制的计算量会随着上下文长度的增加呈平方级增长。所以&#xff0c;许多次二次时间架构&#xff08;指一个函数或算法的增长速度小于二次…

鸿蒙星河Next系统从入门到精通:开启智能设备新纪元

1. 引言 鸿蒙星河Next系统作为华为最新推出的智能设备操作系统&#xff0c;为开发者带来了全新的机遇和挑战。本文将带您深入了解鸿蒙星河Next系统&#xff0c;从入门基础到高级应用&#xff0c;全方位提升您的开发技能。 2. 鸿蒙星河Next系统概述 2.1 什么是鸿蒙星河Next系…

JAVA思维提升案例5

抢红包案例&#xff1a; 要求&#xff1a; 一个大V直播时发起了抢红包活动&#xff0c;分别有&#xff1a;9、666、188、520、99999五个红包。 请模拟粉丝来抽奖&#xff0c;按照先来先得&#xff0c;随机抽取&#xff0c;抽完即止&#xff0c;注意&#xff1a;一个红包只能被…