Redis面试题(三)

文章目录

  • 前言
  • [一、怎么理解 Redis 事务?](#一、怎么理解 Redis 事务?)
  • [二、Redis 事务相关的命令有哪几个?](#二、Redis 事务相关的命令有哪几个?)
  • [三、Redis key 的过期时间和永久有效分别怎么设置?](#三、Redis key 的过期时间和永久有效分别怎么设置?)
  • [四、Redis 如何做内存优化?](#四、Redis 如何做内存优化?)
  • [五、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. 加锁机制
相关推荐
兑生15 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu15 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
发现一只大呆瓜15 小时前
React-彻底搞懂 Redux:从单向数据流到 useReducer 的终极抉择
前端·react.js·面试
零雲16 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
uzong16 小时前
Skill 被广泛应用,到底什么是 Skill,今天详细介绍一下
人工智能·后端·面试
发现一只大呆瓜17 小时前
React-路由监听 / 跳转 / 守卫全攻略(附实战代码)
前端·react.js·面试
lay_liu18 小时前
Linux安装redis
linux·运维·redis
左左右右左右摇晃19 小时前
Java并发——synchronized锁
java·开发语言
消失的旧时光-194319 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
yuhaiqiang19 小时前
被 AI 忽悠后,开始怀念搜索引擎了?
前端·后端·面试