缓存出海方案

news/2024/9/13 9:05:43 标签: 缓存, java, redis, 面试, 职场和发展, 开发语言, 架构

优质博文:IT-BLOG-CN
在这里插入图片描述

一、挑战/注意事项

【1】框架组不允许在不同地区部署的独立Redis实例拥有相同的名称,因此不同地区需要使用不用的Redis集群名称。
【2】分布式锁问题: 该场景需要保证keyUCS灰度策略是可以同步的,即同一个key不会被路由到多个机房。【目前缓存不同步数据】

二、上云方案

Redis:不做双向同步,多数据源。

业务中用到Redis的场景比较多,但Redis不同于业务数据库场景所以不做双向同步,每个IDC对应同单元内的Redis集群,每个Redis集群只服务于当前单元内的业务,所以不是全量的。所以在多IDC的场景下就有很多业务场景需要调整,基于Redis覆盖业务要保证单元内闭环。

三、SDK封装

ReidsClient工厂进行统一封装,通过约定大于配置的形式,根据区域约定统一的后缀名,向OPS申请部署独立集群。业务开发使用封装的Factory获取Redis Client时,只需要传入固定Cluster Name(不需要添加后缀),由封装层事先约定,自动从该环境的QConfig配置文件中获取映射的Cluster Name
【1】部署在国内的独立集群不添加后缀名;
【2】部署在新加坡地区的独立集群统一添加后缀名_sin
【3】部署在法拉克福地区的独立集群统一添加后缀名_fra

不足:即使封装了CacheFactory,业务开发扔需要扫描代码变更。同时,该约定为口头约定,没有框架介入,实际执行过程可能会因个人失误造成非预期的结果。

四、海外缓存使用方式

【1】本地访问本地模式(推荐)
【2】从上海同步到新加坡,在新加坡侧只读,海外缓存写入需要申请新集群;(问题:大部分系统上线之后,回先缓存写入数据,往往会写入失败,导致一些问题);
【3】神盾缓存使用本地模式,数据目前不同步到海外,第一次使用神盾数据需要回源上海,如需预热,需要联系DBA;(问题:国内外数据加解密是不一样的,准备给数据库添加版本信息,新加坡加密的数据,回到上海之后也能够解密);

五、Redis超大Key双向同步导致客户端链接超时

场景信息 : 上云时Redis数据需做双向数据同步,开启后出现Redis连接超时异常,Redis版本为4.0.8
分析问题: 发现其中有超大key,最大的key7.2MB,超大key双向同步导致的资源占用。建议避免使用超大key。根据DBTrace中的Redis慢日志来进行分析。一个实际运行的参考数据是,当key大小为1.6MB时,Redis每日会有多次300-400ms的慢日志。
解决方案:RedisString类型的数据转换为Hash存储,并对Hash中的Filed按照范围划分为多个Hash集合。改造后进行数据同步,没有再出现超时异常。

六、分布式锁问题

当前项目中的分布式锁是基于Redis实现的,因为不同IDCRedis集群是相互隔离的,所以目前分布式锁的粒度只支持到了Region级别。目前业务都是围绕用户场景加的分布式锁,所以也可以满足目前的实际业务场景。如果后续有全局获取分布式锁的业务,则需要进一步设计,即保证同一时间所有Region有且只有一个地方能够获得该资源,并且其他Region必须等待,这有可能牺牲掉相当大的性能来实现此功能。


http://www.niftyadmin.cn/n/5621814.html

相关文章

Android APK优化系列瘦身篇:实战一个APK从11MB压缩到4MB,APK无用资源去除与代码压缩、混淆,瘦身维度的选型分析

目录: 为什么要进行APK瘦身呢?APK瘦身主要是瘦身哪些呢? a. 优化resources.arsc: b. res优化 c. lib优化 d. 资源优化,代码混淆和压缩总结 一、为什么要进行APK瘦身呢? 减少下载时间和流量消耗&#xff1…

安全审计工具lynis

说明 Lynis 是一个开源且功能强大的 auditing tool适用于类 Unix/Linux 操作系统。 Lynis扫描系统的安全信息、一般系统信息、已安装和可用的软件信息、配置错误、安全问题、没有密码的用户帐户、错误的文件权限、防火墙审计等。 Lynis是最值得信赖的自动化审计工具之一,用…

Flask restful 前后端分离和 restful 定义

Flask restful 前后端分离和 restful 定义 前后端分离RESTful API总结在Web开发中,前后端分离(Frontend and Backend Separation)和RESTful API(Representational State Transfer 应用程序接口)是两个重要的概念,特别是在构建大型或复杂的Web应用程序时。Flask作为一个轻…

012 表单校验

文章目录 BrandEntity.javaBrandController.java抽取CubemallEnum.javaCubemallExceptionControllerAdvice.javaBrandController.javaBrandEntity.java 分组AddGroup.javaUpdateGroup.javaBrandController.javaBrandEntity.javaCubemallExceptionControllerAdvice.javaCubemall…

Spring 源码解读:实现依赖注入的构造函数与Setter注入

引言 依赖注入(Dependency Injection)是Spring框架的核心特性之一,它通过将对象的依赖交由IoC容器管理,帮助开发者实现松耦合的代码结构。Spring支持多种依赖注入方式,其中最常见的是构造函数注入和Setter方法注入。本…

SparkContext与SparkSession区别

文章目录 pyspark初始化SparkContextSparkSessionSparkConfspark-submit pyspark初始化 SparkContext Spark中的主要接口,代表与Spark集群的连接。 在早期版本的Spark中,需要通过SparkContext对象来初始化Spark应用程序。在Spark 2.0之后,推…

ssrf简介

目录 SSRF漏洞 漏洞原理 形成原因 SSRF用途: 怎么找到SSRF漏洞? 漏洞案例 SSRF漏洞 漏洞原理 SSRF(Server-Side Request Forgery:服务器端请求伪造)是——种由仅专构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是…

Linux之RabbitMQ集群部署

RabbitMQ 消息中间件 1、消息中间件 消息(message): 指在服务之间传送的数据。可以是简单的文本消息,也可以是包含复杂嵌入对象的消息 消息队列(message queue): 指用来存放消息的队列,一般采用先进先出的队列方式,即最先进入的…