当前位置:   article > 正文

在SpringBoot项目中配置Redis_springboot redis配置

springboot redis配置

目录

一、前言

二、使用步骤

1. 引入start依赖

2. 在application.yml配置文件中做相应配置

3. 配置Redis序列化器

4. 将序列化器配置到redisTemplate中

5. 封装Redis操作工具类


一、前言

我们知道Redis适用于存储频繁使用的数据,因为Redis数据库是基于缓存的非关系数据库,相比较关系型数据库,查询的速度更快,但不适合表示复杂关系,那知道它这一特性,就会明白在实际项目中,会经常使用到Redis,就比如我最近做的博客项目,就是将文章浏览量存储到Redis中,因为每次都从数据库中去查询浏览量,肯定效率就不是很高了,所以我就在最开始就将文章的浏览量数据放到Redis中,每次也是更新的浏览量中的数据,再使用定时框架,定时的更新到数据库即可,另外秒杀的时候也要用到Redis,既然Redis使用这么频繁,那么该怎样使用Java语言操作Redis呢?接下来,我就讲一下在SpringBoot项目中如何配置Redis,下面我就简单说明步骤。

二、使用步骤

其实配置Redis和配置其它东西都差不多,既然使用了SpringBoot,基于自动配置,使用无非就是引依赖、然后在yml配置文件中做相应的配置即可,或者还可以使用配置类进行配置,有个时候可能还要启动一下,在启动类上面加个启动注解,使用Redis不需要这一步。

1. 引入start依赖

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

由于序列化方式依靠的是fastjson序列化框架,因此也要有fastjson依赖,如果没有使用自定义序列化,则这个不是必须的,另外如果基于的是其它第三方序列化框架,则添加对应的依赖即可

  1. <!--fastjson依赖-->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.76</version>
  6. </dependency>

2. 在application.yml配置文件中做相应配置

  1. spring:
  2. redis:
  3. # Redis本地服务器地址,注意要开启redis服务,即那个redis-server.exe
  4. host: localhost
  5. # Redis服务器端口,默认为6379.若有改动按改动后的来
  6. port: 6379
  7. #Redis服务器连接密码,默认为空,若有设置按设置的来
  8. password:
  9. lettuce:
  10. pool:
  11. # 连接池最大连接数,若为负数则表示没有任何限制
  12. max-active: 8
  13. # 连接池最大阻塞等待时间,若为负数则表示没有任何限制
  14. max-wait: -1
  15. # 连接池中的最大空闲连接
  16. max-idle: 8

3. 配置Redis序列化器

  1. public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
  2. {
  3. @SuppressWarnings("unused")
  4. private ObjectMapper objectMapper = new ObjectMapper();
  5. //配置序列化与反序列化字符集
  6. public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
  7. private Class<T> clazz;
  8. //开启 fastjson 序列化库的自动类型支持功能,开启后,会在序列化或反序列化过程中自动添加类型信息,确保序列化与反序列化成功
  9. static
  10. {
  11. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  12. }
  13. public FastJson2JsonRedisSerializer(Class<T> clazz)
  14. {
  15. super();
  16. this.clazz = clazz;
  17. }
  18. //序列化过程,使用fastjson将对象转为字节数组
  19. @Override
  20. public byte[] serialize(T t) throws SerializationException
  21. {
  22. if (t == null)
  23. {
  24. return new byte[0];
  25. }
  26. //添加SerializerFeature.WriteClassName可以在序列化时,添加类型信息
  27. return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
  28. }
  29. //反序列化过程,将字节数组转为Java对象
  30. @Override
  31. public T deserialize(byte[] bytes) throws SerializationException
  32. {
  33. if (bytes == null || bytes.length <= 0)
  34. {
  35. return null;
  36. }
  37. String str = new String(bytes, DEFAULT_CHARSET);
  38. //解析为clazz类型的对象
  39. return JSON.parseObject(str, clazz);
  40. }
  41. public void setObjectMapper(ObjectMapper objectMapper)
  42. {
  43. Assert.notNull(objectMapper, "'objectMapper' must not be null");
  44. this.objectMapper = objectMapper;
  45. }
  46. protected JavaType getJavaType(Class<?> clazz)
  47. {
  48. return TypeFactory.defaultInstance().constructType(clazz);
  49. }
  50. }

4. 将序列化器配置到redisTemplate中

  1. @Configuration
  2. public class RedisConfig {
  3. @Bean
  4. @SuppressWarnings(value = { "unchecked", "rawtypes" })
  5. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
  6. {
  7. RedisTemplate<Object, Object> template = new RedisTemplate<>();
  8. template.setConnectionFactory(connectionFactory);
  9. FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
  10. ObjectMapper mapper = new ObjectMapper();
  11. mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  12. mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
  13. serializer.setObjectMapper(mapper);
  14. // 使用StringRedisSerializer来序列化和反序列化redis的key值
  15. template.setKeySerializer(new StringRedisSerializer());
  16. template.setValueSerializer(serializer);
  17. // Hash的key也采用StringRedisSerializer的序列化方式
  18. template.setHashKeySerializer(new StringRedisSerializer());
  19. template.setHashValueSerializer(serializer);
  20. template.afterPropertiesSet();
  21. return template;
  22. }
  23. }

5. 封装Redis操作工具类

  1. @Component
  2. public class RedisCache
  3. {
  4. @Autowired
  5. public RedisTemplate redisTemplate;
  6. /**
  7. * 缓存基本的对象,Integer、String、实体类等
  8. *
  9. * @param key 缓存的键值
  10. * @param value 缓存的值
  11. */
  12. public <T> void setCacheObject(final String key, final T value)
  13. {
  14. redisTemplate.opsForValue().set(key, value);
  15. }
  16. /**
  17. * 缓存基本的对象,Integer、String、实体类等
  18. *
  19. * @param key 缓存的键值
  20. * @param value 缓存的值
  21. * @param timeout 时间
  22. * @param timeUnit 时间颗粒度
  23. */
  24. public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
  25. {
  26. redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
  27. }
  28. /**
  29. * 设置有效时间
  30. *
  31. * @param key Redis键
  32. * @param timeout 超时时间
  33. * @return true=设置成功;false=设置失败
  34. */
  35. public boolean expire(final String key, final long timeout)
  36. {
  37. return expire(key, timeout, TimeUnit.SECONDS);
  38. }
  39. /**
  40. * 设置有效时间
  41. *
  42. * @param key Redis键
  43. * @param timeout 超时时间
  44. * @param unit 时间单位
  45. * @return true=设置成功;false=设置失败
  46. */
  47. public boolean expire(final String key, final long timeout, final TimeUnit unit)
  48. {
  49. return redisTemplate.expire(key, timeout, unit);
  50. }
  51. /**
  52. * 获得缓存的基本对象。
  53. *
  54. * @param key 缓存键值
  55. * @return 缓存键值对应的数据
  56. */
  57. public <T> T getCacheObject(final String key)
  58. {
  59. ValueOperations<String, T> operation = redisTemplate.opsForValue();
  60. return operation.get(key);
  61. }
  62. /**
  63. * 删除单个对象
  64. *
  65. * @param key
  66. */
  67. public boolean deleteObject(final String key)
  68. {
  69. return redisTemplate.delete(key);
  70. }
  71. /**
  72. * 删除集合对象
  73. *
  74. * @param collection 多个对象
  75. * @return
  76. */
  77. public long deleteObject(final Collection collection)
  78. {
  79. return redisTemplate.delete(collection);
  80. }
  81. /**
  82. * 缓存List数据
  83. *
  84. * @param key 缓存的键值
  85. * @param dataList 待缓存的List数据
  86. * @return 缓存的对象
  87. */
  88. public <T> long setCacheList(final String key, final List<T> dataList)
  89. {
  90. Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
  91. return count == null ? 0 : count;
  92. }
  93. /**
  94. * 获得缓存的list对象
  95. *
  96. * @param key 缓存的键值
  97. * @return 缓存键值对应的数据
  98. */
  99. public <T> List<T> getCacheList(final String key)
  100. {
  101. return redisTemplate.opsForList().range(key, 0, -1);
  102. }
  103. /**
  104. * 缓存Set
  105. *
  106. * @param key 缓存键值
  107. * @param dataSet 缓存的数据
  108. * @return 缓存数据的对象
  109. */
  110. public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
  111. {
  112. BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
  113. Iterator<T> it = dataSet.iterator();
  114. while (it.hasNext())
  115. {
  116. setOperation.add(it.next());
  117. }
  118. return setOperation;
  119. }
  120. /**
  121. * 获得缓存的set
  122. *
  123. * @param key
  124. * @return
  125. */
  126. public <T> Set<T> getCacheSet(final String key)
  127. {
  128. return redisTemplate.opsForSet().members(key);
  129. }
  130. /**
  131. * 缓存Map
  132. *
  133. * @param key
  134. * @param dataMap
  135. */
  136. public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
  137. {
  138. if (dataMap != null) {
  139. redisTemplate.opsForHash().putAll(key, dataMap);
  140. }
  141. }
  142. /**
  143. * 获得缓存的Map
  144. *
  145. * @param key
  146. * @return
  147. */
  148. public <T> Map<String, T> getCacheMap(final String key)
  149. {
  150. return redisTemplate.opsForHash().entries(key);
  151. }
  152. /**
  153. * 往Hash中存入数据
  154. *
  155. * @param key Redis键
  156. * @param hKey Hash键
  157. * @param value 值
  158. */
  159. public <T> void setCacheMapValue(final String key, final String hKey, final T value)
  160. {
  161. redisTemplate.opsForHash().put(key, hKey, value);
  162. }
  163. /**
  164. * 获取Hash中的数据
  165. *
  166. * @param key Redis键
  167. * @param hKey Hash键
  168. * @return Hash中的对象
  169. */
  170. public <T> T getCacheMapValue(final String key, final String hKey)
  171. {
  172. HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
  173. return opsForHash.get(key, hKey);
  174. }
  175. /**
  176. * 删除Hash中的数据
  177. *
  178. * @param key
  179. * @param hkey
  180. */
  181. public void delCacheMapValue(final String key, final String hkey)
  182. {
  183. HashOperations hashOperations = redisTemplate.opsForHash();
  184. hashOperations.delete(key, hkey);
  185. }
  186. /**
  187. * 获取多个Hash中的数据
  188. *
  189. * @param key Redis键
  190. * @param hKeys Hash键集合
  191. * @return Hash对象集合
  192. */
  193. public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
  194. {
  195. return redisTemplate.opsForHash().multiGet(key, hKeys);
  196. }
  197. /**
  198. * 获得缓存的基本对象列表
  199. *
  200. * @param pattern 字符串前缀
  201. * @return 对象列表
  202. */
  203. public Collection<String> keys(final String pattern)
  204. {
  205. return redisTemplate.keys(pattern);
  206. }
  207. /**
  208. * 为Redis中value对应的map增加value
  209. * @param key 键值
  210. * @param hKey value-map对应的键值
  211. * @param v value-map 对应的value值
  212. */
  213. public void incrementCacheMapValue(String key,String hKey,int v){
  214. redisTemplate.boundHashOps(key).increment(hKey, v);
  215. }
  216. }

如果大家对Redis的序列化还想进一步了解的化,可以参考我的另外一篇文章

https://blog.csdn.net/m0_63445035/article/details/130371592?spm=1001.2014.3001.5502

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/152212
推荐阅读
相关标签
  

闽ICP备14008679号