1. 添加Redis依赖
首先,需要在pom.xml文件中添加Redis依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
这个依赖包含了Spring Data Redis,以及Jedis和Lettuce这两种Redis客户端的实现。
2. 配置Redis连接
在SpringBoot项目中,可以通过在application.properties或application.yml文件中配置Redis连接信息。以下是一个示例:
spring:
redis:
host: localhost
port: 6379
password: mypassword
timeout: 3000
database: 0
其中,host和port分别是Redis服务器的地址和端口号,password是Redis的密码(如果没有密码,可以不填),timeout是Redis连接超时时间,jedis.pool是连接池的相关设置。
3. 创建RedisTemplate
使用Spring Data Redis操作Redis,通常会使用RedisTemplate类。为了方便起见,我们可以创建一个工具类来管理RedisTemplate的创建和使用。以下是一个示例:
package com.redisTest.system.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author luft-mensch
*/
@Component
public class RedisUtils {
/**
* 如果使用 @Autowired 注解完成自动装配 那么
* RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>
* 如果你使用其他类型的 比如RedisTemplate<String,Object>
* 那么请使用 @Resource 注解
* */
@Resource
private RedisTemplate<String,Object> redisTemplate;
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 缓存value
*
* @param key
* @param value
* @param time
* @return
*/
public boolean cacheValue(String key, Object value, long time) {
try {
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, value);
if (time > 0) {
// 如果有设置超时时间的话
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Throwable e) {
logger.error("缓存[" + key + "]失败, value[" + value + "] " + e.getMessage());
}
return false;
}
/**
* 缓存value,没有设置超时时间
*
* @param key
* @param value
* @return
*/
public boolean cacheValue(String key, Object value) {
return cacheValue(key, value, -1);
}
/**
* 判断缓存是否存在
*
* @param key
* @return
*/
public boolean containsKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Throwable e) {
logger.error("判断缓存是否存在时失败key[" + key + "]", "err[" + e.getMessage() + "]");
}
return false;
}
/**
* 根据key,获取缓存
*
* @param key
* @return
*/
public Object getValue(String key) {
try {
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
return valueOperations.get(key);
} catch (Throwable e) {
logger.error("获取缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
}
return null;
}
/**
* 移除缓存
*
* @param key
* @return
*/
public boolean removeValue(String key) {
try {
redisTemplate.delete(key);
return true;
} catch (Throwable e) {
logger.error("移除缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
}
return false;
}
/**
* 根据前缀移除所有以传入前缀开头的key-value
*
* @param pattern
* @return
*/
public boolean removeKeys(String pattern) {
try {
Set<String> keySet = redisTemplate.keys(pattern + "*");
redisTemplate.delete(keySet);
return true;
} catch (Throwable e) {
logger.error("移除key[" + pattern + "]前缀的缓存时失败", "err[" + e.getMessage() + "]");
}
return false;
}
}
在这个示例中,我们使用@Resource注解自动注入了一个RedisTemplate<String, Object>对象。然后,我们提供了三个方法来对Redis进行操作:cacheValue方法用于缓存数据,getValue方法用于获取缓存数据,removeValue方法用于删除缓存数据。这些方法都是通过redisTemplate对象来实现的。
需要注意的是,在使用RedisTemplate时,需要指定键值对的类型。在这个示例中,我们指定了键的类型为String,值的类型为Object。
注意:
* 如果使用 @Autowired 注解完成自动装配
* 那么 RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>
* 如果你使用其他类型的 比如RedisTemplate<String,Object>
* 那么请使用 @Resource 注解,否则会报以下错误:RedisTemplate 注入失败
Description:
Field redisTemplate in com.redisTest.system.utils.RedisUtils required a bean of type 'org.springframework.data.redis.core.RedisTemplate' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.springframework.data.redis.core.RedisTemplate' in your configuration.
进程已结束,退出代码1
文章来源地址https://uudwc.com/A/AA62a
4. 使用RedisTemplate
在上面的示例中,我们已经创建了一个RedisTemplate对象,并提供了一些方法来对Redis进行操作。现在,我们可以在SpringBoot项目中的任何地方使用这个工具类来进行缓存操作。以下是一个示例
@RestController
public class UserController {
@Autowired
private RedisUtils redisUtils;
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
String key = "user_" + id;
User user = (User) redisUtils.getValue(key);
if (user == null) {
user = userService.getUserById(id);
redisUtils.cacheValue(key, user);
}
return user;
}
}
在这个示例中,我们创建了一个UserController类,用于处理HTTP请求。在getUserById方法中,我们首先构造了一个缓存的key,然后使用redisUtils.getValue方法从Redis中获取缓存数据。如果缓存中没有数据,我们调用userService.getUserById方法从数据库中获取数据,并使用redisUtils.cacheValue方法将数据存入Redis缓存中。最后,返回获取到的数据。
通过这个示例,我们可以看到,在SpringBoot项目中使用Redis作为缓存的流程。我们首先需要添加Redis依赖,然后在配置文件中配置Redis连接信息。接着,我们创建了一个RedisUtils工具类来管理RedisTemplate的创建和使用。最后,我们在控制器中使用RedisUtils来对Redis进行缓存操作。
5. 乱码解决
Redis 使用过程中可能会遇到 key 和 value 乱码的现象存在,具体解决方法见:文章来源:https://uudwc.com/A/AA62a