后台管理系统的菜单不经常变化,但需要频繁读取和渲染,所以可以将菜单放在Redis里面去加快读取速度。
1.在pom中添加redis依赖
<!--spring data redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--common-pool2 对象池依赖--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
2.在yml中进行简单的配置
redis: # 超时时间 timeout: 10000ms # 服务器地址 host: 127.0.0.1 # 服务器端口 port: 6379 database: 0 lettuce: pool: # 连接池最大连接数 默认8 ,负数表示没有限制 max-active: 1024 # 最大连接阻塞等待时间,默认-1 max-wait: 10000ms # 最大空闲连接 max-idle: 200 # 最小空闲连接 min-idle: 5
3.设置序列化,在配置类中新建RedisConfig配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object>redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
//String和HASH类型key和value序列器
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
4.在服务实现类中设置redis,从redis获取菜单数据 如果为空从数据库获取
nteger adminID = ((Admin) SecurityContextHolder.getContext(). getAuthentication().getPrincipal()).getId(); ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue(); //从redis获取菜单数据 如果为空从数据库获取 List<Menu> menus = (List<Menu>) valueOperations.get("menu_"+adminID); if (CollectionUtils.isEmpty(menus)){ menus = menuMapper.getMenusByAdminId(adminID); //将数据设置到redis中 valueOperations.set("menu_"+adminID,menus); } return menus;
如果修改菜单时,更新增删,需要把redis清空,查询后再放入redis。