注意一点:这个是StringRedisTemplate而不是 RedisTemplate
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件
单机redis的写法
spring:
redis:
# Redis数据库索引(默认为0)
database: 0
host: 127.0.0.1
port: 6379
# 连接超时时间(毫秒)
timeout: 1000ms
password: 123456
lettuce:
pool:
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: 1000ms
shutdown-timeout: 1000ms
集群的写法
spring.redis.cluster.nodes=115.xxx.xx.xxx:7000,115.xxx.xx.xxx:7001,...,111.xxx.xxx.xx:7008
spring.redis.password=password # 没有密码不写
接口
import java.util.Set;
public interface Cache {
/**
* 列出所有的key
* @return
*/
Set<String> getKeys();
Set<String> getKeys(String pattern);
/**
* 检查给定key是否存在
*
* @param key
* @return
*/
Boolean exists(String key);
/**
* 移除给定的一个或多个key。如果key不存在,则忽略该命令。
*
* @param key
*/
void del(String key);
/**
* 简单的字符串设置
*
* @param key
* @param value
*/
void set(String key, String value);
/**
*
* @param key
* @param value
* @param expiration
*/
void set(String key, String value, Integer expiration);
/**
* 返回key所关联的字符串值
*
* @param key
* @return
*/
String get(String key);
/**
* key seconds 为给定key设置生存时间。当key过期时,它会被自动删除。
*
* @param key
* @param expire
*/
void expire(String key, int expire);
/**
* 如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。
*
* @param key
* @param value
*/
void append(String key, String value);
/**
* 获取旧值返回新值,不存在返回nil
*
* @param key
* @param newValue
* @return 旧值
*/
String getset(String key, String newValue);
/**
* 分布锁
*
* @param key
* @param value
* @return
*/
boolean setnx(String key, String value);
/**
* 计数器
*/
Long incrBy(String key, Long delta);
}
工具类实现
import com.shanjupay.common.cache.Cache;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class RedisCache implements Cache {
private StringRedisTemplate redisTemplate;
public RedisCache(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 模糊查询,获取key
* @param pattern
* @return
*/
@Override
public Set<String> getKeys(String pattern) {
return redisTemplate.keys(pattern);
}
/**
* 获取所有key
* @return
*/
@Override
public Set<String> getKeys() {
return getKeys("*");
}
/**
* 判断key是否存在
* @param key
* @return
*/
@Override
public Boolean exists(String key) {
return redisTemplate.hasKey(key);
}
/**
* 根据key删除
* @param key
*/
@Override
public void del(String key) {
redisTemplate.delete(key);
}
/**
* 存入redis
* @param key
* @param value
*/
@Override
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 存入redis并设置失效时间
* @param key
* @param value
* @param expire
*/
@Override
public void set(String key, String value, Integer expire) {
redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
}
/**
* 根据key获取value
* @param key
* @return
*/
@Override
public String get(String key) {
return redisTemplate.opsForValue().get(key);
}
/**
* 设置失效时间
* @param key
* @param expire
*/
@Override
public void expire(String key, int expire) {
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
/**
* 在原有的值基础上新增字符串到末尾
* @param key
* @param value
*/
@Override
public void append(String key, String value) {
redisTemplate.opsForValue().append(key, value);
}
/**
* 获取原来key键对应的值并重新赋新值
* @param key
* @param newValue
* @return
*/
@Override
public String getset(String key, String newValue) {
return redisTemplate.opsForValue().getAndSet(key, newValue);
}
/**
* 如果键不存在则新增,存在则不改变已经有的值
* @param key
* @param value
* @return
*/
@Override
public boolean setnx(String key, String value) {
return redisTemplate.opsForValue().setIfAbsent(key, value);
}
/**
* 以增量的方式将long值存储在变量中,说白了就是增加值,这个key的值必须是 数字,否则报错
* @param key
* @param delta
* @return
*/
@Override
public Long incrBy(String key, Long delta) {
return redisTemplate.opsForValue().increment(key, delta);
}
}
实际应用
这个场景是很常见的应用场景,就是缓存。
步骤如下:
先生成key,看key存在不存在,如果存在,就删掉,不存在就保存。
@Autowired
Cache cache;
/**
* 根据应用和服务类型将查询到支付渠道参数配置列表写入redis
* @param appId 应用id
* @param platformChannelCode 服务类型code
*/
private void updateCache(String appId,String platformChannelCode){
//得到redis中key(付渠道参数配置列表的key)
//格式:SJ_PAY_PARAM:应用id:服务类型code,例如:SJ_PAY_PARAM:ebcecedd-3032-49a6-9691-4770e66577af:shanju_c2b
String redisKey = RedisUtil.keyBuilder(appId, platformChannelCode);
//根据key查询redis
Boolean exists = cache.exists(redisKey);
if(exists){
cache.del(redisKey);
}
//根据应用id和服务类型code查询支付渠道参数
//根据应用和服务类型找到它们绑定id
Long appPlatformChannelId = selectIdByAppPlatformChannel(appId, platformChannelCode);
if(appPlatformChannelId != null){
//应用和服务类型绑定id查询支付渠道参数记录
List<PayChannelParam> payChannelParams = payChannelParamMapper.selectList(new LambdaQueryWrapper<PayChannelParam>().eq(PayChannelParam::getAppPlatformChannelId, appPlatformChannelId));
List<PayChannelParamDTO> payChannelParamDTOS = PayChannelParamConvert.INSTANCE.listentity2listdto(payChannelParams);
//将payChannelParamDTOS转成json串存入redis
cache.set(redisKey, JSON.toJSON(payChannelParamDTOS).toString());
}
}