zoukankan      html  css  js  c++  java
  • 缓存分类,应用缓存、分布式缓存

    一、应用缓存(本地缓存)

    java中的本地缓存,主要包括,构造单例map、guava、ehcache 三类。
     
    为什么要有本地缓存?
    在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据写到应用的本地缓存中,以提升系统的访问效率,减少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大),但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略。
     
    为什么是本地缓存,而不是分布式的集群缓存?
             一些和业务无关的小数据缓存,没有必要搞分布式的集群缓存,目前涉及到订单和商品的数据,会直接走DB进行请求,再加上分布式缓存的构建,集群维护成本比较高,不太适合紧急的业务项目。

    本地缓存作用就是提高系统的运行速度,是一种空间换时间的取舍。它实质上是一个做key-value查询的字典。 

    分类:

    1. java jdk map/ConcurrentMap

    适用场景:数据量小,数据没有失效时间要求

     jdk map局限性:

    1、  没有缓存大小的设置,无法限定缓存体的大小以及存储数据的限制(max sizelimit);
    2、  没有缓存的失效策略(eviction policies);
    3、  没有弱键引用,在内存占用吃紧的情况下,JVM是无法回收的(weakrererences keys);
    4、  没有监控统计(statistics);
    5、  持久性存储(persistent store);

    2. ehcache

    优点:功能强大,有失效策略、最大数量设置等,缓存的持久化只有企业版才有,组件集群的缓存同步,可以通过jgroup来实现
    缺点:功能强大的同时,也使其更加复杂

    ehcache有集群的功能,但是ehcache还是适合一些简单的应用缓存,比如方法级别的,缓存方法的返回值。或者当作一个Map来存储不由GC管理的、可以持久化的数据,比如爬虫url的存储。

    ehcache对并发的支持

           在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所幸的是Ehcache为我们提供了针对于缓存元素Key的Read(读)、Write(写)锁。当一个线程获取了某一Key的Read锁之后,其它线程获取针对于同一个Key的Read锁不会受到限制,但其它线程(包括获取了该Key的Read锁的线程)如果想获取针对同一个Key的Write锁就不行,它需要等到针对于该Key的Read锁释放后才能获取其Write锁;当一个线程获取了某一Key的Write锁之后,其它线程获取同一个Key的Read锁或者Write锁的请求将等待针对于该Key的Write锁释放后才能继续进行,但是同一个线程获取该Key对应的Read锁或者Write锁将不需要等待。获取了对应的锁之后,记得在不再需要该锁后释放该锁。并且需要注意不要引起死锁。

     

    配置文件依赖:ehcache.xml 

    3. Guava Cache 

     Guava Cache 是单个应用运行时的本地缓存。

     Guava Cache 与 ConcurrentMap很相似,但也不完全一样。最基本的区别是 ConcurrentMap 会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache 为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管 LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。

    Guva是google开源的一个公共java库,类似于Apache Commons,它提供了集合,反射,缓存,科学计算,xml,io等一些工具类库。

    cache只是其中的一个模块。使用Guva cache能够方便快速的构建本地缓存。

    缺点就是如果要组件集群同步的话,需要自己实现这个功能。

    二、分布式缓存

    1. memcache

    2. redis

    Redis的特点
    • KV NoSQL
    • 缓存在内存
    • 支持多种数据结构
    • 可持久化:AOF / RDB
    • 高性能、高可靠
    • 支持主从复制

    3. mongodb

    4. Apache Cassandra

    Apache Cassandra 是一种分布式非关系型数据库,具有高性能、可扩展、无中心化等特征。Cassandra 是适用于社交网络业务场景的数据库,适合实时事务处理和提供交互型数据。以 Amazon 完全分布式的 Dynamo 数据库作为基础,结合 Google BigTable 基于列族(Column Family)的数据模型,实现 P2P 去中心化的存储。

    三、缓存一致性

    缓存预热?
    A、全量预热,固定的时间段移除所有,然后再全量预热
    适用场景:
    1、数据更新不频繁,例如每天晚上3点更新即可的需求;
     2、数据基本没有变化,例如全国区域性数据;
    B、增量预热(缓存查询,没有,则查询数据库,有则放入缓存)
    适用场景:
    1、  数据更新要求缓存中同步更新的场景
     
    ​集群内部,缓存的一致性如何保证?
    如果采用ehcache的话,可以使用框架本身的JGroup来实现组内机器之间的缓存同步。
    如果是采用google的cacheBuilder的话,需要自己实现缓存的同步。
    A、非实时生效数据:数据的更新不会时时发生,应用启动的时候更新即可,然后定时程序定时去清理缓存;
    B、需要实时生效数据:启动时可预热也可不预热,但是缓存数据变更后,集群之间需要同步
  • 相关阅读:
    java 新特性学习笔记
    Can't zip RDDs with unequal numbers of partitions
    编写自己的代码库(javascript常用实例的实现与封装)
    Python高级笔记(一) -- GIL (全局解释器锁)
    CMake快速入门
    Cmake出现CMake Error: Could not find CMAKE_ROOT !!!
    Python复习笔记(十一)TCP/IP协议
    用vim打开.py和.sh文件自动添加头
    如何实现Python调用C代码--python与C之间如何通信(swig)
    dpkg用管道批量删除deb
  • 原文地址:https://www.cnblogs.com/panchanggui/p/9443378.html
Copyright © 2011-2022 走看看