前言
大家都知道访问我们的关系型数据库比如说MySQL这些会给我们服务器造成压力,影响我们项目性能,为了提高性能 我们都会将不经常改变的数据存入缓存中 从而提高项目的性能,正好我们的nosql(no only sql)非关系型数据库redis它就可以实现缓存的效果 下面就让我带大家将redis整合到我们的springboot项目中来吧~
首先第一步还是需要访问我们的数据库 所以要整合MySQL和mybatis 如何整合请参考我上一篇博客
和其他整合方式一样 在pom文件中导入我们的redis依赖
<!--NoSql(not only sql 不仅仅只有sql类型的数据库)非关系类型数据库redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后配置我们的application.yml文件 指定我们连接的redis的ip和端口
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost/db_news?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123
#配置非关系型数据库redis
redis:
host: 192.168.59.128
port: 6379
#mybatis配置
mybatis:
mapper-locations: classpath:mappers/*Mapper.xml
type-aliases-package: com.shenwang.pojo
#通用mapper类配置:
mapper:
mappers: com.shenwang.baseDao.IBaseDao
identity: MYSQL
在这里一定要注意了! 端口和IP千万不要敲错了,而且要关闭你的防火墙,或者开放端口
Linux您可能会需要的命令
永久配置,以确认规则已成功添加。
firewall-cmd --list-all --permanent
从永久配置中重新加载运行的配置:
firewall-cmd --reload
查询端口是否开放
firewall-cmd --query-port=8080/tcp
开放80端口
firewall-cmd --permanent --add-port=80/tcp
移除端口
firewall-cmd --permanent --remove-port=8080/tcp
重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
查看所有打开的端口: firewall-cmd --zone=public --list-ports
更新防火墙规则: firewall-cmd --reload
停止ZK服务: sh bin/zkServer.sh stop
启动mysql服务 :systemctl start mysqld
后来启动我们的redis(因为我的redis装在Linux系统中 所以启动方式可能和redis在本地的小伙伴不同)
./redis-server redis.conf
./redis-cli
然后我们要在我们的启动类(Application.java)上配置redis的序列化方式
/**
* @author: shenwang
* Date: 2021/6/9
*/
@SpringBootApplication
@MapperScan("com.shenwang.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
/**
* 自定义序列化机制
* 将 key设置为字符串序列化机制
* 将value 的序列化机制为jdk自带的的方式
* @param redisConnectionFactory
* @return
* @throws UnknownHostException
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//设置key的值为字符串序列化方式 那么在使用过程中key 一定只能是字符串
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化机制为JDK自带的方式
template.setValueSerializer(new JdkSerializationRedisSerializer());
return template;
}
}
最后我们就可以使用咱们的redis啦!
我们的具体实现在serviceImpl用一个案例了解redis如何使用
如果我们在redis中没有找到键为newsList的列表 我们则去数据库中查询,有责直接从redis中获取数据
service实现
package com.shenwang.service.impl;
import com.shenwang.mapper.NewsMapper;
import com.shenwang.pojo.News;
import com.shenwang.service.NewsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: shenwang
* Date: 2021/6/9
*/
@Service("newsService")
public class NewsServiceImpl implements NewsService {
@Resource
private NewsMapper newsMapper;
@Autowired
private RedisTemplate redisTemplate;
/**
* 获取所有新闻
* @return
*/
@Override
public List<News> selectAll() {
//从redis缓存中获取键为newsList的集合 如果有数据则直接从redis中获取 否则访问数据库
List<News> newsList = (List<News>) redisTemplate.boundValueOps("newsList").get();
if(newsList==null||newsList.size()<=0)
{
System.out.println("访问了数据库");
newsList = newsMapper.selectAll();
redisTemplate.boundValueOps("newsList").set(newsList);
}
return newsList;
}
}
这里我没有使用 mybatis的逆向工程也没有 使用mybatisPlus 我用的是国内大神开发的一个mybais插件 通用mapper 超级好用特别简洁 如果有想了解的朋友可以去看我上一篇文章哦~