SpringBoot实现redis缓存菜单列表
作者:密探零零扒_探长 发布时间:2023-11-24 07:39:20
标签:SpringBoot,redis,缓存
因为系统的菜单列表是不轻易改变的,所以不需要在每次请求的时候都去查询数据库,所以,在第一次根据用户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;
}
}
到这里,重启项目即可测试接入缓存是否成功了!!!
来源:https://juejin.cn/post/7053929080449662989


猜你喜欢
- 本文实例讲述了C#数字图像处理之图像二值化(彩色变黑白)的方法。分享给大家供大家参考。具体如下://定义图像二值化函数private sta
- 引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在
- 面试题一:判断下列程序运行结果package String_test;public class test_1 { public static
- 那么什么是性能测试,它与功能测试有什么样的区别?性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测
- 由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本
- 在Android中子线程是不能更新ui的。所以我们要通过其他方式来动态改变ui视图,1、runOnUiThreadactivity提供的一个
- 我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { &n
- 什么是自动装箱和拆箱自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之
- mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/。在研究Myba
- 基本思路服务器配置如下:192.168.159.50 gitlab服务器(Gitlab,内存至少5个G,要不根本跑不动)192.168.15
- SpringEL表达式取值一般是${var}方式取值, 见于application.properties和@Value("${va
- 一、实验:继承1、概念Maven工程之间,A 工程继承 B 工程B 工程:父工程A 工程:子工程本质上是 A 工程的 pom.xml 中的配
- 一:什么是逆行工程。MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDB
- C#单击菜单栏或工具栏时通过反射打开窗体的方法,可以以取代长长的if-else或switch-case语句。要点:将菜单或工具栏项的名称设置
- 一、序言在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单、多级目录、多级分类等,有没有一种通用且跨项目的解决方式
- RequestBody注解的List参数传递Controller方法参数:@RequestBody List<Long> ids
- 本文以一个C#的SQL数据库字串操作函数为例,说明如何实现对SQL字符串过滤、检测SQL是否有危险字符、修正sql语句中的转义字符,确保SQ
- 最初的源文件样式如下:用默认的配置进行格式化之后如下:使用如下配置后,格式化之后的代码如下:最终修改成下面这样比较合适:来源:https:/
- Android USB转串口通信开发实例详解好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平
- 本文实例讲述了Android实时文件夹创建方法。分享给大家供大家参考。具体如下:实时文件夹是一种用来显示由某个ContentProvider