• Spring Cache和Mysql主从复制


    目录

    Spring Cache

     简介

    步骤

    mysql主从复制

    介绍

     准备

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

    卸载mysql(centos)

    安装mysql(centos版)

    配置主库(centos)

    卸载mysql(ubuntu)

    安装mysql:

    配置从库

    mysql主从复制用途

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

     入门案例步骤


    Spring Cache

     简介

    步骤

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

    首先我们用的是redis。

    1.导入maven坐标

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-redisartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-cacheartifactId>
    8. dependency>

    2.配置核心文件application.yml

    1. spring:
    2. cache:
    3. type: redis
    4. redis:
    5. time-to-live: 1800000 #设置缓存数据过期时间

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

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

    1. /**
    2. * CachePut:将方法返回值放入缓存
    3. * value:缓存的名称,每个缓存名称下面可以有多个key
    4. * key:缓存的key
    5. */
    6. @CachePut(value = "userCache",key = "#user.id")
    7. @PostMapping
    8. public User save(User user){
    9. userService.save(user);
    10. return user;
    11. }
    12. /**
    13. * CacheEvict:清理指定缓存
    14. * value:缓存的名称,每个缓存名称下面可以有多个key
    15. * key:缓存的key
    16. */
    17. @CacheEvict(value = "userCache",key = "#p0")
    18. //@CacheEvict(value = "userCache",key = "#root.args[0]")
    19. //@CacheEvict(value = "userCache",key = "#id")
    20. @DeleteMapping("/{id}")
    21. public void delete(@PathVariable Long id){
    22. userService.removeById(id);
    23. }
    24. //@CacheEvict(value = "userCache",key = "#p0.id")
    25. //@CacheEvict(value = "userCache",key = "#user.id")
    26. //@CacheEvict(value = "userCache",key = "#root.args[0].id")
    27. @CacheEvict(value = "userCache",key = "#result.id")
    28. @PutMapping
    29. public User update(User user){
    30. userService.updateById(user);
    31. return user;
    32. }
    33. /**
    34. * Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
    35. * value:缓存的名称,每个缓存名称下面可以有多个key
    36. * key:缓存的key
    37. * condition:条件,满足条件时才缓存数据
    38. * unless:满足条件则不缓存
    39. */
    40. @Cacheable(value = "userCache",key = "#id",unless = "#result == null")
    41. @GetMapping("/{id}")
    42. public User getById(@PathVariable Long id){
    43. User user = userService.getById(id);
    44. return user;
    45. }
    46. @Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")
    47. @GetMapping("/list")
    48. public List list(User user){
    49. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    50. queryWrapper.eq(user.getId() != null,User::getId,user.getId());
    51. queryWrapper.eq(user.getName() != null,User::getName,user.getName());
    52. List list = userService.list(queryWrapper);
    53. return list;
    54. }

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

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

    mysql主从复制

    介绍

     准备

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

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

    卸载mysql(centos)

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

    这里我就卸载了一次。

    CentOS7安装MySQL8.0 - 码农教程

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

    安装mysql(centos版)

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

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

    1. 启动mysql
    2. systemctl start mysqld.service
    3. mysql在安装后会创建一个root@locahost账户,并把初始密码放到了/var/log/mysqld.log;
    4. sudo cat /var/log/mysqld.log | grep password
    5. mysql -u root -p
    6. 然后输入我们上面获得的密码。
    7. 修改密码
    8. ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password!';
    9. 然后我们这里应该会遇到不符合密码要求的情况。
    10. 这时候我们需要设置密码权限。
    11. 查看密码要求
    12. SHOW VARIABLES LIKE 'validate_password%';
    13. 更改密码最小长度要求为4
    14. set global validate_password_length=4;
    15. 设置密码等级为最低
    16. set global validate_password_policy=0;

     我们还可能会用到的命令

    1. 进入mysql后
    2. 显示数据库列表
    3. show databases;
    4. 使用mysql数据库
    5. use mysql;
    6. 查询mysql的user表中的数据
    7. select * from user;

    配置主库(centos)

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

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

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

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

    重启mysql服务

    systemctl restart mysqld

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

    1.     用户创建:create user 'username'@'%' identified by 'password:';
    2.   授权:grant all privileges on *.* to 'username'@'%' with grant option;
    3.   查看用户权限:select host, user, authentication_string, plugin from user;
    4.   删除用户:DROP USER 'username'@'host';

    这里给的是最高权限。

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

    本地navicat连接mysql

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

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

    1. 首先,查看虚拟机设置中的网络,我们可以看到本机的ip地址。
    2. 然后我们需要把虚拟机防火墙关闭。(我这里试过将iptables防火墙加入3306端口,但还是不管用)
    3. systemctl stop firewalld.service(默认安装的是firewall防火墙)
    4. 出现进程冲突
    5. sudo kill -s 9 进程id

    卸载mysql(ubuntu)

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

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

    我们基本就可以卸载了。

    1. mysql启动停止命令
    2. sudo service mysql stop
    3. sudo service mysql start
    4. 卸载
    5. sudo apt-get remove mysql-server
    6. sudo apt-get autoremove mysql-server
    7. sudo apt-get remove mysql-common
    8. sudo rm /var/lib/mysql/ -R
    9. sudo rm /etc/mysql/ -R
    10. sudo apt-get autoremove mysql* --purge
    11. sudo apt-get remove apparmor

    安装mysql:

    sudo apt-get install mysql-server mysql-common

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

    1. 1、关闭服务
    2. sudo service mysql stop
    3. 2、修改mysql配置文件my.cnf
    4. 我们会发现他跟centos位置名字都不一样,但是他也在/etc下,具体位置应该是/etc/mysql/mysql.conf.d/mysqld.cnf
    5. sudo /etc/mysql/mysql.conf.d/mysqld.cnf
    6. 增加两行
    7. [mysqld]#这个不用写,在他下面写。
    8. skip-grant-tables
    9. skip-networking
    10. 3、然后启动mysql,就可以直接登录进去。修改密码
    11. use mysql;
    12. flush privileges;
    13. update user set authentication_string='password' where user='root';
    14. alter user 'root'@'localhost' identified with mysql_native_password by 'password';
    15. flush privileges;
    16. 停止mysql
    17. sudo service mysql stop
    18. 并且删除我们之前在mysqld.cnf增加的内容(或注释)
    19. 4.然后重新启动,密码就修改成功了
    20. sudo service mysql start
    21. 登录
    22. mysql -uroot -p
    23. 输入密码即可

    配置从库

    1.修改mysql配置文件

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

    在【mysqld】下加入

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

    然后重启mysql

    1. sudo service mysql start
    2. 开放mysql
    3. sudo ufw allow mysql
    4. 防火墙关闭
    5. sudo ufw disable
    6. 防火墙打开
    7. sudo ufw enable
    8. 查看状态
    9. sudo ufw status

    然后登录mysql输入以下命令

    1. 里面的参数上面都提到过。
    2. change master to master_host='主库ip地址',master_user='user',master_password='password',master_log_file='...',master_log_pos=157;
    3. stop slave;
    4. start slave;
    5. show master status;
    6. show slave status;

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

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

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

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

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

    mysql主从复制用途

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

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

     入门案例步骤

     1.导入maven

    1. <dependency>
    2. <groupId>org.apache.shardingsphere</groupId>
    3. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    4. <version>4.0.0-RC1</version>
    5. </dependency>

    2.配置yml

    1. spring:
    2. shardingsphere: #主从配置,修改ip即可
    3. datasource:
    4. names:
    5. master,slave
    6. # master,slave,slave1
    7. # 主数据源
    8. master: #主库
    9. type: com.alibaba.druid.pool.DruidDataSource
    10. driver-class-name: com.mysql.cj.jdbc.Driver
    11. url: jdbc:mysql://192.168.246.130:3306/reggie?characterEncoding=utf-8
    12. username: ys
    13. password: ys001024
    14. # 从数据源
    15. slave: #从库
    16. type: com.alibaba.druid.pool.DruidDataSource
    17. driver-class-name: com.mysql.cj.jdbc.Driver
    18. url: jdbc:mysql://192.168.246.128:3306/reggie?characterEncoding=utf-8
    19. username: ys
    20. password: ys001024
    21. # slave1: #从库
    22. # type: com.alibaba.druid.pool.DruidDataSource
    23. # driver-class-name: com.mysql.cj.jdbc.Driver
    24. # url: jdbc:mysql://192.168.138.102:3306/reggie?characterEncoding=utf-8
    25. # username: root
    26. # password: root
    27. masterslave:
    28. # 读写分离配置
    29. load-balance-algorithm-type: round_robin #轮询
    30. # 最终的数据源名称
    31. name: dataSource
    32. # 主库数据源名称
    33. master-data-source-name: master
    34. # 从库数据源名称列表,多个逗号分隔
    35. slave-data-source-names: slave
    36. # slave-data-source-names: slave,slave1
    37. props:
    38. sql:
    39. show: true #开启SQL显示,默认false
    40. main: #允许bean定义覆盖(这里是因为有两个DataSource(导入的这个sharing包的)创建,会发生冲突。
    41. allow-bean-definition-overriding: true

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

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

  • 相关阅读:
    java--07 面向对象
    SpringBoot:Thymeleaf模板引擎
    js逆向之浏览器环境补充
    springboot使用jedis
    GO -mod和​GO111MODULE设置的那些事原创
    SpringBoot整合RabbitMQ
    Redis群集
    力扣崩溃题:链表相加
    戴尔外星人原厂系统美版改国行正确识别本机SN,支持F12 Support Assist OS Recevory恢复重置识别SN服务编码
    决策树(二):后剪枝,连续值处理,数据加载器:DataLoader和模型评估
  • 原文地址:https://blog.csdn.net/weixin_53011574/article/details/126695125