当前位置:   article > 正文

spring boot中redis的使用_springboot使用redis

springboot使用redis

1. 添加Redis依赖

首先,需要在pom.xml文件中添加Redis依赖:

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

这个依赖包含了Spring Data Redis,以及Jedis和Lettuce这两种Redis客户端的实现。

2. 配置Redis连接

在SpringBoot项目中,可以通过在application.propertiesapplication.yml文件中配置Redis连接信息。以下是一个示例:

  1. spring:
  2. redis:
  3. host: localhost
  4. port: 6379
  5. password: mypassword
  6. timeout: 3000
  7. database: 0

其中,hostport分别是Redis服务器的地址和端口号,password是Redis的密码(如果没有密码,可以不填),timeout是Redis连接超时时间,jedis.pool是连接池的相关设置。

3. 创建RedisTemplate

使用Spring Data Redis操作Redis,通常会使用RedisTemplate类。为了方便起见,我们可以创建一个工具类来管理RedisTemplate的创建和使用。以下是一个示例:

  1. package com.redisTest.system.utils;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.data.redis.core.RedisTemplate;
  5. import org.springframework.data.redis.core.ValueOperations;
  6. import org.springframework.stereotype.Component;
  7. import javax.annotation.Resource;
  8. import java.util.Set;
  9. import java.util.concurrent.TimeUnit;
  10. /**
  11. * @author luft-mensch
  12. */
  13. @Component
  14. public class RedisUtils {
  15. /**
  16. * 如果使用 @Autowired 注解完成自动装配 那么
  17. * RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>
  18. * 如果你使用其他类型的 比如RedisTemplate<String,Object>
  19. * 那么请使用 @Resource 注解
  20. * */
  21. @Resource
  22. private RedisTemplate<String,Object> redisTemplate;
  23. private Logger logger = LoggerFactory.getLogger(this.getClass());
  24. /**
  25. * 缓存value
  26. *
  27. * @param key
  28. * @param value
  29. * @param time
  30. * @return
  31. */
  32. public boolean cacheValue(String key, Object value, long time) {
  33. try {
  34. ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
  35. valueOperations.set(key, value);
  36. if (time > 0) {
  37. // 如果有设置超时时间的话
  38. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  39. }
  40. return true;
  41. } catch (Throwable e) {
  42. logger.error("缓存[" + key + "]失败, value[" + value + "] " + e.getMessage());
  43. }
  44. return false;
  45. }
  46. /**
  47. * 缓存value,没有设置超时时间
  48. *
  49. * @param key
  50. * @param value
  51. * @return
  52. */
  53. public boolean cacheValue(String key, Object value) {
  54. return cacheValue(key, value, -1);
  55. }
  56. /**
  57. * 判断缓存是否存在
  58. *
  59. * @param key
  60. * @return
  61. */
  62. public boolean containsKey(String key) {
  63. try {
  64. return redisTemplate.hasKey(key);
  65. } catch (Throwable e) {
  66. logger.error("判断缓存是否存在时失败key[" + key + "]", "err[" + e.getMessage() + "]");
  67. }
  68. return false;
  69. }
  70. /**
  71. * 根据key,获取缓存
  72. *
  73. * @param key
  74. * @return
  75. */
  76. public Object getValue(String key) {
  77. try {
  78. ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
  79. return valueOperations.get(key);
  80. } catch (Throwable e) {
  81. logger.error("获取缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
  82. }
  83. return null;
  84. }
  85. /**
  86. * 移除缓存
  87. *
  88. * @param key
  89. * @return
  90. */
  91. public boolean removeValue(String key) {
  92. try {
  93. redisTemplate.delete(key);
  94. return true;
  95. } catch (Throwable e) {
  96. logger.error("移除缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
  97. }
  98. return false;
  99. }
  100. /**
  101. * 根据前缀移除所有以传入前缀开头的key-value
  102. *
  103. * @param pattern
  104. * @return
  105. */
  106. public boolean removeKeys(String pattern) {
  107. try {
  108. Set<String> keySet = redisTemplate.keys(pattern + "*");
  109. redisTemplate.delete(keySet);
  110. return true;
  111. } catch (Throwable e) {
  112. logger.error("移除key[" + pattern + "]前缀的缓存时失败", "err[" + e.getMessage() + "]");
  113. }
  114. return false;
  115. }
  116. }

在这个示例中,我们使用@Resource注解自动注入了一个RedisTemplate<String, Object>对象。然后,我们提供了三个方法来对Redis进行操作:cacheValue方法用于缓存数据,getValue方法用于获取缓存数据,removeValue方法用于删除缓存数据。这些方法都是通过redisTemplate对象来实现的。

需要注意的是,在使用RedisTemplate时,需要指定键值对的类型。在这个示例中,我们指定了键的类型为String,值的类型为Object

注意:

 * 如果使用 @Autowired 注解完成自动装配 

 * 那么 RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>

 * 如果你使用其他类型的 比如RedisTemplate<String,Object>

 * 那么请使用 @Resource 注解,否则会报以下错误:RedisTemplate 注入失败

  1. Description:
  2. Field redisTemplate in com.redisTest.system.utils.RedisUtils required a bean of type 'org.springframework.data.redis.core.RedisTemplate' that could not be found.
  3. The injection point has the following annotations:
  4. - @org.springframework.beans.factory.annotation.Autowired(required=true)
  5. Action:
  6. Consider defining a bean of type 'org.springframework.data.redis.core.RedisTemplate' in your configuration.
  7. 进程已结束,退出代码1

4. 使用RedisTemplate

在上面的示例中,我们已经创建了一个RedisTemplate对象,并提供了一些方法来对Redis进行操作。现在,我们可以在SpringBoot项目中的任何地方使用这个工具类来进行缓存操作。以下是一个示例

  1. @RestController
  2. public class UserController {
  3. @Autowired
  4. private RedisUtils redisUtils;
  5. @Autowired
  6. private UserService userService;
  7. @GetMapping("/users/{id}")
  8. public User getUserById(@PathVariable Long id) {
  9. String key = "user_" + id;
  10. User user = (User) redisUtils.getValue(key);
  11. if (user == null) {
  12. user = userService.getUserById(id);
  13. redisUtils.cacheValue(key, user);
  14. }
  15. return user;
  16. }
  17. }

在这个示例中,我们创建了一个UserController类,用于处理HTTP请求。在getUserById方法中,我们首先构造了一个缓存的key,然后使用redisUtils.getValue方法从Redis中获取缓存数据。如果缓存中没有数据,我们调用userService.getUserById方法从数据库中获取数据,并使用redisUtils.cacheValue方法将数据存入Redis缓存中。最后,返回获取到的数据。

通过这个示例,我们可以看到,在SpringBoot项目中使用Redis作为缓存的流程。我们首先需要添加Redis依赖,然后在配置文件中配置Redis连接信息。接着,我们创建了一个RedisUtils工具类来管理RedisTemplate的创建和使用。最后,我们在控制器中使用RedisUtils来对Redis进行缓存操作。

5. 乱码解决

Redis 使用过程中可能会遇到 key 和 value 乱码的现象存在,具体解决方法见:

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

闽ICP备14008679号