1. Redis简介
Redis是一种基于内存的数据结构存储系统,使用键值对存储数据。与传统的关系型数据库相比,Redis具有极高的性能和可伸缩性,适合大量数据的快速读写。Redis支持多种数据类型,如字符串、哈希表、列表、集合等,还支持事务和Lua脚本等特性。
在应用开发中,Redis通常被用作缓存、消息队列、计数器等。缓存是Redis最受欢迎的应用场景之一,通过将经常使用的数据存储到Redis中,可以加速应用程序的响应速度。
2. SpringBoot集成Redis
2.1 添加依赖
在SpringBoot项目中使用Redis,需要添加对应的依赖。可以在Maven或Gradle配置文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2 配置Redis连接信息
在SpringBoot项目中,可以通过配置文件来设置Redis连接信息。在application.properties或application.yml文件中添加以下配置:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
spring.redis.timeout=3000
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
其中,
spring.redis.host:Redis服务器的主机地址。
spring.redis.port:Redis服务器的端口号。
spring.redis.password:Redis服务器的连接密码,如果没有密码则为空。
spring.redis.database:Redis服务器的数据库编号,默认为0。
spring.redis.timeout:Redis服务器的连接超时时间,默认为3000毫秒。
spring.redis.pool.max-idle:连接池中最大的空闲连接数。
spring.redis.pool.min-idle:连接池中最小的空闲连接数。
spring.redis.pool.max-active:连接池最大的连接数。
spring.redis.pool.max-wait:连接池获取连接的最大等待时间,单位为毫秒。
2.3 编写Redis配置类
完成Redis连接信息的配置后,需要编写一个Redis配置类,用于创建RedisTemplate对象和RedisConnectionFactory对象。
@Configuration
@EnableCaching
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
/**
* 创建RedisTemplate对象
*/
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerializer来序列化和反序列化Redis的value值
Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSerializer.setObjectMapper(objectMapper);
// 设置value的序列化规则和Key的序列化规则
redisTemplate.setValueSerializer(jacksonSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置hash key和value的序列化规则
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jacksonSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
在上面的配置类中,注入了RedisConnectionFactory对象,并通过@bean注解创建了RedisTemplate对象。在创建RedisTemplate对象时,使用了Jackson2JsonRedisSerializer来序列化和反序列化Redis的value值。并指定了value和key的序列化规则,以及hash key和value的序列化规则。
3. Redis使用示例
3.1 字符串类型
对于字符串类型,可以使用RedisTemplate的opsForValue方法来进行读写操作。示例代码如下:
// 写入字符串数据
redisTemplate.opsForValue().set("mykey", "Hello Redis");
// 读取字符串数据
String value = (String) redisTemplate.opsForValue().get("mykey");
3.2 Hash类型
对于Hash类型,可以使用RedisTemplate的opsForHash方法来进行读写操作。示例代码如下:
// 写入Hash数据
Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("age", 18);
redisTemplate.opsForHash().putAll("person", map);
// 读取Hash数据
Map<Object, Object> data = redisTemplate.opsForHash().entries("person");
3.3 列表类型
对于列表类型,可以使用RedisTemplate的opsForList方法来进行读写操作。示例代码如下:
// 写入列表数据
redisTemplate.opsForList().leftPush("mylist", "a");
redisTemplate.opsForList().leftPush("mylist", "b");
redisTemplate.opsForList().leftPush("mylist", "c");
// 读取列表数据
List<Object> list = redisTemplate.opsForList().range("mylist", 0, -1);
3.4 集合类型
对于集合类型,可以使用RedisTemplate的opsForSet方法来进行读写操作。示例代码如下:
// 写入集合数据
redisTemplate.opsForSet().add("myset", "a", "b", "c");
// 读取集合数据
Set<Object> set = redisTemplate.opsForSet().members("myset");
3.5 zset类型
对于zset类型,可以使用RedisTemplate的opsForZSet方法来进行读写操作。示例代码如下:
// 写入zset数据
redisTemplate.opsForZSet().add("myzset", "a", 1);
redisTemplate.opsForZSet().add("myzset", "b", 2);
redisTemplate.opsForZSet().add("myzset", "c", 3);
// 读取zset数据
Set<Object> zset = redisTemplate.opsForZSet().range("myzset", 0, -1);
4. 集成Redis实现缓存
在SpringBoot中,可以使用@Cacheable注解来实现缓存功能。@Cacheable注解会先从缓存中查找数据,如果缓存中不存在数据,则会执行被注解的方法,并将方法的结果存储到缓存中,下次访问时直接从缓存中读取。
4.1 添加依赖
为了支持@Cacheable注解,在SpringBoot项目中需要添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
4.2 配置缓存信息
在application.properties或application.yml文件中添加以下配置:
spring.cache.type=redis
其中,spring.cache.type是缓存类型,这里配置为redis,表示使用Redis作为缓存。
4.3 编写缓存配置类
创建一个缓存配置类,用于配置缓存管理器和键值生成器。示例代码如下:
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
/**
* 创建缓存管理器
*/
@Bean
public CacheManager cacheManager() {
RedisCacheManager cacheManager = RedisCacheManager.create(redisConnectionFactory);
cacheManager.setTransactionAware(true);
cacheManager.setCachePrefix(new DefaultRedisCachePrefix(":"));
return cacheManager;
}
/**
* 创建键值生成器
*/
@Override
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
}
在上述代码中,注入了RedisConnectionFactory对象,并通过@bean注解创建了RedisCacheManager对象,用于管理缓存。并通过keyGenerator方法创建了键值生成器,用于生成缓存键值。
4.4 给方法添加注解
在需要进行缓存的方法上添加@Cacheable注解即可。在注解中指定缓存键值和缓存时间。示例代码如下:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
/**
* 根据ID获取用户
*/
@Override
@Cacheable(value = "user", key = "#id", cacheManager = "cacheManager", unless = "#result==null")
public User getUserById(String id) {
return userRepository.getUserById(id);
}
}
在上面的示例代码中,使用了@Cacheable注解,value指定缓存名,key指定缓存键值,cacheManager指定使用的缓存管理器,unless指定当方法返回null时不进行缓存。
5. 总结
本文介绍了如何在SpringBoot项目中集成Redis,并使用RedisTemplate对象进行Redis的各种数据类型操作。同时,也介绍了如何在SpringBoot中使用@Cacheable注解实现缓存功能。在实际应用开发中,Redis的高性能和可伸缩性使其成为了很好的缓存和存储方案,能够为应用程序提供更好的性能和稳定性。