Redis面试题(三)

2023-09-20 15:52:24


前言

  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. 加锁机制
更多推荐

LVS+Keepalived群集

LVS+Keepalived群集一、Keepalived实现原理1、原理2、Keepalived体系主要模块及其作用3、Keepalived工具介绍4、合格的集群应该具备的特性二、Keepalived的部署三、LVS+Keepalived高可用集群部署1.部署共享存储2.配置负载调度器(主、备相同)3.配置节点服务器4

2023年亚马逊云科技中国峰会记录

前言有幸抽到了亚马逊云科技中国峰会的门票,恰好又是在上海举行的,并且看预告有很多热点内容,所以就参加了。27日一早就赶到了世博中心,此时已经排起了长队。看来与会者还是蛮多的。整体分为以下几个环节:一.上午的主题演讲二.下午的互动活动三.下午的各种分会场论坛一.主题演讲-面向未来进行构建首个环节,是主题演讲,演讲者是亚马

springboot2整合nacos云服务,配置基本类型和json类型

最近公司要搭建一个配置中心,由于不想自己运维,便选择了云服务,定的是阿里云的nacos服务,即​​​​​​​https://mse.console.aliyun.com/。这里记录一下在springboot2项目中,使用云nacos来做一些基本配置String、int等,和配置json数据映射到java对象中。1云na

Android Kotlin 基础详解

1,基础语法1.1可变变量与不可变变量可以多次赋值的变量是可变变量,用关键字var表示:var<标识符>:<类型>=<初始化值>注意,在kotlin中成员变量不会赋默认值,不像java一样,必须手动添加默认值。varname:String="yuanzhen"name="yuanzhen1"varage:Int=20a

27、Flink 的SQL之SELECT (窗口函数)介绍及详细示例(3)

Flink系列文章1、Flink部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接13、Flink的tableapi与sql的基本概念、通用api介绍及入门示例14、Flink的tableapi与sql之数据类型:内置数据类型以及它们的属性15、Flink

Spring Boot中Tomcat服务器参数解析及高并发控制

SpringBoot中Tomcat服务器参数解析及高并发控制SpringBoot集成了多种服务器,默认使用了Tomcat服务器。在高并发情况下,合理地配置Tomcat服务器参数对于控制请求量和提高系统的稳定性至关重要。本文将解释SpringBoot中涉及Tomcat服务器的一些关键参数,并探讨在高并发情况下如何通过这些

JS中Symbol的介绍

1、引入Symbol类型的背景ES5的对象属性名都是字符串,这容易造成属性名冲突的问题举例:使用别人的模块/对象,又想为之添加新的属性,这就容易使得新属性名与原有属性名冲突2、Symbol类型简介symbol是一种原始数据类型其余原始类型:未定义(undefined)、空值(null)、布尔值(boolean)、字符串

进一步观察扩散模型中的参数有效调整

摘要:像Stablediffusion[31]这样的大规模扩散模型非常强大,可以找到各种真实世界的应用程序,而通过微调来定制这样的模型会降低内存和时间的效率。受自然语言处理最新进展的推动,我们通过插入小型可学习模块adapters(称为适配器)来研究大型扩散模型中的参数高效调优。具体来说,我们将适配器的设计空间分解为正

[Linux入门]---文本编辑器vim使用

文章目录1.Linux编辑器-vim使用2.vim的基本概念4.vim正常模式命令集从正常模式进入插入模式从插入模式转换为命令模式移动光标删除文字复制替换撤销更改跳至指定行5.vim末行模式命令集5.总结1.Linux编辑器-vim使用vi/vim作为Linux开发工具之一,从它的键盘操作图也可以知道,它的操作不会很简

网络安全(黑客)自学

前言:我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,

Feign实战-Springboot集成OpenFeign Demo以及参数详解

最近整理一下微服务的文章,先拿一直用的OpenFeign开刀思考:微服务之间如何方便优雅的实现服务间的远程调用一、说说openFeign是什么吧?说到这个,那不得不先说说RPC1.什么是RPCRPC全称是RemoteProcedureCall,即远程过程调用,其对应的是我们的本地调用。RPC的目的是:让我们调用远程方法

热文推荐