redis事务、持久化与主从复制

本文详细介绍了Redis的事务特性,包括multi/exec命令、原子性缺失及如何使用乐观锁确保数据一致性。此外,还探讨了Redis的持久化机制,如RDB和AOF。接着,讲解了Redis的主从复制,包括配置、从节点晋升为主节点的条件以及哨兵模式在故障恢复中的作用。最后,展示了Java中实现Redis乐观锁和哨兵模式的代码示例。
摘要由CSDN通过智能技术生成

redis事务与mysql中的事务不同,最大的区别在于redis事务不保证原子性。redis事务的开启使用multi命令:

然后接下来输入的命令都是在组队,并没有真正的执行:

输入exec命令即可执行:

redis事务在组队的过程中出现错误,则整个事务都失败,如果执行过程中某条语句发生错误,则只有该语句执行失败,其他语句还能执行成功。

在组队的过程中使用discard来放弃事务:

如果使用redis事务直接去实现秒杀案例,则会出现库存为负数的情况,即超过规定数量的用户成功完成了秒杀。如果想要redis事务执行过程中某个key的值具有原子性,需要加上乐观锁。在开启事务之前,先对该key进行watch:

 这样在执行事务的过程中,能够保证k1的value具有原子性。如果一个线程尝试去修改k1的值,另一个线程在事务中也修改,最终后修改的线程会修改失败。

在java代码中实现redis的乐观锁:

jedis.watch(k1);
Transaction multi = jedis.multi();
multi.decrBy(k1, 1);
multi.sadd(k2, uid);
List<Object> results = multi.exec();
// 如果results为空,表明有并发操作,乐观锁的版本号不一致了,此次执行算作失败
if (results == null || results.size() == 0) {
    jedis.close();
    return false;
}

 redis的持久化分为RDB和AOF两种。

RDB是指间隔一定时间自动存储所有数据快照,文件名一般为dump.rdb,redis.conf配置文件中可以使用save命令设置RDB的规则,一般刚开始是注释掉的。比如save 20 3表示每20s之内有3个key发生变化(新增key也算变化)就进行一次RDB,这里的时间间隔就是20s。这种持久化操作使得redis数据库关掉又重启后,依然有之前的数据在内存中,因为redis重启又会读取dump.rdb文件。

AOF则会记录所有写的操作到指定文件中,文件名一般为appendonly.aof,如果同时存在dump.rdb和appendonly.aof文件,redis启动时会读取appendonly.aof的数据到内存中。AOF默认是不开启的,要在redis.conf配置文件中修改appendonly  no改为appendonly yes。AOF文件如果损坏还可以进行修复,修复命令:

redis-check-aof --fix appendonly.aof

关于AOF同步频率设置和重写压缩,可以参考【尚硅谷】Redis 6 入门到精通 超详细 教程 持久化操作-AOF 。

redis主从复制也是概念性的东西。通过修改配置文件中的线程号、端口号、文件名号可以实现多个redis服务的开启。首先新建多个redis配置文件:redis_6379.conf、redis_6380.conf、redis_6381.conf。三个文件都在开头先引入redis.conf的公共部分:

include redis.conf

然后在各自的配置文件中配置不同的线程号、端口号、文件名号(以6379为例):

pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb

这里没使用AOF,如果使用了AOF,则还有配置不同的AOF文件名。

然后开启不同的服务,以6379为例:

redis-server redis_6379.conf

 然后使用客户端连接不同的服务,以6380为例:

redis-fi -p 6380

 如果想要6380和6381成为6379的从机,只需要在6380和6379的客户端里执行一条命令:

slaveof 127.0.0.1 6379

在6379输入info replication可以查看两个从机的信息:

 

在6381输入 info replication可以查看主机的信息:

 主从模式中的一些问题:

1. 从机如果挂掉再连上,不作为从机,需要手动输入slaveof才能作为从机,但是一旦成为从机,就可以立马将主机的数据复制过来。

2. 主机挂掉再连上,从机不会篡位成为主机,主机连上后依然是主机。

3. 从机也可以拥有下一层的从机(薪火相传)。

4. 如果主机挂掉后长时间不能恢复,有必要另选主机(反客为主)。可以手动在一台从机上输入命令slaveof no one 成为主机。

5. 哨兵模式,即添加一个哨兵,使得从机能够自动成为主机,而不需要维护人员手动执行命令。在配置文件的同级目录下新建sentinel.conf,里面只写一句话:

sentinel monitor mymaster 127.0.0.1 6379 1

其中mymaster可以理解为哨兵的名字,后面java程序实现哨兵模式会用到。 执行哨兵:redis-sentinel sentinel.conf:

 注意哨兵的窗口一般为26379,后面java程序实现哨兵模式会用到。然后在6379的客户端关掉6379的服务:

然后十几秒后,在哨兵窗口会出现一些新的信息,表明新的主机已选出,在6381中再次输入info replication看到6381已成为主机:

 再次启动6379,发现他成为了从机:

在6381中有了两个从机:

 

哨兵模式下的java代码获取Jedis对象的方式:

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(200);  // 最大连接数
jedisPoolConfig.setMaxIdle(32);   // 最大空闲连接数
jedisPoolConfig.setMaxWaitMillis(100 * 1000); //最大等待时间
jedisPoolConfig.setBlockWhenExhausted(true); //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
jedisPoolConfig.setTestOnBorrow(true); //在获取连接的时候检查有效性

Set<String> sentinelSet = new HashSet<>();
sentinelSet.add("127.0.0.1:26379");

JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinelSet, jedisPoolConfig);
Jedis jedis = jedisSentinelPool.getResource();

 关于redis集群、缓存穿透、缓存击穿、缓存雪崩等知识点,可以参考【尚硅谷】Redis 6 入门到精通 超详细 教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值