Spring Cache和Mysql主从复制

目录

Spring Cache

 简介

步骤

mysql主从复制

介绍

 准备

首先我的主库选的是centos虚拟机,从库选的ubuntu虚拟机。如下图。

卸载mysql(centos)

安装mysql(centos版)

配置主库(centos)

卸载mysql(ubuntu)

安装mysql:

配置从库

mysql主从复制用途

Sharding-JDBC(是一个可以轻松实现数据库读写分离的框架)

 入门案例步骤


Spring Cache

 简介

步骤

下面是我们需要进行的步骤

首先我们用的是redis。

1.导入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>

2.配置核心文件application.yml

 spring:
     cache:
        type: redis
        redis:
          time-to-live: 1800000 #设置缓存数据过期时间

3.在启动类上加@EnableCaching注解。然后我们进行对应缓存配置即可。

4.接下来我们举几个代码例子来说明每个注解的运用。

    /**
     * CachePut:将方法返回值放入缓存
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     */
    @CachePut(value = "userCache",key = "#user.id")
    @PostMapping
    public User save(User user){
        userService.save(user);
        return user;
    }

    /**
     * CacheEvict:清理指定缓存
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     */
    @CacheEvict(value = "userCache",key = "#p0")
    //@CacheEvict(value = "userCache",key = "#root.args[0]")
    //@CacheEvict(value = "userCache",key = "#id")
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
        userService.removeById(id);
    }

    //@CacheEvict(value = "userCache",key = "#p0.id")
    //@CacheEvict(value = "userCache",key = "#user.id")
    //@CacheEvict(value = "userCache",key = "#root.args[0].id")
    @CacheEvict(value = "userCache",key = "#result.id")
    @PutMapping
    public User update(User user){
        userService.updateById(user);
        return user;
    }

    /**
     * Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     * condition:条件,满足条件时才缓存数据
     * unless:满足条件则不缓存
     */
    @Cacheable(value = "userCache",key = "#id",unless = "#result == null")
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id){
        User user = userService.getById(id);
        return user;
    }

    @Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")
    @GetMapping("/list")
    public List<User> list(User user){
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(user.getId() != null,User::getId,user.getId());
        queryWrapper.eq(user.getName() != null,User::getName,user.getName());
        List<User> list = userService.list(queryWrapper);
        return list;
    }

注意:这里的参数key支持Spring的表达式语言SPEL语法。

result代表返回值,p0表示第一个参数,也可直接用参数名。

mysql主从复制

介绍

 准备

准备两台服务器,分别安装mysql并启动服务成功。

首先我的主库选的是centos虚拟机,从库选的ubuntu虚拟机。如下图。

卸载mysql(centos)

 安装的前提我们已经卸载完成之前安装的mysql。

这里我就卸载了一次。

CentOS7安装MySQL8.0 - 码农教程

可以参考上面的内容,写的挺好的,实在不行就只能重新安装一次虚拟机。

安装mysql(centos版)

下载
wget http://repo.mysql.com/mysql80-community-release-el7-5.noarch.rpm
安装
rpm -ivh mysql80-community-release-el7-5.noarch.rpm
yum update
yum install mysql-community-server

基本上我们就安装好了,接下来我们开始数据库的基本配置了。

启动mysql
systemctl start mysqld.service
mysql在安装后会创建一个root@locahost账户,并把初始密码放到了/var/log/mysqld.log;

sudo cat /var/log/mysqld.log | grep password

mysql -u root -p
然后输入我们上面获得的密码。

修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password!';
然后我们这里应该会遇到不符合密码要求的情况。
这时候我们需要设置密码权限。

查看密码要求
SHOW VARIABLES LIKE 'validate_password%';

更改密码最小长度要求为4
set global validate_password_length=4;
设置密码等级为最低
set global validate_password_policy=0;


 我们还可能会用到的命令

进入mysql后

显示数据库列表
show databases;
使用mysql数据库
use mysql;
查询mysql的user表中的数据
select * from user;

配置主库(centos)

然后我们就可以配置主库了

1.首先修改下数据库配置文件my.cnf,centos的这个文件是在/etc/my.cnf

我们需要在[mysqld]下加上以下两行配置。

log-bin=mysql-bin #启动二进制
server-id=100 #唯一id

重启mysql服务

systemctl restart mysqld

登录到mysql,我们添加一个用户,并设置权限,这个到从库配置会用到。

    用户创建:create user 'username'@'%' identified by 'password:';

  授权:grant all privileges on *.* to 'username'@'%' with grant option;

  查看用户权限:select host, user, authentication_string, plugin from user;

  删除用户:DROP USER 'username'@'host';

这里给的是最高权限。

最后,用show master status;我们可以查询到两个关键的值(file和position),我们后面需要用到。

本地navicat连接mysql

用上面创建的用户密码连接即可,user默认权限为本地localhost,我们需要更改成%才可使用。

如果想要用本地navicat连接mysql的,可以试试下面的

首先,查看虚拟机设置中的网络,我们可以看到本机的ip地址。

然后我们需要把虚拟机防火墙关闭。(我这里试过将iptables防火墙加入3306端口,但还是不管用)

systemctl stop firewalld.service(默认安装的是firewall防火墙)

出现进程冲突

sudo kill -s 9 进程id

卸载mysql(ubuntu)

如果我们在登陆时遇到这个错误。

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

我们基本就可以卸载了。

mysql启动停止命令

sudo service mysql stop

sudo service mysql start

卸载

sudo apt-get remove mysql-server

sudo apt-get autoremove mysql-server

sudo apt-get remove mysql-common

sudo rm /var/lib/mysql/ -R

sudo rm /etc/mysql/ -R

sudo apt-get autoremove mysql* --purge

sudo apt-get remove apparmor

安装mysql:

sudo apt-get install mysql-server mysql-common

我们这时候该登录了,我们会发现我们不知道密码,或者你遇到密码忘记的情况,我们这里介绍一下如何修改密码。

1、关闭服务
sudo service mysql stop

2、修改mysql配置文件my.cnf
我们会发现他跟centos位置名字都不一样,但是他也在/etc下,具体位置应该是/etc/mysql/mysql.conf.d/mysqld.cnf
sudo /etc/mysql/mysql.conf.d/mysqld.cnf
增加两行
[mysqld]#这个不用写,在他下面写。
skip-grant-tables
skip-networking

3、然后启动mysql,就可以直接登录进去。修改密码
use mysql; 
flush privileges;
update user set authentication_string='password' where user='root'; 
alter user 'root'@'localhost' identified with mysql_native_password by 'password'; 
flush privileges;
停止mysql
sudo service mysql stop
并且删除我们之前在mysqld.cnf增加的内容(或注释)

4.然后重新启动,密码就修改成功了
sudo service mysql start
登录
mysql -uroot -p
输入密码即可

配置从库

1.修改mysql配置文件

sudo /etc/mysql/mysql.conf.d/mysqld.cnf

在【mysqld】下加入

server-id=101#注意这要跟上面的主库配置不一样,都是唯一的。

然后重启mysql

sudo service mysql start

开放mysql
sudo ufw allow mysql
防火墙关闭
sudo ufw disable
防火墙打开
sudo ufw enable
查看状态
sudo ufw status

然后登录mysql输入以下命令

里面的参数上面都提到过。
change master to master_host='主库ip地址',master_user='user',master_password='password',master_log_file='...',master_log_pos=157;


stop slave;
start slave;

show master status;

show slave status;

这时我们需要检查一下navicat是否可以访问

不出意外地话我们这里还会出现问题。无法连接。

我们这时候需要进入mysql配置文件再找到“address=127.0.0.1”这行代码,把它改成“address=0.0.0.0”即可。

然后我们一定要重启计算机。然后就可以访问了。然后我们就可以测试了。

 测试结果发现,我们修改主库的表等数据,我们从库会自动更新。

mysql主从复制用途

 行锁就是同时操作一条多条数据, 这边开事务增删改时候会上锁, 那边就不能增删改查了。

Sharding-JDBC(是一个可以轻松实现数据库读写分离的框架)

 入门案例步骤

 1.导入maven

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

2.配置yml

  spring:
   shardingsphere: #主从配置,修改ip即可
    datasource:
      names:
        master,slave
#        master,slave,slave1
      # 主数据源
      master:  #主库
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.246.130:3306/reggie?characterEncoding=utf-8
        username: ys
        password: ys001024
      # 从数据源
      slave: #从库
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.246.128:3306/reggie?characterEncoding=utf-8
        username: ys
        password: ys001024
#      slave1: #从库
#        type: com.alibaba.druid.pool.DruidDataSource
#        driver-class-name: com.mysql.cj.jdbc.Driver
#        url: jdbc:mysql://192.168.138.102:3306/reggie?characterEncoding=utf-8
#        username: root
#        password: root
    masterslave:
      # 读写分离配置
      load-balance-algorithm-type: round_robin #轮询
      # 最终的数据源名称
      name: dataSource
      # 主库数据源名称
      master-data-source-name: master
      # 从库数据源名称列表,多个逗号分隔
      slave-data-source-names: slave
#      slave-data-source-names: slave,slave1
    props:
      sql:
        show: true #开启SQL显示,默认false
  main: #允许bean定义覆盖(这里是因为有两个DataSource(导入的这个sharing包的)创建,会发生冲突。
    allow-bean-definition-overriding: true

然后我们就可以用了,前提我们需要配置好两个mysql服务器。

 注意:千万不要导错依赖。

猜你喜欢

转载自blog.csdn.net/weixin_53011574/article/details/126695125