1. 简介
缓存机制是提高系统性能的一种重要手段,它可以极大地降低系统访问数据库等资源的次数,从而缩短响应时间,降低系统负载压力。而Spring提供的Redis注解就是一种实现缓存机制的方式。
2. Redis 简介
Redis是一款开源的内存数据结构存储系统,它支持丰富的数据类型,包括字符串、哈希、列表、集合、有序集合等,还拥有事务、Lua脚本、LRU驱动事件等特性。
2.1 Redis 优势
Redis有以下几个优势:
性能高:Redis完全基于内存,因此在性能上有很好的表现。同时,Redis自身采用单线程模型,避免了线程切换的开销。
使用方便:Redis自带了很多的数据结构,支持丰富的操作命令,使用方便。
扩展性好:Redis支持主从复制、高可用性、集群等特性,能够方便地进行水平扩展或纵向扩展。
3. Spring Redis 注解
Spring Redis注解是Spring提供的一种快捷地实现缓存的方式。通过注解的方式,我们可以将某些方法或某些数据进行缓存,提高系统性能。
Spring Redis注解可以通过以下方式引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.1 @CachePut
@CachePut注解用于向缓存中添加一条新的数据。它会先执行被标记的方法,然后将该方法的返回值加入到缓存中。如果缓存中已经存在这条数据,则会更新原先的值。
@CachePut(value = "user", key = "#id")
public User updateUser(String id, String name, int age){
User user = userDao.findUserById(id);
user.setName(name);
user.setAge(age);
userDao.updateUser(user);
return user;
}
3.2 @CacheEvict
@CacheEvict注解用于将一条数据从缓存中删除。它通常用于删除某个缓存中的数据,或在更新某条数据时先删除原缓存中的数据。
@CacheEvict(value = "user", key = "#id")
public void deleteUser(String id){
userDao.deleteUser(id);
}
3.3 @Cacheable
@Cacheable注解用于从缓存中获取一条数据。如果缓存中已经存在该数据,则直接从缓存中获取。否则,会先执行被标记的方法,然后将该方法的返回值加入到缓存中。
@Cacheable(value = "user", key = "#id")
public User findUserById(String id){
return userDao.findUserById(id);
}
4. Redis Template
除了使用Spring Redis注解外,还可以使用RedisTemplate直接操作Redis。RedisTemplate是Spring提供的一套对Redis的底层封装。它提供了对Redis五种数据结构的基本操作,以及事务、Lua脚本等特性。
RedisTemplate可以通过以下方式引入:
@Autowire
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<String, Object> redisTemplate(){
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
// 设置value的序列化器
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return template;
}
4.1 RedisTemplate 基本操作
RedisTemplate提供了针对Redis五种基本类型的操作方法:
redisTemplate.opsForValue():操作字符串类型
redisTemplate.opsForHash():操作哈希类型
redisTemplate.opsForList():操作列表类型
redisTemplate.opsForSet():操作集合类型
redisTemplate.opsForZSet():操作有序集合类型
4.2 RedisTemplate 事务
RedisTemplate提供了事务操作。
事务的操作包括:开启事务、执行具体操作、提交事务、回滚事务等。
@Autowire
private RedisTemplate<String, Object> redisTemplate
public void testTransactional() {
// 开启事务
redisTemplate.multi();
// 执行具体操作
redisTemplate.opsForValue().set("key1", "value1");
redisTemplate.opsForValue().set("key2", "value2");
// 提交事务
redisTemplate.exec();
}
4.3 RedisTemplate Lua 脚本
RedisTemplate提供了支持Lua脚本的操作。通过执行Lua脚本,我们可以在Redis数据库中完成一些高效的操作。
String script = "return redis.call('get',KEYS[1])";
DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(script);
redisScript.setResultType(String.class);
String result = redisTemplate.execute(redisScript, Collections.singletonList("key1"));
5. 总结
Spring Redis注解和RedisTemplate都是Spring提供的对Redis的操作封装。它们能够帮助我们快捷地对Redis进行访问和操作,从而实现缓存机制,提高系统的性能。