课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库架构开发与维护是每一位后端编程开发程序员需要重点关注的一个问题,下面我们就通过案例分析来简单了解一下,数据库数据一致性问题分析。
1、操作的先后顺序
在并发系统中,数据库与缓存双写场景下,为了追求更大的并发量,操作数据库与缓存显而易见不会同步进行。前者操作成功后者以异步的方式进行。
关系型数据库作为成熟的工业级数据存储方案,有完善的事务处理机制,数据一旦落盘,不考虑硬件故障,可以负责任的说数据不会丢失。
所谓缓存,无非是存储在内存中的数据,服务一旦重启,缓存数据全部丢失。既然称之为缓存,那么时刻做好了缓存数据丢失的准备。尽管Redis有持久化机制,是否能够保证百分之百持久化?Redis将数据异步持久化到磁盘有不可,缓存是缓存,数据库是数据库,两个不同的东西。把缓存当数据库使用是一件极其危险的事情。
从数据安全的角度来讲,先操作数据库,然后以异步的方式操作缓存,响应用户请求。
2、处理缓存的态度
缓存是更新还是删除,对应懒汉式和饱汉式,从处理线程安全实践来讲,删除缓存操作相对难度低一些。如果在删除缓存的前提下满足了查询性能,那么优先选择删除缓存。
更新缓存尽管能够提高查询效率,然后带来的线程并发脏数据处理起来较麻烦,序言引入MQ等其它消息中间件,因此非必要不推荐。
3、解决方式
从实际情况来看,将数据写入Redis远比将数据写入数据库耗时要短,尽管发生的概率较低,但仍会发生。
(1)增加缓存过期时间
增加缓存过期时间允许一定时间范围内脏数据存在,直到下一次并发更新出现,可能会出现脏数据。脏数据会周期性存在。
(2)更新和查询共用一把行锁
更新和查询共用一把行分布式锁,上述问题不复存在。当读请求获取到锁时,写请求处于阻塞状态(超时会快速失败返回),能够保证步骤5在步骤3之前进行。
(3)延迟删除缓存
使用RabbitMQ延迟删除缓存,去除步骤5的影响。使用异步的方式进行,几乎不影响性能。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。