文章目录
一、概要
Redis是一种高性能、非关系型的内存键值存储系统。它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。Redis使用内存作为主要存储介质,因此具有快速的读写速度。它也可以将数据持久化到磁盘,以防止数据丢失。
二、配置Redis
1.添加Redis依赖
在项目的pom.xml中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置Redis连接信息
在项目的application.properties文件中添加以下配置:
#redis连接配置
spring.redis.host=192.168.129.132
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
提示:其中,spring.redis.host和spring.redis.port分别指定了Redis服务器的IP地址和端口号。如果Redis服务器有密码认证,则需要在spring.redis.password中配置密码。spring.redis.database指定了使用的数据库,默认为0。spring.redis.timeout指定了连接超时时间,单位为毫秒。spring.redis.lettuce.pool.max-active指定了连接池中最大连接数,负数表示没有限制。spring.redis.lettuce.pool.max-wait指定了最大阻塞等待时间,负数表示没有限制。spring.redis.lettuce.pool.max-idle=5指定了连接池中的最大空闲连接。spring.redis.lettuce.pool.min-idle指定了连接池中的最小空闲连接。
三、使用RedisTemplate操作数据
1.创建RedisTemplate Bean
在项目中新建config包,并在其下新建RedisConfig配置类
@Configuration
public class RedisConfig {
/**
* 自定义key规则
* @return
*/
/*@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... 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();
}
};
}*/
/**
* 设置RedisTemplate规则
*
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//序列号key value
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 设置CacheManager缓存规则
*
* @param factory
* @return
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
提示:KeyGenerator Bean会为Redis自动配置key的规则,如果不配则需要在保存数据时进行手动添加
2.使用RedisTemplate进行数据操作
使用@Autowired注解将RedisTemplate注入到需要使用的类中,然后即可使用RedisTemplate进行数据操作,例如:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void put(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
提示:上述代码中,通过redisTemplate.opsForValue()获取Redis字符串操作对象,并使用set方法设置key-value数据。通过get方法获取指定key的value数据。
四、使用注解进行缓存操作
1.开启缓存注解支持
在启动类上添加@EnableCaching注解开启缓存注解支持:
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.使用注解进行缓存操作
在需要进行缓存的方法上添加@Cacheable注解即可进行缓存操作,例如:
@Cacheable("books")
public List<Book> getAllBooks() {
// 从数据库中获取所有书籍数据
return bookService.getAllBooks();
}
提示:上述代码中,@Cacheable("books")指定了缓存名称为books,表示该方法返回的数据将被缓存在Redis中。在下次调用该方法时,如果缓存中存在数据,则直接返回缓存数据,不会再执行方法体内的逻辑。 @CachePut注解可以用于更新缓存数据,@CacheEvict注解可以用于删除缓存数据。