# 缓存
## 说明
Zebra 集成了 CaffeineCache 和 Redis 作为 Spring Cache 的底层缓存实现,通过配置中心控制缓存的配置。
缓存分两种:
* 一级缓存 :一级缓存为微服务实例(进程)内的缓存。
* 二级缓存 :使用 Redis 作为二级缓存,同个微服务的所有实例共享一个二级缓存。开启二级缓存后,每个微服务下的所有实例的一级缓存也会同步。
## 开发
### 引入依赖
```markup
<dependency>
<groupId>com.guosen</groupId>
<artifactId>zebra-cache</artifactId>
<version>${zebra.version}</version>
</dependency>
```
_注:将 ${zebra.version} 替换为使用的 Zebra 版本_
### 代码
使用 Spring Cache 注解,在对应的接口函数上添加注解即可。
```java
public interface EchoService {
@Cacheable(cacheNames={"myFirstCache"})
String echo(String value);
@CacheEvict(cacheNames={"myFirstCache"})
String echoRemove(String value);
@CacheEvict(allEntries = true, cacheNames={"myFirstCache"})
String echoClean(String value);
@Cacheable(cacheNames={"mySecondaryCache"})
String echo2(String value);
@CacheEvict(cacheNames={"mySecondaryCache"})
String echo2Remove(String value);
}
```
### 配置项
#### 配置样例
```text
zebra.cache.enable=true
zebra.cache.enable.two=true
cache.maximumSize=10000
cache.expire=1800000
zebra.cache.redis.topic=cache
redis.database=0
redis.hostName=xxx.xxx.xxx.xxx
redis.port=6410
redis.password=password
redis.timeout=1000
redis.maxIdle=300
#redis.maxActive=600
redis.maxTotal=1000
redis.maxWaitMillis=1000
redis.minEvictableIdleTimeMillis=300000
redis.numTestsPerEvictionRun=1024
redis.timeBetweenEvictionRunsMillis=30000
redis.testOnBorrow=true
redis.testWhileIdle=true
redis.readTimeout=1000
```
#### 配置说明
**基本配置**
| 配置项 | 类型 | 说明 |
| :--- | :--- | :--- |
| zebra.cache.enable | Booean | 是否开启缓存 true : 开启 false:不开启 |
| zebra.cache.enable.two | Boolean | 是否开启二级缓存 true:开启 false:不开启 |
| cache.maximumSize | Integer | 缓存的最大数量 |
| cache.expire | Integer | 缓存超期时间,单位:毫秒,默认为1800000 |
| zebra.cache.redis.topic | String | 用于缓存变更通知的 Redis topic 名称 |
| redis.database | Integer | Redis数据库 ID |
| redis.hostName | String | Redis IP 或者域名 |
| redis.port | Integer | Redis 端口号 |
| redis.password | String | Redis 密码 |
**高级配置**
以下配置项用于控制微服务实例和Redis的连接,一般使用默认值(即不配置)即可。
| 配置项 | 类型 | 说明 |
| :--- | :--- | :--- |
| redis.timeout | Integer | 客户端超时时间,单位:毫秒。默认值为 2000 |
| redis.maxIdle | Integer | 最大空闲数 |
| redis.maxActive | Integer | 连接池的最大数据库连接数。设为0表示无限制,如果是 Jedis 2.4 以后用redis.maxTotal |
| redis.maxTotal | Integer | 控制一个 pool 可分配多少个jedis实例,用来替换上面的 redis.maxActive,如果是jedis 2.4以后用该属性 |
| redis.maxWaitMillis | Integer | 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 |
| redis.minEvictableIdleTimeMillis | Integer | 连接的最小空闲时间 默认 1800000 毫秒\( 30 分钟\) |
| redis.numTestsPerEvictionRun | Integer | 每次释放连接的最大数目,默认 3 |
| redis.timeBetweenEvictionRunsMillis | Integer | 逐出扫描的时间间隔\(毫秒\) 如果为负数,则不运行逐出线程, 默认-1 |
| redis.testOnBorrow | Boolean | 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 |
| redis.testWhileIdle | Boolean | 在空闲时检查有效性,默认 false |
| redis.readTimeout | Integer | 读取超时,单位:毫秒 |
- 简介
- 入门
- Docker方式
- 手工方式
- 环境搭建
- 简述
- 初始化服务器
- 安装 Etcd
- 初始化数据库
- 安装配置中心
- 安装服务中心
- 安装监控中心
- 安装API网关
- 开发第一个微服务
- 简述
- 准备工作
- 接口定义
- 实现
- 配置
- 部署
- 验证
- 微服务开发
- 服务调用
- 服务上下文
- 日志
- 高级特性
- 范化调用
- 异步调用
- ACL 控制
- 慢启动
- 消息大小
- 组件使用
- 简述
- 缓存
- MyBatis
- RocketMQ
- 分库分表
- 读写分离
- 分布式事务
- 分布式锁
- 运维管理
- 服务依赖
- 服务查询
- 服务方法查询
- 配置中心
- API网关配置
- 流量控制
- 简述
- 限流
- 熔断
- 系统保护
- 白名单
- 黑名单
- 监控
- 主动探测
- 调用链
- 日志开关
- 最佳实践
- 常见问题
- 深入 Zebra
- 架构
- 通信协议
- 路标