Redis 事务
- 一次性
- 顺序性
- 排他性
Redis单条命令式保证了原子性,但事务不保证原子性,所有的命令在事务中,并没有直接被执行,而是进入队列,只有发起执行命令后才会执行
- 开启事务(multi)
- 命令入队
- 执行事务(exec)
- 放弃事务(discard)【也可以不执行事务而放弃事务,命令队列不会被执行】
如果命令入队时发生了编译时异常,则会放弃事务
如果命令入队时发生了运行时异常,则其他命令也会成功执行,所以整个队列(事务)是不保证原子性的
public void demo2(){
Jedis jedis = new Jedis("47.119.128.150",6379);
Transaction transaction = jedis.multi();
try {
transaction.set("key1", "nihao");
transaction.set("key2", "buhao");
// int i = 1/0 可以模拟异常
transaction.exec();
System.out.println(jedis.get("key1"));
} catch (Exception e) {
transaction.discard();
e.printStackTrace();
} finally {
jedis.close();
}
}
Redis乐观锁
- 悲观锁:什么时候都会出问题,无论做什么都会加锁
- 乐观锁:认为什么时候都不会出现问题,所以不会上锁
先监视对象,执行事务更新时去比较和监视时有没有改变,没有则执行事务,如果和监视时有改变,则放弃事务
集群主从复制
配置虚拟1主2从
复制3个redis.conf配置文件修改以下信息,然后启动3个redis进程(只列举一个)
port 6387
logfile "6387.log"
dbfilename dump6387.rdb
pidfile /var/run/redis6387.pid
# 启动
redis-server /etc/redis6387.conf
# 查看是否成功有对应的端口
ps -ef|grep redis
默认情况每一个redis都是主机,我们只需要去配置从机即可
# 先连接客户端
redis-cli -p 6387
# 认主机
SLAVEOF 127.0.0.1 6379
# 查看当前从机信息
info replication
# 当前从机信息
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:28
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:944fdb7e55894e5a60a00607b17e8283345dacad
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
# 6379主机的信息
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6387,state=online,offset=56,lag=3
master_replid:944fdb7e55894e5a60a00607b17e8283345dacad
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
命令的从机配置是暂时性的,如果要永久性就需要去配置文件中配置
# 找到如下配置文件中的词,配置主机ip和端口
replicaof <masterip> <masterport>
# 如果主机有密码
masterauth <master-password>
主机和从机是读写分离
主机的写数据,从机是完全可以读到的,如果主机宕机了,从机依旧连接主机,但没有写操作,主机修复后,会一次完全同步(全量复制)将被自动执行。我们希望主机宕机后,从机变成主机
改进成链路模式
如果中间的宕机了,带来了很大问题,所以才有了后面的哨兵模式
哨兵模式
单哨兵模式
# 新建一个哨兵配置文件
vim sentinel.conf
# 单哨兵配置 sentinel monitor 主机名称 ip port 1代表主机挂了进行投票
sentinel monitor m_redis 127.0.0.1 6379 1
# 启动哨兵
redis-sentinel /etc/sentinel.conf
# 监控信息
5114:X 24 Jul 2021 16:39:06.517 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5114:X 24 Jul 2021 16:39:06.518 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=5114, just started
5114:X 24 Jul 2021 16:39:06.518 # Configuration loaded
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.0.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 5114
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
5114:X 24 Jul 2021 16:39:06.519 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
5114:X 24 Jul 2021 16:39:06.521 # Sentinel ID is e04f29e618661f1237043f79223a6ef8505487b3
5114:X 24 Jul 2021 16:39:06.521 # +monitor master m_redis 127.0.0.1 6379 quorum 1
5114:X 24 Jul 2021 16:39:06.522 * +slave slave 127.0.0.1:6387 127.0.0.1 6387 @ m_redis 127.0.0.1 6379
5114:X 24 Jul 2021 16:39:06.524 * +slave slave 127.0.0.1:6386 127.0.0.1 6386 @ m_redis 127.0.0.1 6379
5114:X 24 Jul 2021 16:39:06.525 * +slave slave 127.0.0.1:6385 127.0.0.1 6385 @ m_redis 127.0.0.1 6379
集群哨兵模式
- 优点:故障可以转移,高可用性
- 缺点:redis不好在线扩容