哈喽!大家好,我是小奇,一位不靠谱的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!

文章目录

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

一、前言

作为一名Java程序员,Redis底层的一些原理是我们不必学会就可以搬砖工作的一种技能点,但是小奇为什么还要讲一下呢?难道就是为了浪费大家1分钟的宝贵时间,一个人1分钟,50万人就是1年,5000万人就是100年,赚了,小奇以一己之力成功搞挂一个人(血赚)。

当然不是,并且小奇的文章也没有那么多人看,最多也就浪费个吧。

学习Redis底层原理是因为面试官要问啊!,所以我们就要学,什么?不实用的你不学?那邻居小奇可要使劲学啦,到时候面试官只要小奇不要你。

至于你问为什么面试官要问Redis底层原理呢,这个。。。我把这次机会留给你,下次你面试的时候面试官问:“讲一下Redis底层原理”。你:“面试官你好,请问为什么你要问Redis底层原理呢,你给我台电脑,我五分钟给你搭建好图书管理系统他不香吗,咱们键盘上见真章”。这时面试官就会告诉你答案,你就可以把答案打在评论区,让小奇以及众多小伙伴一起知道一下到底为什么要问?

二、面试

在一个晴朗的周日,我来到了一个陌生的园区(别问为什么是周日,问就是997,不过为了填饱肚子的打工人,只能明知山有虎、偏向虎山行),坐在陌生的会议室,等待HR小姐姐去叫面试官,此时我的心情和各位小伙伴一样五味杂陈,担心面试官问的会不会很难?问到我的知识盲区我该怎么办?一会自我介绍的时候要不要吹一下我和小奇的关系?

一位英俊潇洒,眼神犀利的面试官走了进来,看到他那犀利、仿佛能看穿一切的眼神 ,我在想要不然一会就不要20k了,要8k得了,这个面试官一看就不好糊弄啊,但是我想起来我来之前刚看了小奇的趣学编程系列,我已经完全学会了小奇的精髓,我顿时就来了底气,决定一会要30k,不给就学小奇赖着不走(哈哈)

面试官:小奇是吧,带简历了吗?

我:没带,现在彩印两块一张,我简历五张,每次面试都要花费十块,我朋友说了还没工作就先让你掏钱的工作不要去。

面试官:。。。那你靠什么来征服我,让我录用你

我:气质?

(此时面试官并没有叫保安,而是从门后拿出了恭候我多时的棍子,我瞬间怂了)

我只好从我的双肩包中拿出了我上午从其他公司面试官手中要回的简历,上午的情形是这样的。

上午的面试官:今天的面试就到这吧,回去等通知吧!

我:面试官你好,如果贵公司不打算录取我的话,能不能把我的纸质简历还给我,我下午还有一家面试。

上午的面试官:我说你的简历怎么皱皱巴巴,原来你一直在循环利用啊!这个症状出现多久了?

我:半拉月了。。。

(当我把皱皱巴巴的简历交给面试官后,这场面试才得以继续进行。。。)

三、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遍历过的地方就不在遍历了,你插入到遍历过的地方就不会再遍历到。

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

我:额。。。面试官这个我的纸质简历可以给我吗,可以不往我的简历上写写画画吗,我明天的面试还要用。

面试官:还面啥别的公司啊,就来我这吧,条件随便开

我:那就100k吧(此时面试官又拿起了他准备好的棍子)

面试官:你要是不来就给我推荐一下,让别人来我这面试一下

我:你先好好学习一下Redis吧,今天幸亏只是我来了,如果是小奇的忠实读者来了,你将会被虐的很惨的。(我将我的《Redis设计与实现》留给了面试官,转身留下了帅气的背影,而面试官落寞无神的呆呆的坐在那里,仿佛一个亿离他而去。。。)

五、总结

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

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

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

面试官:我们来聊一聊Redis吧,你了解多少就答多少相关推荐

  1. 面试官问我:Redis 内存满了怎么办

    转载自 想不到!面试官问我:Redis 内存满了怎么办 Redis占用内存大小 Redis的内存淘汰 LRU算法 LRU在Redis中的实现 LFU算法 问题 Redis占用内存大小 我们知道Redi ...

  2. 面试官:你对Redis缓存了解吗?面对这11道面试题是否有很多问号?

    关于Redis的知识总结了一个脑图分享给大家 1.在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚,那确实比 ...

  3. 面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?

    前言 关于Redis的知识,总结了一个脑图分享给大家 1.在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚, ...

  4. 面试官:你对Redis缓存了解吗?面对这5道面试题是否有很多问号?

    1.redis 集群模式的工作原理能说一下么?在集群模式下, redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了 解一致性 hash 算法吗? 面试官心理分析 在前几年,redis 如果 ...

  5. 面试官问我为什么Redis这么快,我.......

    开课开课~ 面试官:为什么项目中用Redis? 我:当然是因为Redis好啊 面试官:emmm.....那Redis哪里好? 我:因为Redis快啊. 面试官:(这小伙子有点彪啊...)那为什么Red ...

  6. 面试官问我,Redis分布式锁如何续期?懵了。

    作者:肥朝,来自:肥朝(ID:feichao_java) 前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的老粉丝 ...

  7. redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

    点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...

  8. 面试官:能说说Redis的持久化机制吗?

    我们先来看这么一段面试场景-- 面试官:你们项目缓存技术用到了什么缓存技术? 小帅:Redis 面试官:那么问一下,Redis缓存技术用到的持久化机制是哪一种机制? 小帅:AOF 面试官:好吧,回去等 ...

  9. redis list设置过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

    点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...

  10. 大厂面试官喜欢这样问Redis,双写一致性、并发竞争、线程模型,我整理好了

    你知道的越多,你不知道的越多 点赞再看,养成习惯 https://github.com/java-已经开源,有面试脑图 前言 正文 上几期吊打系列我们提到了Redis的很多知识,还没看的小伙伴可以回顾 ...

最新文章

  1. 【pandas学习笔记】DataFrame
  2. Codeu_576_问题 D: 查找
  3. 修建道路 贪心,思维(女赛)
  4. 复合类型_没有学不会的python--复合类型(1)--概念和元组
  5. Chrome开发者工具和Firebug的一些简单比较
  6. 右手螺旋判断磁感应强度方向_高中物理第11章 电磁感应(汇总58个动画视频)
  7. 电机与拖动,直流他励电动机的特性测试实验报告,江南大学自动化
  8. daz模型导入marvelous_传世工坊自制Daz Studio 4.10 系列入门教程
  9. 好看的极简网站导航源码自适应静态页
  10. 【Zookeeper学习】Apache Zookeeper项目简介
  11. jQuery特效:实现瀑布流
  12. .native.prevent是什么意思?
  13. 2021年全国大学生网络安全邀请赛暨第七届“东华杯“上海市大学生网络安全大赛Writeup
  14. Origin画图笔记
  15. 动物派对场景插图设计
  16. handsontable使用及遇到的坑--mergeCell、合并单元格
  17. Unity中使用Google.Protobuf3,获取dll文件
  18. 永久免费的专业二维码生成器和二维码扫描器
  19. WEB前端面试2014阿里旺旺
  20. 干货!基于非递减分位数网络的值分布强化学习及其高效探索方法

热门文章

  1. Qt系列文章之(十三)表格窗体
  2. 自然常数e是什么?它是怎么来的?
  3. 对讲机有哪些?如何选购对讲机?
  4. HTML前端连接go语言后段,一次完整的浏览器请求响应过程-Go语言中文社区
  5. 将dubbo暴露HTTP服务
  6. 超级管理器Android,超级文件管理器
  7. 二维码扫码登陆过程分析
  8. Ardence公司PHAR-LAP ETS 简介
  9. Windows Live SkyDrive 介绍之图片存储:摄影师在线图片展示的新选择
  10. 【Ubuntu+Caffe+CPU】Cannot use GPU in CPU-only Caffe: check mode