我的面经
1. 为什么lua脚本具有原子性?
资料:https://www.zhihu.com/question/346626417
redis会为lua脚本执行创建无网络连接的伪客户端模拟客户端调用redis执行命令,伪客户端执行lua脚本是排他的
https://blog.csdn.net/qq_22076345/article/details/103289867
脚本原子性
Redis使用相同的Lua解释器来运行所有的命令。Redis还保证脚本以原子方式执行:在执行脚本时,不会执行其他脚本或Redis命令。这个语义类似于MULTI/EXEC。从所有其他客户端的角度来看,脚本的效果要么仍然不可见,要么已经完成。
需要注意的是redis.call()函数出错时会中断脚本的执行,此时会出现一部分命令执行了,一部分没有执行。所以为了保证脚本的原子性,要谨慎使用redis.call()函数,如使用一定要确保这个函数的正确性。
2. redis是不是原子性的?
1. 事务不是原子性的
资料:https://blog.csdn.net/u011692780/article/details/81213010
若命令在入队时出错,所有命令都不会执行。
若命令入队不出错,但执行出错,会跳过这条命令执行后面的。 跳过但不回滚的原因:redis认为这是代码逻辑错误,就算回滚也无法解决此错误,还需程序员自身修正。
2. 有可能在从内存到磁盘的持久化过程中宕机,也不是原子性。
3. 为什么新生代复制老年代标记清除、标记整理?
资料:https://www.zhihu.com/question/32730099
1. 新生代存活对象少,且复制快,无内存碎片
2. 老年代存活对象多,eden:from:to = 8:1:1,要预留很大的内存,内存利用率低
4. synchronized(同步代码块和同步方法)的区别
资料:https://www.jb51.net/article/106941.htm
1. synchronized方法 范围大,效率低;synchronized代码块范围小,效率高。
2. synchronized方法 是对象锁,锁的是this;而synchronized代码块可以锁其他对象。