Redis进阶

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不好在线扩容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值