摘要:
本文介绍了Redis缓存优化的原理与数据一致性解决方案。核心思想是将频繁访问的磁盘数据缓存在内存中,显著提升性能。针对数据库与缓存数据不一致问题,分析了两种方案:同时更新缓存(资源浪费)和删除缓存(推荐方案),并比较了先删缓存后更新数据库与先更新数据库后删缓存的优劣,建议采用后者结合消息队列确保操作成功。经测试,该优化使性能提升至少3倍,可扩展至其他热点操作。
一,通过redis进行缓存优化:
缓存优化的核心思想就是将一些原本保存在磁盘(例如MySQL)中的、经常访问并且查询开销比较大的数据,临时保存到内存(例如Redis)中。后序再访问相同数据时,就可直接从内存中获取结果,而无需再访问磁盘,由于内存的读写速度远高于磁盘,因此就能极大的提高程序的性能。
二, 数据不一致的问题及解决(这里采用第二种)
在使用缓存优化时,有一个问题不得不提,那就是“数据库和缓存数据的一致性”,当数据库中的数据发生变化时,缓存中的数据也要同步更新,否则就会出现数据不一致的问题,解决该问题的方案有如下几个
(1)数据发生变化时,更新数据库的同时也更新缓存
每次数据发生变更,都「无脑」更新缓存,但是缓存中的数据不一定会被「马上读取」,这就会导致缓存中可能存放了很多不常访问的数据,浪费缓存资源。
而且很多情况下,写到缓存中的值,并不是与数据库中的值一一对应的,很有可能是先查询数据库,再经过一系列「计算」得出一个值,才把这个值才写到缓存中。
由此可见,这种「更新数据库 + 更新缓存」的方案,不仅缓存利用率不高,还会造成机器性能的浪费。
(2) 数据发生变化时,更新数据库的同时删除缓存
1,删除缓存两种方案:
——先删除缓存,后更新数据库
——先更新数据库,后删除缓存
2,哪种更优更安全?
(1)先删除缓存,后更新数据库,第二步操作失败,数据库没有更新成功,那下次读缓存发现不存在,则从数据库中读取,并重建缓存,此时数据库和缓存依旧保持一致,都是并发【读写】还是会不一致
(2)如果是先更新数据库,后删除缓存,第二步操作失败,数据库是最新值,缓存中是旧值,发生不一致,都是并发【读写】情况下发生不一致问题的概率非常低
总结:所以一般采用第二种方案,同时引入消息队列来执行删除缓存操作
三,压力测试
经过压力测试,性能至少提升3倍,同时可尝试添加缓存优化到其他“热点操作”


被折叠的 条评论
为什么被折叠?



