面试官:Redis基本命令有哪些,Redis怎么实现分布式锁?

news2025/1/23 1:08:54

哈喽!大家好,我是奇哥,一位专门给面试官添堵的职业面试员
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!

文章目录

  • 一、Redis基本数据类型与使用场景
    • 1、String
    • 2、Hash
    • 3、List
    • 4、Set
    • 5、ZSet
  • 二、Redis日常问题
  • 三、总结

一、Redis基本数据类型与使用场景

面试官:我看你简历上写的精通Redis?(哼,面试官轻蔑的一笑)

(看着面试官轻蔑的笑容,我忍不住拿出了我的Redis书籍推给了他)

我:这本书我倒背如流,你随便提问,答不上来算我输,答上来你就要为你的轻蔑向我道歉。

在这里插入图片描述

(我的笑容逐渐自信。。。)

在这里插入图片描述

(此时面试官看着书若有所思,我怀疑他肯定在想他对这本书的了解程度吧)

面试官:好吧,那先简单说一下Redis有哪些数据类型吧

我:redis主要有五种数据类型,分别是String、Hash、List、Set、ZSet

面试官:那他们都是怎么存储和读取数据的呢,有哪些使用场景呢?

1、String

单值存储:set [key] [value]
在这里插入图片描述
取值:get [key]
在这里插入图片描述

多值存储:mset [key1] [value] [key2] [value]
在这里插入图片描述
取值:mget [key1] [key2]
在这里插入图片描述

分布式锁上锁:setnx [key] true

返回1代表上锁成功
在这里插入图片描述
返回0代表上锁失败
在这里插入图片描述
分布式锁释放锁:del [key]
在这里插入图片描述
设置超时时间:expire [key] [时间] (如果出现异常导致删除锁失败,可以设置超时时间,到达时间锁自动删除)
在这里插入图片描述
实现原子性分布式锁加锁并设置超时时间:set [key] true ex [时间] nx (如果上完锁在给锁设置超时时间之间出现异常,还是会导致锁无法删除,那么将上锁命令和设置超时时间命令合为一个命令)
在这里插入图片描述

计数器:incr [key]
在这里插入图片描述
获取计数器的值:get [key]
在这里插入图片描述
批量获取计数:incrby [key]
在这里插入图片描述
获取计数器的值:get [key]
在这里插入图片描述

2、Hash

存储数据:hset [table] [key] [value] (这里我们可以假设实现向购物车中添加商品)

向购物车添加一个苹果
在这里插入图片描述
向购物车添加一本书
在这里插入图片描述
向购物车添加一个香蕉
在这里插入图片描述

在原有商品上加数量:hincrby [table] [key] [数量]

再向购物车中添加一个苹果
在这里插入图片描述

商品种类数量:hlen [table]
在这里插入图片描述

获取购物车所有的商品:hgetall [table]
在这里插入图片描述

删除商品:hdel [table] [key]
在这里插入图片描述

3、List

将一个值放入列表的头部(最左边):lpush [key] [value]
在这里插入图片描述

移除并返回列表的头元素:lpop [key]
在这里插入图片描述

将一个值放入列表的尾部(最右边):rpush [key] [value]
在这里插入图片描述

移除并返回列表的尾元素:rpop [key]
在这里插入图片描述

返回列表中指定区间内的元素:lrange [key] [开始位置] [结束位置]
在这里插入图片描述

从列表表头弹出一个元素,若列表中没有元素,阻塞等待time秒,如果time=0,一直阻塞等待
在这里插入图片描述
从列表表尾弹出一个元素,若列表中没有元素,阻塞等待time秒,如果time=0,一直阻塞等待
在这里插入图片描述

4、Set

往集合key中存入元素,元素存在则忽略,若key不存在则新建:sadd [key] [元素] (这里我们模仿一个抽奖的业务场景,先往集合中放入要抽奖的人)
在这里插入图片描述

从集合key中随机选取几个元素,元素不从集合中删除:srandmember [key] [元素个数] (这里我们抽两个奖项)
在这里插入图片描述

获取集合key中所有元素:smembers [key]
在这里插入图片描述

获取集合key中元素的个数:scard [key]
在这里插入图片描述

判断一元素是否存在于集合中:sismember [key] [元素]
在这里插入图片描述

从集合中删除元素:srem [key] [元素]
在这里插入图片描述

从集合中随机选出几个元素,并且删除:spop [key] [元素个数] (例如我们抽奖的时候先抽了三等奖,那么抽二等奖的时候三等奖的人就没有资格了,就要将三等奖的人删除)
在这里插入图片描述

交集运算:sinter [key] [元素]
在这里插入图片描述

将交集结果存入新集合key2中:sinterstore [key2] [key] [元素]
在这里插入图片描述

并集运算:sunion [key] [元素]
在这里插入图片描述

将并集结果存入新集合key2中:sunionstore [key2] key [元素]
在这里插入图片描述

差集运算:sdiff [key] [运算]
在这里插入图片描述

将差集结果存入新集合key2中:sdiffstore [key2] [key] [元素]
在这里插入图片描述

5、ZSet

往有序集合key中加入带分值的元素:zadd [key] [分值] [元素] (业务中我们可以用来实现例如微博热搜排行的功能)
在这里插入图片描述

返回有序集合key中元素的分值:zscore [key] [元素]
在这里插入图片描述

返回有序集合key中元素的个数:zcard [key]
在这里插入图片描述

为有序集合key中元素的分值加上一个分值:zincrby [key] [分值] [元素]
在这里插入图片描述

正序获取有序集合key从开始下标到结束下标的元素:zrange [key] [开始] [结束]
在这里插入图片描述

倒叙获取有序集合key从开始下标到结束下标的元素:zrevrange [key] [开始下标] [结束下标] (这里就是例如微博热搜榜中根据热度倒叙排序获取前十个)
在这里插入图片描述

从有序集合key中删除元素:zrem [key] [元素]
在这里插入图片描述

(整理不易,性感小奇在线求赞。。。)

在这里插入图片描述

二、Redis日常问题

面试官:嗯。你上面写了那么多我也顾不上看,简单的问你几个问题吧

我:好

面试官:Redis中我们怎么创建分布式锁

我:使用setnx命令

面试官:Redis中创建分布式锁后出现异常解锁失败,怎么将这个锁删掉

我:可以使用expire来给锁加一个时间,过了这个时间后Redis自动将这个锁删掉。

面试官:如果在加时间之前就出现异常了,时间没有加上怎么办?

我:可以使用原子性的命令将分布式锁和时间一同创建出来,这样就不用担心异常了,因为原子性,一个成功都成功,一个失败都失败。

在这里插入图片描述

面试官:Redis是单线程的吗?

我:Redis在读写操作的时候是单线程的,但是其它功能,例如持久化、异步删除、集群数据同步等是有额外的线程执行的。

面试官:Redis单线程为什么还能这么快?

我:因为Redis的数据都在内存中,而且单线程避免了多线程的切换性能损耗问题。

面试官:Redis单线程如何处理并发客户端连接?

我:Redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器中,事件分派器将事件分发给事件处理器。

在这里插入图片描述

面试官:我想全量查询Redis中所有key怎么查询,或者模糊查询符合规则的key怎么查询呢

我:使用 keys * 可以查询Redis中所有的key,如果要模糊查询直接加上规则即可,例如要查询前缀为小奇的key可以使用 keys 小奇* 来查询

面试官:这样查询有没有什么问题呢,有没有其他的解决方案呢?

我:使用 keys * 查询是全量查询Redis中的key值,如果key值过多的话最造成线程堵塞,因为Redis读写是单线程的,我们可以使用scan命令渐进式读取数据。

面试官:可以详细说一下scan命令吗?

我:scan命令的格式为:scan [游标] match [通配符] count [每一次查询的数量] (初始查询的时候游标为0,然后第二次查询游标为第一次查询时返回的数据,依次类推,最后游标返回0时表示查询完毕)

我现在Redis中一共有9条数据,我每次查询3条,分三次查询完毕。
在这里插入图片描述

面试官:scan命令有什么缺点吗,一定能够完全获取全量的数据吗?

我:不一定,如果在scan的过程中有新的数据变化,例如插入数据,删除数据等,那么新增的键可能没有遍历到,因为scan遍历过的地方就不在遍历了,你插入到遍历过的地方就不会再遍历到。

在这里插入图片描述

面试官:小伙子真厉害啊,我这边没有什么要问的了,你还有什么问题要问(面试官两眼放光)

我:请问咱们这里上厕所会计时吗。。。

三、总结

这里关于Redis还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧,另外可以微信搜索【小奇JAVA面试】的好文章,获取我为大家准备的资料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1046078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP地址定位的特点

IP地址定位是一种广泛应用于网络领域的技术,它允许我们确定特定设备或用户在互联网上的位置。这项技术在很多方面都具有重要的特点,本文将深入探讨这些特点。 1.全球性覆盖: IP地址定位IP66_ip归属地在线查询_免费ip查询_ip精准定位平台具有全…

macOS Sonoma 14 正式版(23A344)发布,附黑/白苹果镜像下载地址

系统介绍(系统下载地址:http://www.imacosx.cn/115300.html) 黑果魏叔9 月 27日消息,苹果今日向 Mac 电脑用户推送了 macOS Sonoma 14 正式版(23A344)。 macOS 14正式版系统发布:全新功能与改…

Linux:理解进程的多种状态

文章目录 理解状态运行状态阻塞状态挂起状态Linux系统下的进程状态的解析状态的查看 本篇总结的是进程的多种状态 对于进程的状态理解,在教材上通常是有下面的思维模式图 那么如何理解上面图片中的内容? 理解状态 如何理解状态?其实理解状…

什么是HTTP头部(HTTP headers)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 理解 HTTP 头部(HTTP Headers)⭐ HTTP 头部的分类⭐ HTTP 头部的应用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦&#x…

基于Python Django的公务员考试信息管理系统

文章目录 1 简介2. 技术栈3 功能分析4 功能具体设计4.1 软件功能模块设计4.2数据库设计与实现4.2.1概念模型设计4.2.2数据库逻辑结构设计 5系统详细设计5.1系统功能模块5.2管理员功能模块 六 源码咨询 1 简介 公务员考试信息管理系统的开发运用Python技术,MIS的总体…

8月数据出炉!NOA与激光雷达「分道扬镳」?降本大战升级

对于激光雷达赛道来说,如何在市场整体需求更加偏向强调性价比的背景下,继续维持前装出货的增速,已经成为新的考验。 进入2023年,高阶智驾(中国市场以NOA为代表),继续保持向上势头。8月&#xff…

Archlinux Timeshift的系统备份与还原

服务器在滚挂或误删系统文件,timeshift系统备份与还原的情景: 安装 timeshif 1 yay -s timeshif 备份设置 选择快照类型 此处选择【RSYNC】 选择储存位置 每台设备安装分区不一样,大家安装实际情况选择,一般选择比较大的空间存储,并且最好是机械,这样不容易损坏 设置计…

实战项目:VB实现小鸟快跑小游戏

文章目录: 一:效果演示 二:实现思路 三:代码实现 form1 效果图 代码 form2 效果图 代码 一:效果演示 效果图◕‿◕✌✌✌ 代码下载 二:实现思路 窗口1 就是实现窗口的跳转和关闭窗口2 1.先添加背…

【接口测试】Chrome浏览器F12调试工具抓包详细分析(超细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 调试时使用最多的…

Docker网络+资源控制

一、Docker网络 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。…

【计算机网络】IP数据报首部格式、最大传输单元MTU、最大分段大小MSS

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525; 给大家跳段…

【生育险报销】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

计算机视觉与深度学习-图像分割-视觉识别任务03-实例分割-【北邮鲁鹏】

目录 参考定义Mark R-CNN结构思路Mask R-CNN训练阶段使用的Mask样例Mask R-CNN实例分割结果Mask R-CNN检测姿态 参考 论文题目&#xff1a;Mask R-CNN 论文链接&#xff1a;论文下载 论文代码&#xff1a;Facebook代码链接&#xff1b;Tensorflow版本代码链接&#xff1b; K…

51单片机3【单片机的种类】

1.51单片机发展史 1. 发展史 &#xff08;1&#xff09;总结&#xff1a;早期是不分单片机和其他CPU的&#xff0c;早期都是一起的&#xff0c;后来应用级别的高端CPU相继推出用于别的行业&#xff08;PC&#xff0c;手机&#xff09;其中一支专用与低性能&#xff0c;低价格作…

Java基础简单整理

文章目录 Java语言具有以下特点&#xff1a;Java SE vs Java EEJVM vs JDK vs JRE为什么说 Java 语言编译与解释并存&#xff1f;Java 和 C 的区别?Java注释用法&#xff1a;Java标识符Java基本数据类型链接Java字符串类型链接基本类型和包装类型的区别&#xff1f;静态方法为…

Unity实现设计模式——观察者模式

Unity实现设计模式——观察者模式 观察者设计模式定义了对象间的一种一对多的组合关系&#xff0c;以便一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都得到通知并自动刷新。 简单来说就是某个人需要收到通知只需要订阅这个通知&#xff0c;当通知发送时会发送到每…

自定义热加载:如何不停机实现核心代码更新

文章目录 1. 常见的几种实现代码热更新的几种方式对于开发环境我们可以使用部署环境1. 使用 Arthas 的 redefine 命令来加载新的 class 文件2. 利用 URLClassLoader 动态加载3. 通过Java的Instrumentation API 也是可以实现的 2. 实现1. ClassScanner扫描目录和加载类2. 定时任…

system trace

adb shell stopadb shell start //重启adb 数据会干净点adb shell //也试过在adb shell 外面dump system trace&#xff0c;但是同样的参数dump出来看不到如此详细&#xff0c;比如makeApplication的时长&#xff0c;线程执行被中断等atrace -z -b 40000 am wm view res ss g…

常用接口测试工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

如何使用ASO优化来提高应用的安装率

应用程序的成功并非一蹴而就&#xff0c;它需要大量的时间和工作&#xff0c;而这一切都取决于对流程的深入理解、对结果的衡量以及对执行的某些营销活动的有效性进行分析。但哪些优化在App Store或Google Play上取得成功最关键&#xff1f;为了取得成功&#xff0c;我们必须跟…