##  简介

cache是提高系统性能的重要设施，越靠近用户的缓存命中，请求链越短，响应越快，效率越高，对后端系统压力越小。  

##   特性

分为分布式缓存、本地缓存、应用缓存和页面缓存。


- 分布式缓存

  ```java
  使用redis，独立进程部署，与本地应用隔离，多个节点共享
  缓存数据层查询结果集以减轻存储系统压力，或经过复杂计算得出的结果，缓存值可能被多次使用则需要缓存
  优点：集群共享，缓存系统独立部署，可线性扩容
  
  淘汰策略：过期淘汰，缓存键超过设定的时间则淘汰；溢出淘汰，当缓存量超过redis淘汰阀值，使用LRU将最近最少使用的缓存键淘汰（实际使用中配置为不淘汰）。
  更新策略：当数据更新时，先更新数据库，然后删除缓存中对应的键值。
  ```

- 本地缓存
  ```java
  使用ehcache，适合缓存数据字典及高频访问数据
  优点：和应用在同一进程，访问速度快
  缺点：容量有限；集群多个节点不能共享
  淘汰策略：过期淘汰，缓存键超过设定的时间未被访问则淘汰；溢出淘汰，当缓存量超过设定的最大值，使用LRU算法将最近最少使用的缓存键淘汰。
  ```
  
- 应用缓存

- 页面缓存

  
  <div STYLE="page-break-after: always;"></div>


## 快速上手

通过CacheFactory组件提供的API获取缓存工厂， 创建缓存器

### 分布式缓存

 ```java
DistributeSessionlessCache cache = CacheFactory.getCommonCacheFactory().getDistributeSessionlessCache("customRegion");

 ```

- customRegion
  customRegion 为自定义缓存区域，在部署层面，可以将不同region区域配置为不同的redis，部署方式为设置redis.serversForCache.customRegion=reids地址。如果不配置则使用公共的缓存配置
  

### 本地缓存

```java
//本地缓存
CacheConfigInfo localConfig = new CacheConfigInfo();
				localConfig.setMaxItemSize(5000);
				localConfig.setTimeout(600);
LocalMemoryCache localcache = CacheFactory.getCommonCacheFactory().$getOrCreateLocalMemoryCache("fi_region", "basedata", localConfig);
```

- MaxItemSize
  最大元素个数
- timeout
  超时时间秒，一个cache中所有元素的超时时间相同，不能单独设定。

### 应用缓存



###  页面缓存

#### 使用场景

表单插件需要用到缓存的场景，在页面关闭时销毁



#### 页面缓存接口

`kd.bos.form.IPageCache`

```java
public interface IPageCache {
    /**
	 * 设置字段缓存
	 * 
	 * @param keyName 字段标识
	 * @param value 字段缓存值
	 */
	void put(String keyName,String name);
    /**
	 * 批量设置字段缓存
	 * 
	 * @param values 字段缓存值键值对
	 */
	void put(Map<String, String> values);
	/**
	 * 获取字段缓存值
	 * @param keyName 字段标识
	 */
	String get(String keyName);
	/**
	 * 获取字段缓存值
	 * @param keyName 字段标识
	 */
	void remove(String keyName);
	
	void expireAfter(int timeout);

	Map<String, String> getAll();
	
	void putBigObject(String key,String name);
	
	String getBigObject(String key);
	
	void removeBigObject(String keyName);
}
```

#### 插件获取方式和示例

```java
// 取当前页面的缓存
IPageCache iPageCache =this.getPageCache().put("newBookId", "Book-0001");
String bookid = this.getPageCache().get("newBookId");
```

```java
// 取父页面的缓存
IPageCache iPageCache = this.getView().getParentView().getService(IPageCache.class);
String pageId = iPageCache.get("newBookId");
```








