zoukankan      html  css  js  c++  java
  • 缓存相关

    缓存是现在系统中必不可少的模块,并且已经成为了高并发高性能架构的一个关键组件。

    缓存能解决的问题:

    • 提升性能
    • 缓解数据库压力

    缓存适用的场景

    对于数据实时性要求不高------经常访问但是很少改变的数据。

    对于性能要求较高

    缓存的三种模式:

    cache aside 同时更新缓存和数据库,具体流程:

    失效:应用程序先从缓存取数据,没有得到则从数据库中取,成功后放到缓存

    命中:应用程序从缓存中取到数据,取到后返回

    更新:先把数据存到数据库,成功后,再让缓存失效

    Read/Write Through 先更新缓存,缓存负责同步更新数据库

    Read Through模式就是在查询操作中更新缓存,即当缓存失效的时候,Cache Aside模式是由调用方负责把数据加载入缓存,而Read though则用缓存服务自己来加载

    write though模式和read through相仿,不过是在更新数据时发生。当有数据更新时,如果没有命中缓存,直接更新数据库,然后返回。如果命中缓存,则更新缓存,然后由缓存自己更新数据库(这是一个同步操作)。

    Write Behind Caching 先更新缓存,缓存定时异步更新数据库,具体流程:

    更新数据的时候只更新缓存,不更新数据库,而我们缓存会异步批量的更新数据库。好处在于直接操作内存速度快,异步性能高。问题是数据不是强一致的,而且可能会丢失。而且他的更新模式逻辑比较辐照,因为它需要确认哪些是被更新了的,哪些数据是需要刷到持久层上。

    三种缓存模式的优缺点:

    cache Aside实现起来比较简单,但是需要维护两个数据存储,缓存和数据库。

    后面两种只需要维护一个数据存储(缓存),但是实现起来逻辑更复杂一些。两者区别是Read/Write through 更新模式的数据持久化操作是同步的,write behind caching是数据持久化操作是异步的。优点是直接操作内存速度快,多次操作可以合并持久化到数据库。缺点是数据可能会丢失。

    缓存是通过牺牲强一致性来提高性能的,所以使用缓存提高性能,就会有数据更新的延迟。这需要我们在设计时结合业务思考是否使用缓存。

    缓存雪崩可以简单理解为:由于原有缓存失效,新缓存未到期间,所有原本应该访问缓存的请求都去出查询数据库,而对数据库CPU和内存造成巨大压力,严重会造成数据库宕机。从而一系列连锁反应。造成整个系统崩溃。

    缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证不会有大量的线程对数据库同一时间进行读写,从而避免失效时大量的并发请求落到底层存储系统上。

  • 相关阅读:
    开博
    jmeter插件安装
    eclipse清理项目缓存
    java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型
    转:Eclipse Memory Analyzer入门学习笔记
    转发: 探秘Java中的String、StringBuilder以及StringBuffer
    Java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind异常
    windows 查看端口是否被占用
    iostat命令
    计算机原码、补码、反码与java移位运算符(<</>>/>>>)
  • 原文地址:https://www.cnblogs.com/qqguoqin/p/12745085.html
Copyright © 2011-2022 走看看