借鉴于 https://www.cnblogs.com/ms-grf/p/7249220.html
缓存的目的在于节省访问时间以及减轻大并发量访问带来资源上的消耗。
一、外存
除计算机内存和CPU缓存以外的存储器,如常见的C、D、E、F盘,还有U盘,软盘,硬盘,光盘之类。断电后仍能保存数据的完整性。
二、内存
用于与CPU沟通。计算机中所有程序的进行都是在内存中进行,CPU中所有的运算数据以及和外存之间交换的数据都存储在其中。数据断电不保存。
三、高速缓冲
一般情况下,CPU的处理数据速度非常快,而内存的速度相对非常慢,易造成性能问题,为解决这个问题采用高速缓冲。原理:系统在高速缓冲区存储CPU经常访问的数据,当CPU访问某数据时,现在缓冲区找,找不到再到内存中找,极大的提高了CPU的运算效率。
当某些资源或者数据会被频繁的使用,而这些资源或数据存储在系统外部,比如数据库、硬盘文件等,那么每次操作这些数据的时候都从数据库或者硬盘上去获取,速度会很慢,会造成性能问题。
四、java中常用的缓存机制
大多时候我们做开发的都在无意识与缓存打交道,常见的多线程内存可见,字符流以及IOC都是缓存
缓存的深度从前端到数据库都有涉及,页面缓存效果最好,因为占用的资源比较少
1、static HashMap
基于内存缓存,一个map可以搞定引用对象的缓存,存在的问题是保存对象的有效性和生命周期无法控制,处理不当会导致内存急剧上升,不适合用于大数据量的缓存。
需要定义一个缓存管理器,用于实现缓存逻辑,实现对象的增删改查,支持值对象的泛型,实际就是将数据放在Map里面
在service层导入上面CacheContext
2、springCache 注解@Cacheable(value = "accountCache")
这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中, 否则返回缓存中的对象。这里的缓存中的 key 就是参数 accountName,value 就是 Account 对象。“accountCache”缓存是在 spring*.xml 中定义的名称。我们还需要一个 spring 的配置文件来支持基于注释的缓存
在上面的基础上添加AccountService2
spring 中需要配置CachMenager,bean里面需要配置accountCache
注意这个 spring 配置文件有一个关键的支持缓存的配置项:
<cache:annotation-driven />