redis中的事务和mysql中事务的区别:redis中的事务默认是没有行锁机制:mysql中一个事务中对某行数据进行操作,在另一个事务中就不能对这行数据进行操作(行锁);而redis多个事务可以对同一个key进行操作,没有行锁机制,很难保证数据的原子性(缺陷)。
上面是Multi的缺陷,通过Watch解决。
watch原理是采用redis的乐观锁机制(版本号)控制。每次set时版本号加1,当提交事务时和set时版本号如果不一致(证明中间有其他事务对这个key修改了),就会提交失败。
watch可以监视一个或多个键,一旦在接下来的一个事务执行之前有一个键值发生了改变,那么事务就不会被执行。注意:是接下来的一个事务,而不是所有事务。
redis中事务不支持回滚,只是支持事务的取消。redis为什么不支持回滚?mysql回滚把行锁给释放掉,redis中没有行锁,就不用回滚了。
6.redis有没有发布订阅?
有。redis发布订阅一般很少用。数据一致性就是通过发布订阅去订阅到数据库的binlog去保持和数据库的数据一致。
7.订单超时30分钟自动取消如何实现?
搞一个token30分钟,当token失效时,会走客户端的回调方法,再检测下订单有没有支付,没有支付就返回超时。
8.redis与数据库如何保持数据一致性?
(1)直接清空redis,重新读取数据库。问题是效率不高。
(2)采用增量binlog的同步方案。在redis和数据库之间有个消息中间件,消息中间件订阅到数据库的binlog文件(订阅的过程),一旦客户端对数据库有增删改操作时,binlog文件就会增加,消息中间件就会订阅过来,消息中间件再把这些增量的binlog发给redis,redis解析binlog文件,然后再去操作。
9.redis中内存满了如何解决?
(1)对内存实现扩容
(2)淘汰策略:把不经常使用的key释放掉。
10.redis宕机后数据是否会丢失?
不会。redis会持久化到硬盘中(最多延迟1秒的数据)。rdb和aof(增量同步,以日志方式写入aof中)。
注意:开启了aof持久化最多丢失1秒的数据。(redis中数据,数据库还有。redis不会当数据库用)
11.redis中支持哪些持久化机制?
rdb和aof。
区别:rdb属于全量同步,把所有数据生成二进制文件,放到硬盘中。好处是效率高,缺陷是有定时性,丢失数据多。aof属于增量同步,表示把每个增删改操作记录到aof日志文件中,aof有三种方式:每秒钟同步一次;每次操作都同步;从不同步(缓冲区满了就os自动同步),默认是每秒钟同步一次。优点是最多只会丢失一秒的数据,缺点是效率低。
12.增量同步与全量同步区别?
增量是对行为同步:每次增删改操作都会同步到日志文件中
全量采用定时同步:每隔多长时间同步一次。
13.redis主从复制网络产生延迟怎么办?
redis 主 同步数据给 从 时产生延迟,问题:会出现脏读或者数据不一致。(redis集群都是内网搭的,也很少存在延迟。服务器跨区域会存在)。redis很难保证强一致性,数据同步时网络存在时间差(集群都有这个问题)。只能人工补偿,或者人工手动把数据迁过来。只能最终一致性的方案实现数据的同步。
14.redis主从同步如果效率很慢怎么解决?