前言

大家都知道访问我们的关系型数据库比如说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 超级好用特别简洁 如果有想了解的朋友可以去看我上一篇文章哦~