Redis是一种常见的运行在内存的键值数据库,以字符串类型为中心,能够支持多种数据类型,包括字符串,散列表,列表(链表),集合,有序集合。
下面我们具体示范SpringBoot中操作Redis。
先安利一款美观免费的Redis可视化操作工具:https://github.com/qishibo/AnotherRedisDesktopManager/releases
首先先引入maven坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
我们使用jedis连接驱动。
在application.prperties中添加配置
spring.cache.type=redis
spring.cache.cache-names=rediscache
spring.redis.host=localhost #redis服务器地址
spring.redis.port=6379 #端口
#jedis连接池
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=2000ms
配置好后可以直接依赖注入使用RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
RedisTemplate中封装了大量的opsForxxx方法用来操作数据,每一个方法对应一种数据类型,如:
这些方法返回的RedisOperation内又有操作具体数据类型的方法,方法名都与redis命令名相同,如果对redis命令比较熟悉的话可以轻松使用:
当我们查看redis中的键值时可能会发现不是我们想象的字符串:
这是因为redis默认使用jdk序列化器,我们可以在配置类里配置redis序列化器:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory)
{
RedisTemplate<Object,Object> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
//配置默认序列化器
redisTemplate.setDefaultSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
// redisTemplate.setDefaultSerializer(redisTemplate.getStringSerializer());
return redisTemplate;
}
}
在开发中我们还可以通过缓存注解操作redis,使用@CachePut,@Cacheable ,@CacheEvict,@EnableCaching这四个注解。
先把@EnableCaching放在启动类上
@SpringBootApplication
@EnableCaching
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class RedisAnnotationService {
//将返回结果放入缓存,value与application.properties中的
//spring.cache.cache-names=rediscache相同
@CachePut(value = "rediscache", key = "'user_'+#result.id",condition = "#result!='null'")
public User insertUser(User user)
{
System.out.println("cache put------------------");
return user;
}
//先从缓存中查找,如果没有,调用方法查询,将查询结果放入缓存
@Cacheable(value = "rediscache", key="'user_'+#id",condition = "#result!='null'")
public User getUser(Integer id)
{
System.out.println("get user-------------------------------");
return new User(id,"he");
}
//将缓存失效
@CacheEvict(value = "rediscache", key="'user_'+#id")
public void deleteUser(Integer id)
{
System.out.println("delete user----------------------------");
}
}
要注意缓存对象要实现Serializable接口,否则无法序列化
public class User implements Serializable {
private Integer id;
private String name;
..省略构造函数, get set
}