因為系統的選單清單是不輕易改變的,所以不需要在每次請求的時候都去查詢資料庫,所以,在第一次根據使用者id請求到選單清單的時候,可以把選單清單的數據快取在redis裡,在第二次請求選單列表的時候,可以直接在redis快取裡面獲取數據,從而減少對資料庫的操作,提升效能!首先,我們要下載redis到本地,然後在cmd終端打開redis的src目錄,然後運行redis-server即可開啟redis本地服務(mac),開啟了redis服務後,就要在專案中配置相關的redis的程式碼了,首先在pom.xml中導入我們需要的包:
<!-- spring data redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.5.1</version> </dependency> <!-- commons-pool2对象池依赖--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.9.0</version> </dependency>
然後在config檔下建立ReidsConfig組態類別檔:
/** * redis配置类 */ @Configuration public class RedisConfig { @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>(); //String类型key序列器 redisTemplate.setKeySerializer(new StringRedisSerializer()); //String类型value序列器 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //Hash类型key序列器 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //Hash类型value序列器 redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } }
這個設定檔主要是對String型別和hash類型的key和value做序列化操作;
接下來就是使用redis了,在我們需要引入redis的根據用戶id獲取菜單列表接口的實現類中,判斷下,如果菜單已經緩存在了redis中,則從redis中取得資料傳回,否則去查詢資料庫取得資料:
/** * <p> * 菜单表 服务实现类 * </p> * * @author hhk * @since 2022-01-04 */ @Service public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService { @Autowired private MenuMapper menuMapper; @Autowired private RedisTemplate<String,Object> redisTemplate; /** * 根据用户id查询菜单列表 * @return */ @Override public List<Menu> getMenuByAdminId() { //getMenuByAdminId需要传用户id,这时候,要从security全局上下文中获取用户id,SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取当前用户对象 Admin principal = (Admin) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); //获取到用户id Integer id = principal.getId(); ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue(); List<Menu> menus=((List<Menu>) valueOperations.get("menu_" + id));//获取redis缓存中的菜单列表 if(CollectionUtils.isEmpty(menus)){//如果是空,则从数据库中获取 menus= menuMapper.getMenuByAdminId(id); //将数据设置到redis中 valueOperations.set("menu_"+id,menus); } return menus; } }
以上是SpringBoot如何實作redis快取選單列表的詳細內容。更多資訊請關注PHP中文網其他相關文章!