spring boot-16.使用redis做缓存
spring boot 自动配置了多种 缓存管理器,按照下面的顺序查找,如果容器中有相应的组件,则使用相应的缓存管理器。
- Generic
- JCache (JSR-107)
- EhCache 2.x
- Hazelcast
- Infinispan
- Redis
- Guava
- Simple
使用redis 作为缓存的步骤分为以下点
1.安装redis 服务
我使用的是docker 安装的redis,当然也可下载redis安装包,解压后运行。端口映射的6379
2.添加redis 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
3.配置redis
我只配置了redis 的地址,端口默认,没有密码
spring.redis.host=192.168.1.215
关于redis 的其他配置都在spring.redis 下配置
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=30000
4.经过上面的几步,就可以使用缓存管理器了。但是由于默认使用的序列化器使用的是jdk自带的,序列化后数据为乱码,不方便查看。所以我们还配置自己的redisTemplate 和 CacheManager 去替换自动配置的组件
@Configuration public class redisConfig2 { @Bean(name="redisTemplate") public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, String> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); template.setDefaultSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(@SuppressWarnings("rawtypes")RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); cacheManager.setUsePrefix(true); cacheManager.setDefaultExpiration(3000); return cacheManager; } }
5.然后就可以使用注解进行缓存操作了
@Cacheable(cacheNames= {"dept"}) public Department getDeptByID(Integer id) { log.info("查询"+id+"号员工"); Department dept = departmentMapper.selectByPrimaryKey(id); return dept; }
6.如果不想在方法中添加注解而是希望在代码中进行缓存操作,则需要先注入我们的缓存管理器,然后获取缓存的名称,再进行相应操作
(1)注入缓存管理器
@Autowired
CacheManager manage;
(2)获取缓存,进行操作
Cache cache = manage.getCache("emp");
cache.put("01", emp);