注意一点:这个是StringRedisTemplate而不是 RedisTemplate

依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

配置文件

单机redis的写法

  1. spring:
  2. redis:
  3. # Redis数据库索引(默认为0
  4. database: 0
  5. host: 127.0.0.1
  6. port: 6379
  7. # 连接超时时间(毫秒)
  8. timeout: 1000ms
  9. password: 123456
  10. lettuce:
  11. pool:
  12. # 连接池中的最大空闲连接
  13. max-idle: 8
  14. # 连接池中的最小空闲连接
  15. min-idle: 0
  16. # 连接池最大连接数(使用负值表示没有限制)
  17. max-active: 8
  18. # 连接池最大阻塞等待时间(使用负值表示没有限制)
  19. max-wait: 1000ms
  20. shutdown-timeout: 1000ms

集群的写法

  1. spring.redis.cluster.nodes=115.xxx.xx.xxx:7000,115.xxx.xx.xxx:7001,...,111.xxx.xxx.xx:7008
  2. spring.redis.password=password # 没有密码不写

接口

  1. import java.util.Set;
  2. public interface Cache {
  3. /**
  4. * 列出所有的key
  5. * @return
  6. */
  7. Set<String> getKeys();
  8. Set<String> getKeys(String pattern);
  9. /**
  10. * 检查给定key是否存在
  11. *
  12. * @param key
  13. * @return
  14. */
  15. Boolean exists(String key);
  16. /**
  17. * 移除给定的一个或多个key。如果key不存在,则忽略该命令。
  18. *
  19. * @param key
  20. */
  21. void del(String key);
  22. /**
  23. * 简单的字符串设置
  24. *
  25. * @param key
  26. * @param value
  27. */
  28. void set(String key, String value);
  29. /**
  30. *
  31. * @param key
  32. * @param value
  33. * @param expiration
  34. */
  35. void set(String key, String value, Integer expiration);
  36. /**
  37. * 返回key所关联的字符串值
  38. *
  39. * @param key
  40. * @return
  41. */
  42. String get(String key);
  43. /**
  44. * key seconds 为给定key设置生存时间。当key过期时,它会被自动删除。
  45. *
  46. * @param key
  47. * @param expire
  48. */
  49. void expire(String key, int expire);
  50. /**
  51. * 如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。
  52. *
  53. * @param key
  54. * @param value
  55. */
  56. void append(String key, String value);
  57. /**
  58. * 获取旧值返回新值,不存在返回nil
  59. *
  60. * @param key
  61. * @param newValue
  62. * @return 旧值
  63. */
  64. String getset(String key, String newValue);
  65. /**
  66. * 分布锁
  67. *
  68. * @param key
  69. * @param value
  70. * @return
  71. */
  72. boolean setnx(String key, String value);
  73. /**
  74. * 计数器
  75. */
  76. Long incrBy(String key, Long delta);
  77. }

工具类实现

  1. import com.shanjupay.common.cache.Cache;
  2. import org.springframework.data.redis.core.StringRedisTemplate;
  3. import java.util.Set;
  4. import java.util.concurrent.TimeUnit;
  5. public class RedisCache implements Cache {
  6. private StringRedisTemplate redisTemplate;
  7. public RedisCache(StringRedisTemplate redisTemplate) {
  8. this.redisTemplate = redisTemplate;
  9. }
  10. /**
  11. * 模糊查询,获取key
  12. * @param pattern
  13. * @return
  14. */
  15. @Override
  16. public Set<String> getKeys(String pattern) {
  17. return redisTemplate.keys(pattern);
  18. }
  19. /**
  20. * 获取所有key
  21. * @return
  22. */
  23. @Override
  24. public Set<String> getKeys() {
  25. return getKeys("*");
  26. }
  27. /**
  28. * 判断key是否存在
  29. * @param key
  30. * @return
  31. */
  32. @Override
  33. public Boolean exists(String key) {
  34. return redisTemplate.hasKey(key);
  35. }
  36. /**
  37. * 根据key删除
  38. * @param key
  39. */
  40. @Override
  41. public void del(String key) {
  42. redisTemplate.delete(key);
  43. }
  44. /**
  45. * 存入redis
  46. * @param key
  47. * @param value
  48. */
  49. @Override
  50. public void set(String key, String value) {
  51. redisTemplate.opsForValue().set(key, value);
  52. }
  53. /**
  54. * 存入redis并设置失效时间
  55. * @param key
  56. * @param value
  57. * @param expire
  58. */
  59. @Override
  60. public void set(String key, String value, Integer expire) {
  61. redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
  62. }
  63. /**
  64. * 根据key获取value
  65. * @param key
  66. * @return
  67. */
  68. @Override
  69. public String get(String key) {
  70. return redisTemplate.opsForValue().get(key);
  71. }
  72. /**
  73. * 设置失效时间
  74. * @param key
  75. * @param expire
  76. */
  77. @Override
  78. public void expire(String key, int expire) {
  79. redisTemplate.expire(key, expire, TimeUnit.SECONDS);
  80. }
  81. /**
  82. * 在原有的值基础上新增字符串到末尾
  83. * @param key
  84. * @param value
  85. */
  86. @Override
  87. public void append(String key, String value) {
  88. redisTemplate.opsForValue().append(key, value);
  89. }
  90. /**
  91. * 获取原来key键对应的值并重新赋新值
  92. * @param key
  93. * @param newValue
  94. * @return
  95. */
  96. @Override
  97. public String getset(String key, String newValue) {
  98. return redisTemplate.opsForValue().getAndSet(key, newValue);
  99. }
  100. /**
  101. * 如果键不存在则新增,存在则不改变已经有的值
  102. * @param key
  103. * @param value
  104. * @return
  105. */
  106. @Override
  107. public boolean setnx(String key, String value) {
  108. return redisTemplate.opsForValue().setIfAbsent(key, value);
  109. }
  110. /**
  111. * 以增量的方式将long值存储在变量中,说白了就是增加值,这个key的值必须是 数字,否则报错
  112. * @param key
  113. * @param delta
  114. * @return
  115. */
  116. @Override
  117. public Long incrBy(String key, Long delta) {
  118. return redisTemplate.opsForValue().increment(key, delta);
  119. }
  120. }

实际应用

这个场景是很常见的应用场景,就是缓存。

步骤如下:
先生成key,看key存在不存在,如果存在,就删掉,不存在就保存。

  1. @Autowired
  2. Cache cache;
  3. /**
  4. * 根据应用和服务类型将查询到支付渠道参数配置列表写入redis
  5. * @param appId 应用id
  6. * @param platformChannelCode 服务类型code
  7. */
  8. private void updateCache(String appId,String platformChannelCode){
  9. //得到redis中key(付渠道参数配置列表的key)
  10. //格式:SJ_PAY_PARAM:应用id:服务类型code,例如:SJ_PAY_PARAM:ebcecedd-3032-49a6-9691-4770e66577af:shanju_c2b
  11. String redisKey = RedisUtil.keyBuilder(appId, platformChannelCode);
  12. //根据key查询redis
  13. Boolean exists = cache.exists(redisKey);
  14. if(exists){
  15. cache.del(redisKey);
  16. }
  17. //根据应用id和服务类型code查询支付渠道参数
  18. //根据应用和服务类型找到它们绑定id
  19. Long appPlatformChannelId = selectIdByAppPlatformChannel(appId, platformChannelCode);
  20. if(appPlatformChannelId != null){
  21. //应用和服务类型绑定id查询支付渠道参数记录
  22. List<PayChannelParam> payChannelParams = payChannelParamMapper.selectList(new LambdaQueryWrapper<PayChannelParam>().eq(PayChannelParam::getAppPlatformChannelId, appPlatformChannelId));
  23. List<PayChannelParamDTO> payChannelParamDTOS = PayChannelParamConvert.INSTANCE.listentity2listdto(payChannelParams);
  24. //将payChannelParamDTOS转成json串存入redis
  25. cache.set(redisKey, JSON.toJSON(payChannelParamDTOS).toString());
  26. }
  27. }