# redis-client
**Repository Path**: mayanyun1986/redis-client
## Basic Information
- **Project Name**: redis-client
- **Description**: 封装了lettuce客户端
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-07-20
- **Last Updated**: 2024-06-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# br-redis-client
---
## 简介
br-redis-client基于lettuce,实现了双写(代理及物理机)、重试(幂等命令)、多集群配置、
代理和物理机切换(如果配置物理机)、部分命令禁用(服务端和cluster相关命令)、支持redis单独配置文件;
#### 双写
可以同时配置代理和物理机,在访问redis时会优先访问代理;如果代理在给定时间内没有返回(默认2ms),则会启动另一个线程同时请求物理机;程序会返回最先返回线程的结果;
对于非幂等命令,则不执行双写;
流程如下图:

#### 重试
对于幂等命令,当命令执行失败时,会进行重试,尽量使得请求成功;
#### 多集群配置
可以在配置文件中配置多套集群,通过name来区分;系统启动时会将每一套配置初始化为一个BrRedisClient,方便业务使用;
#### 代理和物理机自动切换
客户端会定时检测代理是否可用;如果发现代理不可用,则会自动切换到物理机模式;切换到物理机模式后,在执行非幂等命令,将优先采用物理机模式;
#### 禁用部分命令
部分命令客户端调用会有较大的风险,会导致其它业务系统不能使用,所以对这类命令在客户端进行禁用,避免带来风险;
比如:cluster相关命令、server相关命令、keys、swapdb等;
#### redis单独配置文件
redis的相关配置比较多,需要将配置写入到单独的redis.yml配置文件中;br-redis-client在启动时,会在以下目录加载该文件:
- classpath:./
- classpath:./config
- file:./
- file:./config
该文件与application.yml同级;
## 开始使用
---
#### 前提条件
- JDK 8+
#### 1、在pom.xml文件中引入依赖
```
com.brgroup
br-redis-client
1.0.0
```
#### 2、在redis.yml增加配置
- 单集群模式:
```
spring:
redis:
standalone:
password: pwd1
timeout: 10000
max-attempts: 5
proxy-uri: redis://10.100.123.52:6380
#cluster-uris: redis://10.100.123.190:7310,redis://10.100.123.190:27310,redis://10.100.123.191:7310,redis://10.100.123.191:27310,redis://10.100.123.192:7310,redis://10.100.123.192:27310
```
其中cluster-uris可以不配置,如果没有配置,则不会进行代理和cluster之间的切换;
- 混合模式:
```
spring:
redis:
multiple:
- name: api-redis
password: pwd1
timeout: 1000
max-attempts: 5
proxy-uri: redis://10.100.123.211:6400
cluster-uris: redis://10.100.123.190:7310,redis://10.100.123.190:27310,redis://10.100.123.191:7310,redis://10.100.123.191:27310,redis://10.100.123.192:7310,redis://10.100.123.192:27310
- name: zw-redis
password: pwd1
timeout: 1000
max-attempts: 5
proxy-uri: redis://10.100.123.211:6400
cluster-uris: redis://10.100.123.190:7310,redis://10.100.123.190:27310,redis://10.100.123.191:7310,redis://10.100.123.191:27310,redis://10.100.123.192:7310,redis://10.100.123.192:27310
```
混合模式放到multiple里,其中的name代表集群名称(必须英文),可以自行定义,定以后通过该名称获取对应的BrRedisClient;
#### 3、代码引入使用
standalone模式可以通过以下方式引入使用:
```
private BrRedisClient redisClient = BrRedisClients.getRedisClient();
Map map = new ConcurrentHashMap<>();
map.put("age", "30");
map.put("sex", "15");
redisClient.set("name", map);
Map result = (Map)redisClient.get("name");
System.out.println(result);
redisClient.set("name1", 100);
Integer result1 = (Integer) redisClient.get("name1");
System.out.println(result1);
```
注:BrRedisClient的泛型指的是key-value的编码解码器解析的类型,默认key是String,Value为Object;其他解码器清参考配置表。
**关于初始化**
```
当调用BrRedisClients.getRedisClient()时,会进行初始化连接。如果需要提前初始化连接可用执行以下方法:
BrRedisClients.init();
```
混合集群模式用以下方式引入使用:
```
//其中name为配置文件中集群name
private BrRedisClient apiRedisClient = BrRedisClients.getRedisClient("api-redis");
private BrRedisClient zxRedisClient = BrRedisClients.getRedisClient("zx-redis");
apiRedisClient.set("name", "myy");
String name = zxRedisClient.get("name");
```
## 其它功能
#### 1、禁用cluster
在默认情况下,cluster的配置是不起作用的,也就不会执行双写、切换;如果要启用需要按照规则在环境变量设置对应的启用标识;
环境变量名称:
该环境变量的名称由cluster.[配置集群名称|default].enabled组成;集群名称及在配置文件中配置的名称;如果是standalone模式,则名称为default;如:
```
cluster.zw-redis.enabled=true
cluster.default.enabled=true
```
在环境变量添加对应启用标识后,重启服务即可启用;以后代理稳定后则不需要双写及切换,可以将该环境变量删除即可。
#### 2、使用pipeline
如果需要同时大量请求redis,可以使用pipeline技术,将请求的命令组装在一起,一次性发送给redis,可以减少请求次数,提高执行效率。
使用示例如下:
```
private BrPipelineConnection pipelineConnection = BrRedisClients.getPipelineConnection();
...
StatefulRedisConnection connection = pipelineConnection.getDefaultPipelineConnection().getProxyConnection();
//其它集群的物理机可以通过以下方式访问。其中的参数clusterName即配置中的redis-cluster集群name
//StatefulRedisClusterConnection clusterConnection = pipelineConnection.getPipelineConnection("redis-api").getClusterConnection();
//此处泛型定义与配置的编码器对应
RedisAsyncCommands