文章目录MySQL缓存其他提升MySQL性能的方式读写分离连接池异步连接reactor网络模型缓存方案实现MySQL与缓存的一致性状态分析制定用户定义热点数据的读写策略MySQL和Redis的同步方案缓存方案的故障以及解决缓存穿透缓存击穿缓存雪崩缓存方案的弊端MySQL缓存MySQL缓存缓存用户定义的热点数据用户直接从缓存获取热点数据降低数据库的读写压力。Redis-缓存用户定义的MySQL中的热点数据。场景分析①内存的访问速度是磁盘访问速度的10万倍②读的需求远远大于写的需求③mysql自身的缓冲层BufferPool和业务无关一个是缓存MySQL中最近最少使用的一个是缓存用户定义的热点数据的④mysql作为项目的主要数据库便于统计和分析⑤缓存数据库作为辅助数据库存放热点数据。其他提升MySQL性能的方式读写分离MySQL也有主从复制避免单点故障在某些场景下读的需求没有那么高非读一致性需求可以采用写到主数据库读到从数据库。从而降低了主数据库的读压力。连接池在服务端创建多条与数据库的连接并发提升数据库的访问性能同时复用连接资源避免连接建立断开以及安全验证的开销。异步连接reactor网络模型在服务端创建一个连接采用非阻塞Io缓存方案实现MySQL与缓存的一致性状态分析①MySQL有redis无②MySQL无redis有③MySQL有redis有数据一致④MySQL有redis有数据不一致⑤都无制定用户定义热点数据的读写策略读先读缓存缓存存在直接返回缓存不存在访问mysql获取有返回并同步到缓存没有说明整个系统都没有这个数据写以安全为主:先删缓存整个hash 结构为了让其他连接获取到变更后的值 然后对MySQL DML操作**MySQL数据变更同步到redis。**使用伪装从库的方式进行同步降低安全需求提升效率trade off:先写缓存并设置过期时间再写MySQL,等待MySQL同步到redis中。过期时间选择与MySQL网络传输的时间MySQL处理时间MySQL同步到redis的时间。但是带来一个安全问题时间窗口内其他连接可能读到脏数据。MySQL和Redis的同步方案同步方案1伪装从数据库从mysql中拉取数据同步到redis。阿里Canel或者另一组件go-mysql-transfer在go-mysql-transfer中定义热点数据执行同步方案。同步方案2udf触发器缺点是udf不支持事务操作每一次都要与redis建立连接。同步方案3CanelCanel客户端高可用但是比go-mysql-transfer多了一个流程缓存方案的故障以及解决缓存穿透数据在缓存和mysql中都无一直读取不存在的数据造成mysql访问性能急剧降低解决①缓存设置key,nil②布隆过滤器只能增加不能删除缓存击穿缓存无mysql有大量并发连接请求造成mysql访问性能急剧降低解决①过热数据不过期②分布式锁缓存雪崩大量缓存同时集中失效但是mysql存在该数据造成mysql访问性能急剧降低解决①间隔设置过期时间②重启时预先导入热点数据到缓存缓存方案的弊端①事务多语句必须走一条连接尤其是有连接池的场景②在缓存方案中redis不支持回滚③可能造成redis MySQL不一致https://github.com/0voice
MySQL缓存策略
文章目录MySQL缓存其他提升MySQL性能的方式读写分离连接池异步连接reactor网络模型缓存方案实现MySQL与缓存的一致性状态分析制定用户定义热点数据的读写策略MySQL和Redis的同步方案缓存方案的故障以及解决缓存穿透缓存击穿缓存雪崩缓存方案的弊端MySQL缓存MySQL缓存缓存用户定义的热点数据用户直接从缓存获取热点数据降低数据库的读写压力。Redis-缓存用户定义的MySQL中的热点数据。场景分析①内存的访问速度是磁盘访问速度的10万倍②读的需求远远大于写的需求③mysql自身的缓冲层BufferPool和业务无关一个是缓存MySQL中最近最少使用的一个是缓存用户定义的热点数据的④mysql作为项目的主要数据库便于统计和分析⑤缓存数据库作为辅助数据库存放热点数据。其他提升MySQL性能的方式读写分离MySQL也有主从复制避免单点故障在某些场景下读的需求没有那么高非读一致性需求可以采用写到主数据库读到从数据库。从而降低了主数据库的读压力。连接池在服务端创建多条与数据库的连接并发提升数据库的访问性能同时复用连接资源避免连接建立断开以及安全验证的开销。异步连接reactor网络模型在服务端创建一个连接采用非阻塞Io缓存方案实现MySQL与缓存的一致性状态分析①MySQL有redis无②MySQL无redis有③MySQL有redis有数据一致④MySQL有redis有数据不一致⑤都无制定用户定义热点数据的读写策略读先读缓存缓存存在直接返回缓存不存在访问mysql获取有返回并同步到缓存没有说明整个系统都没有这个数据写以安全为主:先删缓存整个hash 结构为了让其他连接获取到变更后的值 然后对MySQL DML操作**MySQL数据变更同步到redis。**使用伪装从库的方式进行同步降低安全需求提升效率trade off:先写缓存并设置过期时间再写MySQL,等待MySQL同步到redis中。过期时间选择与MySQL网络传输的时间MySQL处理时间MySQL同步到redis的时间。但是带来一个安全问题时间窗口内其他连接可能读到脏数据。MySQL和Redis的同步方案同步方案1伪装从数据库从mysql中拉取数据同步到redis。阿里Canel或者另一组件go-mysql-transfer在go-mysql-transfer中定义热点数据执行同步方案。同步方案2udf触发器缺点是udf不支持事务操作每一次都要与redis建立连接。同步方案3CanelCanel客户端高可用但是比go-mysql-transfer多了一个流程缓存方案的故障以及解决缓存穿透数据在缓存和mysql中都无一直读取不存在的数据造成mysql访问性能急剧降低解决①缓存设置key,nil②布隆过滤器只能增加不能删除缓存击穿缓存无mysql有大量并发连接请求造成mysql访问性能急剧降低解决①过热数据不过期②分布式锁缓存雪崩大量缓存同时集中失效但是mysql存在该数据造成mysql访问性能急剧降低解决①间隔设置过期时间②重启时预先导入热点数据到缓存缓存方案的弊端①事务多语句必须走一条连接尤其是有连接池的场景②在缓存方案中redis不支持回滚③可能造成redis MySQL不一致https://github.com/0voice