tags: [springboot,redis]
categories: [中间件]


前言

这两天做项目上也用到这块,自己在解决自己项目上问题时也用到,其中关于序列化和基本使用这块,重复犯了一些错误,耽误不少时间,所以记录下来

SpringBoot版本:2.2.6 Redis版本:5.0.8 已安装好了Redis于服务器上

基本配置使用

引入依赖

值得注意的是 springboot2.0使用依赖为spring-boot-starter-data-redis,后面依赖commons-pool2是使用lettuce需要的,使用之前的jedis来操作也是可以的,这里没有这么做

  1. <!--redis-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!--redis lettuce-->
  7. <dependency>
  8. <groupId>org.apache.commons</groupId>
  9. <artifactId>commons-pool2</artifactId>
  10. </dependency>

配置文件

建议为Redis配置密码,防止被清数据,另外可以设置Redis自启

  1. redis:
  2. database: 0
  3. password: 密码
  4. host: IP
  5. port: 端口
  6. lettuce:
  7. pool:
  8. max-active: 100
  9. max-idle: 10
  10. max-wait: 3000
  11. timeout: 5000

配置类

在这里设置了默认的序列化方式
如不设置,Redis默认会使用JdkSerializationRedisSerializer来执行序列化,这种序列化方式的缺点在于被序列化的对象必须实现序列化接口,否则会报错

序列化

事实上它也支持序列化为xml格式,只是现如今基本不用该数据格式了,序列化为JSON格式,有使用FastJSON或者Jackson的,我本就是Jackson的忠实用户,自然是使用Jackson来序列化,所以使用GenericJackson2JsonRedisSerializer来序列化对象,但是听说Jackson不支持JAVA8的LocalDate,我还没验证过
到目前为止,我还是认为StringRedisSerializer这种序列化方式是最方便的,即使是对象存入,我们只需要在存入之前将对象序列化,取出来后再反序列化就行了,一般的对象序列化,若存入string字符串,会在外层继续加上一个””,我们存入”string”,后面会变为””string””,导致难以阅读
我目前只用到了string和HASH两种数据结构,这里只有这两种~

  1. @Configuration
  2. public class RedisConfig {
  3. /**
  4. * TODO: 使用泛型接受
  5. *
  6. * @param connectionFactory connectionFactory
  7. * @return RedisTemplate
  8. */
  9. @Bean
  10. public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
  11. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  12. redisTemplate.setKeySerializer(new StringRedisSerializer());
  13. redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
  14. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  15. redisTemplate.setHashValueSerializer(new StringRedisSerializer());
  16. redisTemplate.setConnectionFactory(connectionFactory);
  17. return redisTemplate;
  18. }
  19. @Bean
  20. public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory connectionFactory) {
  21. StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
  22. stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
  23. stringRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
  24. stringRedisTemplate.setHashKeySerializer(new StringRedisSerializer());
  25. stringRedisTemplate.setHashValueSerializer(new StringRedisSerializer());
  26. stringRedisTemplate.setConnectionFactory(connectionFactory);
  27. return stringRedisTemplate;
  28. }
  29. }

到这里我们已经可以使用上面的StringRedisTemplateRedisTemplate来存取数据了,但是为了简化操作,最好还是能对常用redis操作做一些封装,以下是我做项目中用到的一些基本操作

工具类

  1. @Component
  2. public class RedisUtil {
  3. @Resource
  4. private RedisTemplate<String, Object> redisTemplate;
  5. @Resource
  6. private RedisTemplate<String, String> stringStringRedisTemplate;
  7. /**
  8. * 删除key
  9. *
  10. * @param key key
  11. */
  12. public void delete(String key) {
  13. redisTemplate.delete(key);
  14. }
  15. /**
  16. * 批量删除key
  17. *
  18. * @param keys keys
  19. */
  20. public void delete(Collection<String> keys) {
  21. redisTemplate.delete(keys);
  22. }
  23. /**
  24. * 是否存在key
  25. *
  26. * @param key key
  27. * @return Boolean
  28. */
  29. public Boolean hasKey(String key) {
  30. return redisTemplate.hasKey(key);
  31. }
  32. /**
  33. * 取值
  34. *
  35. * @param key key
  36. * @return value
  37. */
  38. public String get(String key){
  39. return stringStringRedisTemplate.opsForValue().get(key);
  40. }
  41. /**
  42. * 存入KEY并设置过期时间
  43. *
  44. * @param key key
  45. * @param value value
  46. * @param seconds 时间
  47. * @param timeUnit 单位
  48. */
  49. public void setKeyWithExpired(String key, String value, int seconds, TimeUnit timeUnit){
  50. stringStringRedisTemplate.opsForValue().set(key, value, seconds, timeUnit);
  51. }
  52. /**
  53. * 存入HASH 并设置key value
  54. *
  55. * @param hash hash
  56. * @param hKey hKey
  57. * @param hValue hValue
  58. */
  59. public void hashPutKey(String hash, String hKey, String hValue){
  60. redisTemplate.opsForHash().put(hash, hKey, hValue);
  61. }
  62. /**
  63. * 获取指定hash下指定key的value
  64. * @param hash hash
  65. * @param hKey hKey
  66. * @return obj
  67. */
  68. public Object hashGetKey(String hash, String hKey){
  69. return redisTemplate.opsForHash().get(hash, hKey);
  70. }
  71. /**
  72. * 存入HASH 并设置key value
  73. *
  74. * @param hash hash
  75. * @return Map<Object, Object>
  76. */
  77. public Map<Object, Object> hashEntries(String hash){
  78. return stringStringRedisTemplate.opsForHash().entries(hash);
  79. }
  80. }