注意一点:这个是StringRedisTemplate而不是 RedisTemplate
依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
配置文件
单机redis的写法
spring:redis:# Redis数据库索引(默认为0)database: 0host: 127.0.0.1port: 6379# 连接超时时间(毫秒)timeout: 1000mspassword: 123456lettuce:pool:# 连接池中的最大空闲连接max-idle: 8# 连接池中的最小空闲连接min-idle: 0# 连接池最大连接数(使用负值表示没有限制)max-active: 8# 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: 1000msshutdown-timeout: 1000ms
集群的写法
spring.redis.cluster.nodes=115.xxx.xx.xxx:7000,115.xxx.xx.xxx:7001,...,111.xxx.xxx.xx:7008spring.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*/@Overridepublic Set<String> getKeys(String pattern) {return redisTemplate.keys(pattern);}/*** 获取所有key* @return*/@Overridepublic Set<String> getKeys() {return getKeys("*");}/*** 判断key是否存在* @param key* @return*/@Overridepublic Boolean exists(String key) {return redisTemplate.hasKey(key);}/*** 根据key删除* @param key*/@Overridepublic void del(String key) {redisTemplate.delete(key);}/*** 存入redis* @param key* @param value*/@Overridepublic void set(String key, String value) {redisTemplate.opsForValue().set(key, value);}/*** 存入redis并设置失效时间* @param key* @param value* @param expire*/@Overridepublic void set(String key, String value, Integer expire) {redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);}/*** 根据key获取value* @param key* @return*/@Overridepublic String get(String key) {return redisTemplate.opsForValue().get(key);}/*** 设置失效时间* @param key* @param expire*/@Overridepublic void expire(String key, int expire) {redisTemplate.expire(key, expire, TimeUnit.SECONDS);}/*** 在原有的值基础上新增字符串到末尾* @param key* @param value*/@Overridepublic void append(String key, String value) {redisTemplate.opsForValue().append(key, value);}/*** 获取原来key键对应的值并重新赋新值* @param key* @param newValue* @return*/@Overridepublic String getset(String key, String newValue) {return redisTemplate.opsForValue().getAndSet(key, newValue);}/*** 如果键不存在则新增,存在则不改变已经有的值* @param key* @param value* @return*/@Overridepublic boolean setnx(String key, String value) {return redisTemplate.opsForValue().setIfAbsent(key, value);}/*** 以增量的方式将long值存储在变量中,说白了就是增加值,这个key的值必须是 数字,否则报错* @param key* @param delta* @return*/@Overridepublic Long incrBy(String key, Long delta) {return redisTemplate.opsForValue().increment(key, delta);}}
实际应用
这个场景是很常见的应用场景,就是缓存。
步骤如下:
先生成key,看key存在不存在,如果存在,就删掉,不存在就保存。
@AutowiredCache 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_c2bString redisKey = RedisUtil.keyBuilder(appId, platformChannelCode);//根据key查询redisBoolean exists = cache.exists(redisKey);if(exists){cache.del(redisKey);}//根据应用id和服务类型code查询支付渠道参数//根据应用和服务类型找到它们绑定idLong 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串存入rediscache.set(redisKey, JSON.toJSON(payChannelParamDTOS).toString());}}
