数据缓存刷新_实时刷新缓存-处理mysql主从延迟的一些设计方案
数据缓存刷新_实时刷新缓存-处理mysql主从延迟的⼀些设计2022年虎年春节祝福语
⽅案
在项⽬开发当中,经常有这样⼀种场景,对数据库进⾏添加、修改、删除操作的应⽤直接连接master库,只对数据库进⾏查询的应⽤,会先建⽴⼀个中央缓存,例如redis或者memcache,如果缓存没有命中,那么直接访问slave库。下⽂会介绍⼀下在刷新中央缓存时,如果发⽣主从延迟,应该如何处理。也即是,当应⽤System-A 把数据库写⼊master库的时候,System-B应⽤在读取slave库的时候,master库的数据还没同步到slave库,如果这个时候刷新缓存的话,会直接把旧的数据刷到缓存⾥的。
本地缓存框架缓存数据
我们可以根据数据的update_time 来判断master库的数据是否已经同步到slave库。假设有⼀个update数据库的操作,通过update_time 得知,最新的master库的数据还未同步到slave库,那么我们可以把这条数据的主键存储到本地缓存当中,例如使⽤LinkedBlockingQueue 这个队列作为本地缓存,将数据主键id存储到队列中,然后启动⼀个job去扫描这个队列,⼀旦发现队列中有数据,则进⾏处理。在处理数据的过程中,如果发现该条数据还是未从master同步过来,那么继续把这条数据的主键放⼊队列中,等待下⼀次的处理,⼀直到master库的数据同步过来为⽌。如若由于数据库原因或者数据原因或者代码问题等,导致数据⼀直处于⼊队列/出队列的死循环当中,那么我们可以为数据设置⼀个出⼊队列的次数,例
如5次,超过五次的,则该条数据把它丢失掉。
下⾯列出⼀些伪代码:
队列实现
扫描本地缓存队列的job
使⽤spring的定时任务注解:
消息体
工商营业执照的办理备注:
注意要设置队列的最⼤容量,如果队列中的数据数量超过最⼤容量,可以根据⾃⼰的业务情况,删除队头或者不再加⼊数据。
把我的悲伤留给自己这个⽅案在应⽤重启的数据,本地缓存会被清理,造成数据丢失。
餐馆名字
必须有⼀个开关,控制是否接收消息。因为⼀旦⽣产者发送的并发量太⼤,会引起其他问题,这个时候,可以通过开关控制不接收消息,以
便达到降级的效果。毕竟我们只是刷新缓存⽽已,⼤不了不刷。
使⽤MQ
如果MQ有如下的特性的话,也可以尝试使⽤:
当数据未从master同步过来时,可以把消息的状态设置为later,让消息发送者每隔⼀段时间再次发送,例如2s后、5s后1分钟后,这样不断的发送,直到⼀个⼩时后,
小学班主任德育计划这样的话,应⽤就⽆需使⽤本地缓存了,直接利⽤MQ。同时当应⽤重启的时候,消息也不会丢失。
>2022祝福

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。