我的面经

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代码块可以锁其他对象。

posted @ 2020-09-06 00:11  Numerz  阅读(169)  评论(0编辑  收藏  举报