sync map思考

news2024/11/19 6:35:38

sync map 作为解决 map 并发读写问题的补充,用法上其实不复杂,有些惋惜的是,不支持 len 统计数量的方法。map 并发读写算得上一个非常严重的问题,会导致服务宕机,为了避免 map 的并发读写,一种解决办法是直接使用类似 mutex 的加解锁方式,另一种就是使用 sync map 来替换。

我的想法

map 并发写会导致 fatal error,并发读写会导致 fatal error,但并发读并不会导致 panic。所以,我们是不是可以考虑将 map 拆分成 2 个map,一个 map 负责存储只读的数据,不需要进行加锁,另一个负责读写的数据部分,使用 RWMutex 进行加锁。

在这里插入图片描述

通过这样的读写拆分,如果是一个读多写少的场景,读完全不需要加锁,性能杠杠的。写正常加锁,因为写的场景少,性能也可以接受。但这种内部数据隔离机制该怎么实现呢,如果来区分不同的场景呢?

我觉得可以实现一套切换机制,我们称左边的为 read map,不需要加锁,只负责读取。右边称为 write map,只负责写入。我们封装一层代理层,读取的时候读取 read map,写入的时候,异步加锁写入 write map,写入完成后,将 read map 和 write map 互换角色,并异步保持两者的数据同步。

write map 的写入都是异步加锁进行的,切换为 read map 的角色之后,两个角色之间数据的一致性也是异步加锁进行的,感觉好像也没有什么问题。但如果两个 map 切换过程有写入操作的话,该如何处理比较好呢?

Sharding 的思路

既然本质上需要通过加锁来解决,那么如何低成本地使用锁就是关键,而细粒度拆分就是我们的切入点。Sharding 最常见的应用场景就是分库分表,关于分库分表也是一块值得认真思考的问题。

Go 中 Sharding 的思路其实也分成明显,比如 PGM 的设计,程序设计上,每个 P 上都有自己的本地 G 队列,也有本地的内存申请空间,用来 Sharding 全局 G 队列的锁开销。忘记补充一点,还有 sync pool 的缓存对象,也是和 P 挂钩。

综上所述,我们可以设计一个 Sharding 的 map,就好比是一个包含 32 个分片的 redis 集群,每个 map 对应一个独立的锁,这样当访问数据时,首先计算 key 所在的分片 map,然后通过加解锁获取值。

官方的设计

上面写的那些都不作数,关键还是得看看官方的设计,看看官方是如何解决我们遇到的问题的。官方的设计也是底层实现了两个 map,只不过一个叫 read,另外一个叫 ditry。read 作为只读变量,访问是不需要加锁的。ditry 作为写对象,访问是需要解锁的。

和我们之前的想法特别相近,如果是读多写少的场景,利用 read 不加锁的特性来提高访问的性能。这里的处理思路本质上是:空间换时间,但实际的空间也并不是假想的 2 倍,主要是因为 read 和 ditry 两个结构底层使用的类型是指针。

那么 read 和 ditry 两个对象是如何交互的呢?只要得从几个关键的路径上去分析。①如果在 read 中获取不到数据,是否要去 ditry 中尝试获取;②如果向 ditry 中写入/更新/删除了新的数据,read 如何知道 ditry 变更了新的数据。

如果在 read 中获取不到数据,是否要去 ditry 中尝试获取

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

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

相关文章

华为机试题:HJ108 求最小公倍数(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

软件工程知识-软件测试

1、软件测试是发现软件错误(缺陷)的主要手段: 从是否关系软件内部结构和具体实现的角度对软件测试进行分类 2.静态测试:以检查为主(桌前检查、代码走查、代码审查) 动态测试:实际运行程序&am…

Leetcode刷题一

目录序言树「结构」「遍历」「经验」「跨父节点」「题型」序言 笔记根据labuladong进行总结,极力推荐labuladong算法进行学习!! 树 0、算法一开始就应该刷树,了解递归的思想。 1、C语言中定义了一个结构体,然后申明…

通过指针引用数组的几种方法的原理和差异;以及利用指针引用数组元素的技巧

关于地址,指针,指针变量可以参考这篇文章: 地址,指针,指针变量是什么?他们的区别?符号(*)在不同位置的解释?_juechen333的博客-CSDN博客https://blog.csdn.n…

nginx http模块

模块依赖2. 模块的初始化2.1 location的定义location的定义包含以下几种location [ | ~ | ~* | ^~ ] uri { ... } location name { ... }:表示精确匹配,只有请求的url路径与后面的字符串完全相等时,才会命中,不支持location嵌套~&#xff1a…

有免费的PDF转Word吗?值得收藏的7个免费 PDF转Word工具请收好

PDF 和 DOC 是人们在工作中广泛使用的两种最流行的文档格式。PDF 是 Adobe 的便携式文档格式,DOC 是 Microsoft 的 Word 文档格式。PDF 是一种更安全可靠的文件格式,因为它很难编辑 PDF 文件,但是有一些称为 PDF 编辑器的工具可用于编辑 PDF …

【Linux】工具(4)——make/Makefile

本期博客我们的任务就是搞懂自动化构建工具——make/Makefile一、什么是make/Makefile📌make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make&…

设计模式之创建型模式

一、设计模式分类二、创建型模式1、单例模式1.1 饿汉式(静态变量)1.2 饿汉模式(静态代码块)1.3 懒汉式(线程不安全)1.4 懒汉式(线程安全,同步方法)1.5懒汉式(…

PHP语言

一、PHP简介 什么是 PHP? PHP 是强有力的服务器端脚本语言 PHP 是免费的,并且使用广泛 PHP能够包含文本、HTML、CSS以及PHP代码,在服务器上执行,结果以纯文本返回浏览器。PHP是从C和Perl发展而来的一种非常简单的语言&#xff…

考研流程,可以进来转一转(考研你不知道的事情)(详细版)

之前有听过好多人说要考研,那么,考研的信息,如何获取呢,考研都有哪些流程呢。 初试开始到考试:↓ 1、了解考研信息。 2、确定自己要报考的专业。(本专业or跨考) 3、选择地区 4、选择要报考的学…

TAURI初体验

TAURI初体验 - 一个聊天机器人demo前言一、搭建Tauri apps二、引入库相关vue库三、 业务逻辑1.页面布局2. openai的初始化3. text-davinci-003模型4.gpt-3.5-turbo模型总结前言 一直使用Electron开发桌面应用,时间长了也就腻了。很早之前就关注了Tauri,趁…

尚硅谷SpringCloud Alibaba

1. Cloud Alibaba简介2.Nacos简介和下载3.Nacos安装4.Nacos之服务提供者注册5.Nacos之服务消费者注册和负载6.Nacos服务注册中心对比提升7.Nacos之服务配置中心8.Nacos之命名空间分组和DataID三者关系9.Nacos之DataID配置10.Nacos之Group分组方案11.Nacos之Namespace空间方案12…

基于支持向量机SVM的分类预测,基于SVM的雷击故障识别

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的雷击故障分类预测 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空…

主流机器学习平台调研与对比分析

梗概 本报告主要调研目前主流的机器学习平台,包括但不限于Amazon的Sage maker,Alibaba的PAI,Baidu的PaddlePaddle。对产品的定位、功能、实践、定价四个方面进行详细解析,并通过标杆对比分析提出一套机器学习平台评价体系&#x…

案例总结之——redis缓存不一致的问题

1.是什么? Redis:Remote Dictionary Server,即远程字典服务 支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis 是当前互联网世界最流行的 NoSQL(Not Only SQL)数据库…

js实现懒加载 最简单

实现前得先知道一下js里的几个高度: 视口高度:document.documentElement.clientHeight 滚动高度:document.documentElement.scrollTop || document.body.scrollTop 元素距离最顶端高度:dom元素.offsetTop 先说一下思路&#xff1…

k8s之list-watch,节点调度以及亲和性

一、list-watch机制1.1 list-watch介绍Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Po…

【mmdeploy部署系列】使用Tensorrt加速部署mmpose人体姿态库

【mmdeploy部署系列】使用Tensorrt加速部署mmpose人体姿态库0.引言1.安装mmcv2.使用mmpose(1)安装mmpose(2)运行mmpose3.使用mmdeploy(1)安装ppl.cv(2)编译安装mmdeploy(…

【手把手一起学习】(八) Altium Designer 20修改和自定义原理图标题栏

1 修改原理图标题栏 直接对原理图标题栏属性进行修改,操作如图所示: 修改后,并不会显示,故该方法不可用: 正确的操作如下,先选择合适的模板: 然后,进行属性的修改: 此时…

Python3中ConfigArgParse模块的使用

ConfigArgParse是一个可以替换argparse的插件,可通过"pip install configargparse"直接安装,允许通过配置文件或环境变量设置选项.最新版本为1.5.3,源码地址为:https://github.com/bw2/ConfigArgParse, License为MIT. Python中的命令行…