极客兔兔Gee-Cache Day4

news2024/10/6 6:27:17
  • 缓存雪崩:缓存在同一时刻全部失效(例如设置相同过期时间,服务器宕机),均需要去访问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 consistenthash
      
      import (
      	"hash/crc32"
      	"sort"
      	"strconv"
      )
      
      type hash func(data []byte) uint32
      
      type 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 consistenthash
      
      import (
      	"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.coloradmin.cn/o/2191313.html

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

相关文章

基于yolov8的100种蝴蝶智能识别系统python源码+pt模型+训练日志+精美GUI界面

【算法介绍】 基于YOLOv8的100种蝴蝶智能识别系统是一个结合了深度学习和人工智能技术的先进工具&#xff0c;旨在提高生物多样性监测和保护领域的效率和精确度。该系统利用YOLOv8深度学习算法&#xff0c;通过9955张图片的训练&#xff0c;能够准确识别100种不同的蝴蝶类型&a…

15分钟学 Python 第37天 :Python 爬虫入门(三)

Day 37 : Python爬虫入门大纲 章节1&#xff1a;Python爬虫概述 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是一种自动访问互联网上网页并提取数据的程序。爬虫的作用包括搜索引擎索引内容、市场调查、数据分析等。 1.2 爬虫的工作原理 发起…

深入探究:在双链表指定元素的后面进行插入操作的顺序

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;惟有主动付出&#xff0c;才有丰富的果…

Redis篇(缓存机制 - 分布式缓存)(持续更新迭代)

目录 一、单点 Redis 的问题 1. 数据丢失问题 2. 并发能力问题 3. 故障恢复问题 4. 存储能力问题 5. 四种问题的解决方案 二、Redis持久化&#xff08;两种方案&#xff09; 1. RDB持久化 1.1. 简介 1.2. 执行时机 save命令 bgsave命令 停机时 触发RDB条件 1.3. …

SpringMVC项目的创建和使用

1.新建module&#xff0c;名称叫02_springmvc &#xfeff; &#xfeff; 2.新建文件夹web &#xfeff; &#xfeff; 3.点击确定&#xff0c;就会看到如下图&#xff0c;idea自动给我们创建了web.xml &#xfeff; &#xfeff; 这时候web文件夹多一个小点点的标识 &am…

OS_过程调用与系统调用

2024.06.25&#xff1a;操作系统过程调用与系统调用学习笔记 第5节 过程调用与系统调用 5.1 过程调用/函数调用/子程序调用5.2 系统调用5.2.1 系统调用汇编层 5.3 过程调用与系统调用的对比 5.1 过程调用/函数调用/子程序调用 &#xff08;过程调用&#xff09;也称为&#xf…

SpringBoot框架下校园资料库的构建与优化

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

【Conda】修复 Anaconda 安装并保留虚拟环境的详细指南

目录 流程图示1. 下载 Anaconda 安装程序2. 重命名现有的 Anaconda 安装目录Windows 操作系统Linux 操作系统 3. 运行新的 Anaconda 安装程序Windows 操作系统Linux 操作系统 4. 同步原环境使用 robocopy 命令&#xff08;Windows&#xff09;使用 rsync 命令&#xff08;Linux…

CUDA与TensorRT学习四:模型部署基础知识、模型部署的几大误区、模型量化、模型剪枝、层融合

文章目录 一、模型部署基础知识1&#xff09;FLOPS和TOPS定义介绍、计算公式&#xff08;1&#xff09;基础定义&#xff08;2&#xff09;计算公式&#xff08;3&#xff09;FLOPS在GPU试怎么运算&#xff1f;&#xff08;4&#xff09;Ampere SM的电子元件结构 2&#xff09;…

【小沐学GIS】blender导入OpenTopography地形数据(BlenderGIS、OSM、Python)

文章目录 1、简介1.1 blender1.2 OpenStreetMap地图 2、BlenderGIS2.1 下载BlenderGIS2.2 安装BlenderGIS2.3 申请opentopography的key2.4 抓取卫星地图2.5 生成高度图2.6 获取OSM数据 结语 1、简介 1.1 blender https://www.blender.org/ Blender 是一款免费的开源 3D 创作套…

[uni-app]小兔鲜-07订单+支付

订单模块 基本信息渲染 import type { OrderState } from /services/constants import type { AddressItem } from ./address import type { PageParams } from /types/global/** 获取预付订单 返回信息 */ export type OrderPreResult {/** 商品集合 [ 商品信息 ] */goods: …

微信小程序地理定位与逆地址解析详解

地理定位 1 原理与思路 在微信小程序中&#xff0c;地理定位功能可以通过调用微信提供的API接口来实现。这些接口允许我们获取用户的当前位置或者让用户通过地图选择位置。获取到位置信息后&#xff0c;我们可以使用逆地址解析来获取详细的地址信息&#xff0c;如省、市、区、…

CUDA安装教程

文章目录 一、CUDA的下载和安装1.1 查看NVIDIA适配CUDA版本1.2 下载CUDA Toolkit1.3 安装CUDA 二、环境配置三、查看是否安装成功 一、CUDA的下载和安装 CUDA在深度学习中允许开发者充分利用NVIDIA GPU的强大计算能力来加速深度学习模型的训练和推理过程。 1.1 查看NVIDIA适配…

15分钟学 Python 第39天:Python 爬虫入门(五)

Day 39&#xff1a;Python 爬虫入门数据存储概述 在进行网页爬虫时&#xff0c;抓取到的数据需要存储以供后续分析和使用。常见的存储方式包括但不限于&#xff1a; 文件存储&#xff08;如文本文件、CSV、JSON&#xff09;数据库存储&#xff08;如SQLite、MySQL、MongoDB&a…

多模态理论基础——什么是多模态?

文章目录 多模态理论1.什么是多模态&#xff08;multimodal&#xff09;2.深度学习中的多模态 多模态理论 1.什么是多模态&#xff08;multimodal&#xff09; 模态指的是数据或者信息的表现形式&#xff0c;如文本、图像、音频、视频等 多模态指的是数据或者信息的多种表现…

算法笔记(十)——队列+宽搜

文章目录 N 叉数的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度在每个树行中找最大值 BFS是图上最基础、最重要的搜索算法之一&#xff1b; 每次都尝试访问同一层的节点如果同一层都访问完了&#xff0c;再访问下一层 BFS基本框架 void bfs(起始点) {将起始点放入队列中;标记…

一款基于.NET开发的简易高效的文件转换器

前言 今天大姚给大家分享一款基于.NET开发的免费&#xff08;GPL-3.0 license&#xff09;、简易、高效的文件转换器&#xff0c;允许用户通过Windows资源管理器的上下文菜单来转换和压缩一个或多个文件&#xff1a;FileConverter。 使用技术栈 ffmpeg&#xff1a;作为文件转换…

vite学习教程03、vite+vue2打包配置

文章目录 前言一、修改vite.config.js二、配置文件资源/路径提示三、测试打包参考文章资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&…

Python | Leetcode Python题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution:def circularArrayLoop(self, nums: List[int]) -> bool:n len(nums)def next(cur: int) -> int:return (cur nums[cur]) % n # 保证返回值在 [0,n) 中for i, num in enumerate(nums):if num 0:continueslow, fas…

Qt中使用QPainter绘制阴影

困扰了很久的问题&#xff0c;今天终于明白了如何绘制QGraphicDropShadowEffect同样效果的阴影&#xff0c;故写下这篇文章分享给大家。其方法是复制Qt源代码中QGraphicDropShadowEffect绘制实现的核心代码然后稍作修改实现&#xff0c;先看效果和封装过后的源代码&#xff1a;…