Redis面试题(三)

文章目录

  • 前言
  • 一、怎么理解 Redis 事务?
  • 二、Redis 事务相关的命令有哪几个?
  • 三、Redis key 的过期时间和永久有效分别怎么设置?
  • 四、Redis 如何做内存优化?
  • 五、Redis 回收进程如何工作的?
  • 六、 加锁机制
  • 总结


前言

  1. 怎么理解 Redis 事务?
  2. Redis 事务相关的命令有哪几个?
  3. Redis key 的过期时间和永久有效分别怎么设置?
  4. Redis 如何做内存优化?
  5. Redis 回收进程如何工作的?
  6. 加锁机制

一、怎么理解 Redis 事务?

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会
被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。


二、Redis 事务相关的命令有哪几个?

MULTI、EXEC、DISCARD、WATCH


三、Redis key 的过期时间和永久有效分别怎么设置?

EXPIRE 和 PERSIST 命令


四、Redis 如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。
比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信息存储到一张散列表里面。


五、Redis 回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。
Redi 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。
一个新的命令被执行,等等。
所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。
如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。


六、 加锁机制

咱们来看上面那张图,现在某个客户端要加锁。如果该客户端面对的是一个 redis cluster 集群,他首先会根据 hash 节点选择一台机器。 这里注意,仅仅只是选择一台机器!这点很关键!紧接着,就会发送一段 lua 脚本到 redis 上,那段 lua 脚本如下所示:
为啥要用 lua 脚本呢?因为一大坨复杂的业务逻辑,可以通过封装在 lua 脚本中发送给 redis,保证这段复杂业务逻辑执行的 原子性。
那么,这段 lua 脚本是什么意思呢?这里 KEYS[1]代表的是你加锁的那个 key,比如说:RLoc
k lock = redisson.getLock(“myLock”);这里你自己设置了加锁的那个锁 key 就是“myLock”。
ARGV[1]代表的就是锁 key 的默认生存时间,默认 30 秒。ARGV[2]代表的是加锁的客户端的 ID,类似于下面这样:8743c9c0-0795-4907-87fd-6c719a6b4586:1
给大家解释一下,第一段 if 判断语句,就是用“exists myLock”命令判断一下,如果你要加锁的那个锁 key 不存在的话,你就进行加锁。如何加锁呢?很简单, 用下面的命令:hset myLock8743c9c0-0795-4907-87fd-6c719a6b4586:1 1,通过这个命令设置一个 hash 数据结构,这行命令执行后,会出现一个类似下面的数据结构:
上述就代表“8743c9c0-0795-4907-87fd-6c719a6b4586:1”这个客户端对“myLock”这个锁 key 完成了加锁。接着会执行“pexpire myLock 30000”命令,设置 myLock 这个锁 key 的 生存时间 是 30 秒。好了,到此为止,ok,加锁完成了。


总结

  1. 怎么理解 Redis 事务?
  2. Redis 事务相关的命令有哪几个?
  3. Redis key 的过期时间和永久有效分别怎么设置?
  4. Redis 如何做内存优化?
  5. Redis 回收进程如何工作的?
  6. 加锁机制

你可能感兴趣的:(面试,面试,java,redis)