目录
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。
这里我就卸载了一次。
可以参考上面的内容,写的挺好的,实在不行就只能重新安装一次虚拟机。
安装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服务器。
注意:千万不要导错依赖。