外存:除计算机内存和CPU缓存以外的存储器,如常见的C、D、E、F盘,还有U盘,软盘,硬盘,光盘之类。断电后仍能保存数据的完整性。
内存:用于与CPU沟通。计算机中所有程序的进行都是在内存中进行,CPU中所有的运算数据以及和外存之间交换的数据都存储在其中。数据断电不保存。
高速缓冲:一般情况下,CPU的处理数据速度非常快,而内存的速度相对非常慢,易造成性能问题,为解决这个问题采用高速缓冲。原理:系统在高速缓冲区存储CPU经常访问的数据,当CPU访问某数据时,先在缓冲区找,找不到再到内存中找,极大的提高了CPU的运算效率。
当某些资源或者数据会被频繁的使用,而这些资源或数据存储在系统外部,比如数据库、硬盘文件等,那么每次操作这些数据的时候都从数据库或者硬盘上去获取,速度会很慢,会造成性能问题。
大多时候我们做开发的都在无意识与缓存打交道,常见的多线程内存可见,字符流以及IOC都是缓存
1、Map
基于内存缓存,一个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 />