
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
缓存技术的应用在许多软件开发项目中都得到了广泛的使用,而本文太原达内培训就给大家简单介绍一下,软件开发缓存的意义都有哪些。
所谓缓存,实际上就是用空间换时间,准确地说是用更高速的空间来换时间,从而整体上提升读的性能。
何为更高速的空间呢?
1、更快的存储介质。通常情况下,如果说数据库的速度慢,就得用更快的存储介质去替代它,目前常见的就是Redis。Redis单实例的读QPS可以高达10w/s,90%的场景下只需要正确使用Redis就能应对。
2、就近使用本地内存。就像CPU也有高速缓存一样,缓存也可以分为一级缓存、二级缓存。即便Redis本身性能已经足够高了,但访问一次Redis毕竟也需要一次网络IO,而使用本地内存无疑有更快的速度。不过单机的内存是十分有限的,所以这种一级缓存只能存储非常少量的数据,通常是热点的那些key对应的数据。这就相当于额外消耗宝贵的服务内存去换取高速的读取性能。
引入缓存后的一致性挑战
用空间换时间,意味着数据同时存在于多个空间。常见的场景就是数据同时存在于Redis与MySQL上(为了问题的普适性,后面举例中若没有特别说明,缓存均指Redis缓存)。
实际上,全的数据还是在MySQL里的,只要Redis数据没有得到及时的更新而导致新数据没有同步到Redis中,就出现了数据不一致。
大部分情况下,只要使用了缓存,就必然会有不一致的情况出现,只是说这个不一致的时间窗口是否能做到足够的小。有些不合理的设计可能会导致数据持续不一致,这是我们需要改善设计去避免的。
缓存不一致性无法客观地完全消灭
为什么我们几乎没办法做到缓存和数据库之间的强一致呢?
正常情况下,我们需要在数据库更新完后,把对应的新数据同步到缓存中,以便在读请求的时候,能读到新的数据而不是旧的数据(脏数据)。但是很可惜,由于数据库和Redis之间是没有事务保证的,所以我们无法确保写入数据库成功后,写入Redis也是一定成功的;即便Redis写入能成功,在数据库写入成功后到Redis写入成功前的这段时间里,Redis数据也肯定是和MySQL不一致的。
所以说这个时间窗口是没办法完全消灭的,除非我们付出极大的代价,使用分布式事务等各种手段去维持强一致,但是这样会使得系统的整体性能大幅度下降,甚至比不用缓存还慢,这样不就与我们使用缓存的目标背道而驰了吗?
不过虽然无法做到强一致,但是我们能做到的是缓存与数据库达到终一致,而且不一致的时间窗口我们能做到尽可能短,按照经验来说,如果能将时间优化到1ms之内,这个一致性问题带来的影响我们就可以忽略不计。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。