关于分布式数据库缓存设计的那点事和实践

2024-09-01 08:44

本文主要是介绍关于分布式数据库缓存设计的那点事和实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

案例

【题目】

【问题 1】(9 分)

【问题 2】(8 分)

【问题 3】(8 分)

【答案】

【问题 1】答案

【问题 2】解析

【问题 3】解析

相关推荐


案例

        阅读以下关于分布式数据库缓存设计的叙述,在答题纸上回答问题 1 至问题 3。

【题目】

        某企业是为城市高端用户提供高品质蔬菜生鲜服务的初创企业,创业初期为快速开展业务,该企业采用轻量型的开发架构(脚本语言+关系型数据库)研制了一套业务系统。业务开展后受到用户普遍欢迎,用户数和业务数量迅速增长,原有的数据库服务器已不能满足高度并发的业务要求。为此,该企业成立了专门的研发团队来解决该问题。
        张工建议重新开发整个系统, 采用新的服务器和数据架构,解决当前问题的同时为日后的扩展提供支持。但是,李工认为张工的方案开发周期过长,投入过大,当前应该在改动尽量小的前提下解决该问题。李工认为访问量很大的只是部分数据,建议采用缓存工具MemCache 来减轻数据库服务器的压力,这样开发量小,开发周期短,比较适合初创公司,同时将来也可以通过集群进行扩展。然而,刘工又认为李工的方案中存在数据可靠性和一致性问题,在宕机时容易丢失交易数据,建议采用 Redis 来解决问题。在经过充分讨论,该公司最终决定采用刘工的方案。

【问题 1】(9 分)

        在李工和刘工的方案中,均采用分布式数据库缓存技术来解决问题。请说明分布式数据库缓存的基本概念。表 4-1 中对 MemCache 和 Redis 两种工具的优缺点进行了比较,请补充完善表 4-1 中的空(1)~(6)。

表 4-1
MemCacheRedis
数据类型简单 key/value 结构(1)
持久性(2)支持
分布式存储(3)多种方式,主从、Sentinel、Cluster 等
多线程支持支持(4)
内存管理(5)
事物支持(6)有限支持

【问题 2】(8 分)

        刘工认为李工的方案存在数据可靠性和一致性的问题,请说明原因。为避免数据可靠性和一致性的问题,刘工的方案采用 Redis 作为数据库缓存,请说明基本的 Redis 与原有关系数据库的数据同步方案。

【问题 3】(8 分)

        请给出 Redis 分布式存储的 2 种常见方案和 Redis 集群切片的几种常见方式。

【答案】

        本题考查数据库缓存的概念,以及数据库缓存方案的设计过程。

【问题 1】答案

        分布式数据库缓存指的是在高并发环境下,为了减轻数据库压力和提高系统响应时间,在数据库系统和应用系统之间增加的独立缓存系统。

【问题 2】解析

        MemCache 不支持数据持久化操作,所以掉电数据会全部丢失,而且无法直接恢复,这存在可靠性问题;
        MemCache 不支持事务,所以操作过程中可能产生数据的不一致性。

        同步方案:读取数据时,先读取 Redis 中的数据,如果 Redis 没有,则从原数据库中读取,并同步更新 Redis 中的数据。写回时,写入到原数据库中,并同步更新到 Redis 中。

【问题 3】解析

        Redis 分布式存储的常见方案有:
        (1)主从(Master/Slave)模式;
        (2)哨兵(Sentinel)模式;
        (3)集群(Cluster)模式。

        Redis 集群切片的常见方式有:
        (1)客户端实现分片。分区逻辑在客户端实现,采用一致性哈希来决定 Redis 节点。
        (2)中间件实现分片。在应用软件和Redis 中间,例如 Twemproxy、Codis 等,由中间件实现服务到后台 Redis 节点的路由分派。
        (3)客户端服务端协作分片。Redis Cluster 模式,客户端可采用一致性哈希,服务端提供错误节点的重定向服务。

        答案:

        Redis 分布式存储的 2 种常见方案:主从方案、Cluster 方案。
        Redis 集群切片的几种常见方式:
        (1)客户端分片:在客户端通过 key 的 hash 值对应到不同服务器。
        (2)对数据根据 key 散列到不同的 slot 上,不同 slot 对应不同的服务器。

        注:存储方案可以在问题1表格中直接摘抄下来。
        slot(槽位):是一种逻辑上的划分,用于将数据集合(如键值对)根据一定的规则(如哈希函数)分配到不同的存储单元(如服务器)上。每个slot通常对应一个或多个物理或逻辑上的存储节点。

相关推荐

【系统架构设计师】三、数据库系统(事务并发|封锁协议|数据库安全|商业智能|SQL语句)-CSDN博客文章浏览阅读1.2k次,点赞27次,收藏12次。事务是并发控制的前提条件,并发控制就是控制不同的事务并发执行,提高系统效率,但是并发控制中存在下面三个问题:丢失更新:事务1对数据A进行了修改并写回,事务2也对A进行了修改并写回此时事务2写回的数据会覆盖事务1写回的数据,就丢失了事务1对A的更新。即对数据A的更新会被覆盖。不可重复读:事务2读A,而后事务1对数据A进行了修改并写回,此时若事务2再读A,发现数据不对。即一个事务重复读A两次,会发现数据A有误。读脏数据:事务1对数据A进行了修改后,事务2读数据A,而后事务1回滚,数据A恢复了原来的。https://shuaici.blog.csdn.net/article/details/139778680【系统架构设计师】二十二、嵌入式系统架构设计理论与实践③-CSDN博客文章浏览阅读1.2k次,点赞30次,收藏19次。鸿蒙 (HarmonyOS) 整体采用分层的层次化设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统”→“子系统”→“功能/模块”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或功能/模块。https://shuaici.blog.csdn.net/article/details/140818780

        

这篇关于关于分布式数据库缓存设计的那点事和实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126462

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1