Springboot集成Redis做数据库缓存(原生版)
redis做缓存简单来说就是:系统把表中经常访问的记录放在了Redis中,然后用户查询时先去查询Redis再去查询MySQL,由于缓存在内存中,所以查询会很快,起到提高性能的作用。
先来看效果吧~
测试案例是把一个查询重复99999次,根据时间来判断性能的好坏。
使用redis时:
不使用redis时:
可以看出使用redis大概快了两秒钟,确实实现了优化。但是redis可以实现的优化效果作者并不是很了解,这里感觉效果不算特别明显,可能和代码有关系。
本文所用的方法是原生的redis操作,没有用到springboot自带的缓存机制(不会,下次再更)。本文代码基于之前的文章进行添加,需要源码的同学可以去原文下载。
maven配置
添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
application配置
redis默认是没有密码的,所以如果你没有设置密码就不需要写密码啦
spring:redis:host: localhost
port:6379
Java代码
首先在项目文件夹下新建config文件夹(放配置类)和util文件夹(放工具类)
在config文件夹下新建RedisConfig类
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
@Resource
private RedisTemplate redisTemplate;
@Bean
public RedisTemplate redisTemplateInit(){
//序列化key的实例化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());
//序列化value的实例化对象
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
RedisTemplate是Spring Data Redis提供给用户的最高级的抽象客户端,用户可直接通过RedisTemplate进行多种操作,例如set、get
(非必须)可以在config文件夹下新建一个RedisConstant类来存储redis的key
public class RedisConstant{
public static String USER_KEY="User";
}
到时候使用时直接调用参数即可
在util文件夹下新建RedisUtil类,里面的内容是封装好的redis操作,网上有很多大佬写的工具类,通用性比较高,找到合适的可以直接拿来用
我找到的工具类有很多功能,代码比较长,放在文章的最后
在serverimpl中添加redis的相关代码
主要逻辑是查询前先在redis中寻找有没有要查找的内容,如果没有再去数据库中查找,数据库返回的值顺便存入redis,这样下次再访问时就可以从redis中读到数据了。
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Autowired
RedisUtil redisUtil;
@Override
publicList<User> queryAll(){//试图从redis获取
List<User> users =(List<User>) redisUtil.get(RedisConstant.USER_KEY);//获取失败则去数据库查找
if(CollectionUtils.isEmpty(users)){
users=userMapper.queryAll();//返回的数据存入redis
redisUtil.set(RedisConstant.USER_KEY,users);
}
return users;
}
@Override
public void changePassword(String username,String password){//为了防止数据不一致,在数据库数据改变时先清楚之前redis的相关缓存
redisUtil.del(RedisConstant.USER_KEY);
userMapper.changePassword(username,password);
System.out.println("修改成功");
}
}
代码部分就到此结束了~
运行代码
首先你的电脑要先启动redis服务器端才可以。
redis官方是没有Windows版的,不过已经有大佬开发出了Windows版,安装起来比较简单,没什么需要注意的。大家跟着菜鸟教程先在自己电脑上安装redis吧!
安装好了,有的同学就要问了,redis现在只能在它自己的目录下运行,这可怎么办捏?
很简单,我们把redis的路径添加到环境变量中,就可以在任意位置启动redis了
耗,现在我们打开cmd,输入redis-server,就可以启动redis服务端了(默认的端口6379)
不要关闭服务端界面,再打开一个cmd,输入redis-cli,就可以启动客户端了(默认的端口6379)
现在,来运行我们写好的程序吧
进入localhost:8084,点击获取,我们会从数据库查到数据,同时把数据存入redis,这时我们在redis客户端就可以查到数据了~
如果你想不起来你的键叫什么,又不想去看代码,那么查询现在redis中存有的键:keys *
现在你可以自己写一个测试用例来看看效果如何了。
虽然在大项目中redis肯定不是这么用的,但是对于作者来说,起码算是用起来了,后面再学习正确的简洁的使用方式,学会了来给大噶更新!