Redis面试题汇总

目录

一、动力节点Redis的书

7. Redis持久化

二、马士兵李瑾老师

2.1 Redis高级特性和应用

1)发布订阅:

2)Stream

延伸:Redis中几种消息队列实现的总结

3)慢查询

4)Pipeline流水线

5)事务

6)Lua

延伸:Redis与限流★★★

2.2 Redis底层原理

1)持久化

2)分布式锁

2.3 Redis高并发高可用

1)集群

2)主从复制

3)哨兵

2.4 Redis缓存使用问题及互联网运用

1)Redis缓存使用的数据不一致问题

2)缓存穿透、击穿、雪崩

3)热点Key

4)BigKey

2.5 Redis设计、实现

1)数据结构和内部编码

2)Redis中的线程和IO模型

3)缓存淘汰算法

4)过期策略和惰性删除


一、动力节点Redis的书

1. Redis有哪些特性?

2. Redis的IO模型是单线程还是多线程?

  • Redis4.0版本以前是纯粹的单线程模型;从4.0版本开始,处理客户端请求的仍然是单线程模型,但像持久化、对AOF的rewrite、对失效连接的清理等由后台的线程进行处理。
  • 从6.0开始才是真正意义上的多线程模型,对客户端请求的处理采用的才是多线程模型,但“多线程”仅用于接收、解析客户端的请求,然后将解析出的请求写入任务队列。而对任务(命令)的处理,仍然由单线程处理。这样做的好处:用户不需要考虑线程安全问题,不需要考虑事务控制。

3. Redis的内存移除策略有哪些?(P31)

4. Redis有哪些数据类型?(P3)

5. 典型应用场景?

  • String类型:缓存计数器(如视频播放次数);共享Session(如用户登录session保存在Redis中避免分布式应用中重新登录的问题,token令牌实现接口幂等性);限速器(如用于接口防刷)。
  • Hash类型:适合存储对象数据。key为对象名称,value为描述对象属性的Map,对对象属性的修改在redis中就可以直接完成,无需序列化。
  • List类型:栈、队列、阻塞式消息队列、动态有限集合。
  • Set类型:标签;抽奖;随机选人等。
  • 有序Set类型:排行榜。
  • BitMap:一般用于大数据量的二值性统计。

6. Redis命令

1)Redis基本命令

2)key操作命令

        keys、exists、del、rename、move、type、expire/pexpire、ttl/pttl、persist、scan

3)String型value操作命令(值最大存512M)

  • SET key value [EX seconds | PX milliseconds] [NX | XX]    (NX时等同于setnx)
  • setex/psetex key 过期时间秒/毫秒 value
  • setnx
  • getset 
  • mset/msetnx key value  [key value ...]
  • mget key [key ...]
  • append key value
  • incr/decr key
  • incrby/decrby key increment     (increment为增/减的数值,不能是小数)
  • incrbyfloat key increment     (没有decrbyfloat命令)
  • strlen key           返回key所存字符串的长度
  • getrange key start end        返回key所存字符串的子字符串(start、end为起始偏移量)
  • setrange key offset value     

4)Hash型value操作命令

特点:所有命令都带h

  • HSET key field value [field value ...]

        例如:hset user:001 name Lucy sex male age 18 hobbies read

  • HGET key field
  • hmset key field value [field value ...]
  • hmget key field [field...]
  • hgetall key         返回哈希表key中所有的域和值
  • hsetnx key field value   
  • hdel key field [field...]
  • hexists key field
  • hincrby/hincrbyfloat key field increment
  • hkeys key / hvals key    返回哈希表key中的所有域/值
  • hlen key    返回hash表key中域的数量
  • hstrlen key field     返回关联值字符串的长度

5)List型value操作命令

  • lpush/rpush key value [value...]             将一个或多个值value插入到列表key的表头/表尾
  • llen key       返回列表key的长度
  • lindex key index    返回列表key中下标为index的元素。列表从0开始计数
  • lset key index value       将列表key下标为index的元素的值设置为value
  • lpop/rpop key [count]       从列表key的表头/表尾移除count个元素,并返回移除的元素,count默认值为1
  • blpop/brpop key [key...] timeout      是lpop/rpop命令的阻塞式版本
  • lrange、lpushx/rpushx、linsert、rpoplpush、brpoplpush、lrem、ltrim

6)Set型value操作命令

set类型所有命令均以s开头。

  • sadd key member [member...]
  • smembers key      返回集合key中的所有成员
  • 其他命令略

6)Set型value操作命令

     

7. Redis持久化

Redis持久化有几种方式?默认是哪种?哪种优先级更高?

RDB持久化:RDB持久化的执行方式有几种?是否会阻塞主线程?

                      RDB持久化过程?

AOF持久化:Append Only File,是指Redis将每一次的写操作都以日志的形式记录到一个AOF文件中。

AOF的工作流程主要是4个部分:命令写入( append)、文件同步( sync)、文件重写(rewrite)、重启加载( load)。

命令写入:

  • AOF为什么把命令追加到aof_buf中?(李瑾老师讲义)
  • Redis提供了多种AOF缓冲区同步文件策略有哪几种?

重写机制:用于压缩日志文件大小的。

对比:RDB文件较小,保存的是快照,数据恢复较快,实时性差,数据安全性低;

           AOF保存的是写操作的日志,实时性好,文件可读性强。

二、马士兵李瑾老师

2.1 Redis高级特性和应用

1)发布订阅:

使用场景和缺点:

  • 需要消息解耦又并不关注消息可靠性的地方都可以使用发布订阅模式。
  • PubSub 的生产者传递过来一个消息,Redis会直接找到相应的消费者传递过去。如果一个消费者都没有,那么消息直接丢弃。如果开始有三个消费者,一个消费者突然挂掉了,生产者会继续发送消息,另外两个消费者可以持续收到消息。但是挂掉的消费者重新连上的时候,这断连期间生产者发送的消息,对于这个消费者来说就是彻底丢失了。
  • 所以和很多专业的消息队列系统(例如Kafka、RocketMQ)相比,Redis 的发布订阅很粗糙,例如无法实现消息堆积和回溯。但胜在足够简单,如果当前场景可以容忍的这些缺点,也不失为一个不错的选择。
  • 正是因为 Pub/Sub 有这些缺点,它的应用场景其实是非常狭窄的。从Redis5.0 新增了 Stream 数据结构,这个功能给 Redis 带来了持久化消息队列。

2)Stream

Redis5.0 最大的新特性就是多出了一个数据结构 Stream,它是一个新的强大的支持多播的可持久化的消息队列,借鉴了 Kafka 的设计。

延伸:Redis中几种消息队列实现的总结

  • 基于List的 LPUSH+BRPOP 的实现
  • 基于Sorted-Set的实现
  • PUB/SUB,订阅/发布模式
  • 基于Stream类型的实现

3)慢查询

默认慢查询时间是10毫秒,可以在配置文件中配置slowlog-log-slower-than参数,单位是微秒。可以持久化,后期可以查询慢查询。慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。

4)Pipeline流水线

Redis客户端执行一条命令分为如下4个部分: 1)发送命令2)命令排队3)命令执行4)返回结果。

其中1和4花费的时间称为Round Trip Time (RTT,往返时间),也就是数据在网络上传输的时间。

Redis提供了批量操作命令(例如mget、mset等),有效地节约RTT。

但大部分命令是不支持批量操作的,例如要执行n次 hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT。

举例:Redis的客户端和服务端可能部署在不同的机器上。例如客户端在本地,Redis服务器在阿里云的广州,两地直线距离约为800公里,那么1次RTT时间=800 x2/ ( 300000×2/3 ) =8毫秒,(光在真空中传输速度为每秒30万公里,这里假设光纤为光速的2/3 )。而Redis命令真正执行的时间通常在微秒(1000微妙=1毫秒)级别,所以才会有Redis 性能瓶颈是网络这样的说法。

Pipeline(流水线)机制能改善上面这类问题,它能将一组 Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端,而没有使用Pipeline则需要执行n条命令,整个过程需要n次RTT。

5)事务

事务原理:

  • MULTI用于开启事务,EXEC用于提交事务。discard命令是回滚(discard也只是丢弃这个缓存队列中的未执行命令,并不会回滚已经操作过的数据,这一点要和关系型数据库的Rollback操作区分开)。
  • Redis提供了简单的事务,之所以说它简单,主要是因为它不支持事务中的回滚特性,同时无法实现命令之间的逻辑关系计算。

Redis的watch命令:

  • 有些应用场景需要在事务之前,确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行(类似乐观锁)。Redis 提供了watch命令来解决这类问题。

6)Lua

通过使用LUA脚本:

1、减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行;

2、原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入(Redis执行命令是单线程)。

3、复用性,客户端发送的脚本会永远存储在redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑。

不过为了我们方便学习Lua语言,我们还是单独安装一个Lua。

在Redis使用LUA脚本的好处包括:

1、减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行;

2、原子操作,Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件;

3、复用性,客户端发送的脚本会存储在Redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑

延伸:Redis与限流★★★

  • 使用Redis+Lua语言实现限流(代码见讲义)
  • 限流算法有哪些?
    • 固定窗口算法:
    • 滑动窗口算法:
    • 漏洞算法:先有一个桶,桶的容量是固定的。以任意速率向桶流入水滴,如果桶满了则溢出(被丢弃)。桶底下有个洞,按照固定的速率从桶中流出水滴。漏桶核心是:请求来了以后,直接进桶,然后桶根据自己的漏洞大小慢慢往外面漏。
    • 令牌算法:先有一个桶,容量是固定的,是用来放令牌的。以固定速率向桶放令牌,如果桶满了就不放令牌了。处理请求是先从桶拿令牌,先拿到令牌再处理请求,拿不到令牌同样也被限流了。

2.2 Redis底层原理

1)持久化

见上面动力节点的。

2)分布式锁

1. 最简单的实现是setnx,但如果某个客户端拿到锁后进程挂了没机会释放锁就会造成死锁。如何避免呢?设置过期时间!

SETNX productIdlock 1    // 加锁
EXPIRE productIdlock 10  // 10s后自动过期

但上面两条操作不是原子性的,如果执行了一条之后宕机或者网络出现问题,依旧会有死锁的情况发生。在 Redis 2.6.12 之后,Redis 扩展了 SET 命令的参数,用这一条命令就可以了:

SET productIdlock 1 EX 10 NX
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);

2. 锁被别人释放怎么办?

3. Java代码实现分布式锁(见讲义)

4. 锁过期时间不好评估怎么办?(看门狗)

5. Redisson中的分布式锁(可重入),把上面这些工作都封装好了

这一块看看动力节点的书P243页。

     <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.3</version></dependency>
package com.msb.redis.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyRedissonConfig {/*** 所有对Redisson的使用都是通过RedissonClient*/@Bean(destroyMethod="shutdown")public RedissonClient redisson(){//1、创建配置Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");//2、根据Config创建出RedissonClient实例RedissonClient redisson = Redisson.create(config);return redisson;}
}

6. 集群下的锁还安全吗?

以上1~5是分布式场景下,锁在「单个」Redis实例中可能产生的问题,并没有涉及到 Redis 的部署架构细节。 而我们在使用 Redis 时,一般会采用主从集群 +哨兵的模式部署,这样做的好处在于,当主库异常宕机时,哨兵可以实现「故障自动切换」,把从库提升为主库,继续提供服务,以此保证可用性。

但是因为主从复制是异步的,那么就不可避免会发生的锁数据丢失问题(加了锁却没来得及同步过来)。从库被哨兵提升为新主库,这个锁在新的主库上,丢失了!

7. Redlock真的安全吗?(详见讲义)

2.3 Redis高并发高可用

1)集群

2)主从复制

①Redis主从复制原理?

3)哨兵

①哨兵机制的原理?

②Redis节点的下线判断?

③Sentinel Leader选举

2.4 Redis缓存使用问题及互联网运用

1)Redis缓存使用的数据不一致问题

针对高并发写场景。

通常选择先更新DB,再删除缓存。同时结合延时双删的处理,可以有效的避免缓存不一致的情况。“延迟双删” 伪代码如下:

redis.delKey(X)

db.update(X)

Thread.sleep(N)

redis.delKey(X)

2)缓存穿透、击穿、雪崩

针对高并发读场景。

缓存穿透:查询一个根本不存在的数据

原因:代码或业务出现问题;恶意攻击;

解决方法:缓存空对象(设置过期时间);布隆过滤器拦截。

缓存击穿:热key,过期的瞬间高并发

解决方法:使用互斥锁(mutex key);永远不过期

缓存雪崩:缓存层由于某些原因不能提供服务,比如同一时间缓存数据大面积失效。

3)热点Key

4)BigKey

2.5 Redis设计、实现

1)数据结构和内部编码

Redis存储的所有值对象在内部定义为redisobject结构体:type字段,encoding字段,lru字段,refcount字段,*ptr字段。

2)Redis中的线程和IO模型

        略。

3)缓存淘汰算法

4)过期策略和惰性删除

        略。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ObjectiveC-03-XCode的使用和基础数据类型

本节做为Objective-C的入门课程&#xff0c;笔者会从零基础开始介绍这种程序设计语言的各个方面。 术语 ObjeC&#xff1a;Objective-C的简称&#xff0c;因为完整的名称过长&#xff0c;后续会经缩写来代替&#xff1b;项目/工程&#xff1a;也称工程&#xff0c;指的是一个A…

南洋万邦与实在智能达成战略合作,AI Agent智能体助力上海政企数字化转型

2024年3月29日&#xff0c;浙江实在智能科技有限公司&#xff08;简称“实在智能”&#xff09;与上海南洋万邦软件技术有限公司&#xff08;简称“南洋万邦”&#xff09;签订战略合作协议&#xff0c;双方正式建立战略合作伙伴关系。 在这次战略合作中&#xff0c;南洋万邦和…

基于深度学习的端到端自动驾驶的最新进展:调研综述

基于深度学习的端到端自动驾驶的最新进展&#xff1a;调研综述 附赠自动驾驶学习资料和量产经验&#xff1a;链接 论文链接&#xff1a;https://arxiv.org/pdf/2307.04370.pdf 调研链接&#xff1a;https://github.com/Pranav-chib/ 摘要 本文介绍了基于深度学习的端到端自…

inBuilder 低代码平台新特性推荐 - 第十七期

今天来给大家带来的是 inBuilder 低代码平台特性推荐系列第十七期——如何在列表上添加图片。 一、 场景介绍 在表单开发的业务场景中&#xff0c;会有需要在列表上显示图片的场景&#xff0c;本文以车辆登记信息场景为例&#xff0c;介绍如何在列表上添加图片的开发过程。 …

CTF题型 nodejs(2) Js沙盒vmvm2逃逸原理总结典型例题

CTF题型 nodejs(2) Js沙盒逃逸原理&典型例题 文章目录 CTF题型 nodejs(2) Js沙盒逃逸原理&典型例题一.vm原理以及逃逸1.基本用法2.如何逃逸汇总1)this为对象2)this为null( Object.create(null))a .可用输出直接触发toString方法b.调用属性触发 3)Object.create(null)沙…

QT 如何集成minizip和zlib, 实现多文件压缩?

一.zlib库的源码地址 官网地址:zlib Home Site,找到"All released versions of zlib",点击选择自己的版本,这里我用的是zlib-1.2.11版本,下载源码。 二.mac下编译,window下cmake正常编译即可。 1.我这里需要使用的是64位的。 所以,cmake源码里添加如下代码。 …

论文精读--GPT4

现有的所有模型都无法做到在线学习&#xff0c;能力有限&#xff0c;而让大模型拥有一个tools工具库&#xff0c;则可以使大模型变成一个交互式的工具去协调调用API完成任务&#xff0c;同时GPT4还联网了&#xff0c;可以不断地更新自己的知识库 多模态模型&#xff0c;接受文…

关于 C/C++ 1Z(17)开源项目 openppp2 协同程式切换工作流

下述为开源项目 openppp2&#xff08;github&#xff09;构建工作在 C/C 17 的 stackful 有栈协同程式的工作流切换示意图&#xff1a; 在 openppp2 之中采用人工手动方式管理协同程式之间的切换&#xff0c;每个中断过程只是保存线程栈信息&#xff08;如寄存器、当前#PC EIP&…

GeoLite2 geoip数据库下载和使用

GeoLite2 数据库是免费的 IP 地理定位数据库&#xff0c;与MaxMind 的 GeoIP2 数据库相当&#xff0c;但准确度较低 。GeoLite2 国家、城市和 ASN 数据库 每周更新两次&#xff0c;即每周二和周五。GeoLite2 数据还可作为 GeoLite2 Country 和 GeoLite2 City Web 服务中的 Web …

新手学python还是c?

考虑到个人情况和职业规划是非常重要的。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 Python作为初学者入门语言…

怎么更新sd-webui AUTOMATIC1111/stable-diffusion-webui ?

整个工程依靠脚本起来的&#xff1a; 可直接到stable-diffusion-webui子目录执行&#xff1a; git pull更新代码完毕后&#xff0c;删除venv的虚拟环境。 然后再次执行webui.sh&#xff0c;这样会自动重新启动stable-diffusion-webui.

“超越摩尔定律”,存内计算走在爆发的边缘

前言 过去几十年来&#xff0c;在摩尔定律的推动下&#xff0c;处理器的性能有了显著提高。然而&#xff0c;传统的计算架构将数据的处理和存储分离开来&#xff0c;随着以数据为中心的计算&#xff08;如机器学习&#xff09;的发展&#xff0c;在这两个物理分离的单元之间传…

HarmonyOS 应用开发之LifecycleForm接口切换LifecycleApp接口切换 LifecycleApp接口切换

LifecycleForm接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onCreate?(want: Want): formBindingData.FormBindingData;ohos.app.form.FormExtensionAbility.d.tsonAddForm(want: Want): formBindingData.FormBindingData;onCastToNormal?(formId: string…

百度网站收录提交入口

百度网站收录提交入口 在网站刚建立或者更新内容后&#xff0c;及时将网站提交给搜索引擎是提高网站曝光和获取流量的重要步骤之一。百度作为中国最大的搜索引擎之一&#xff0c;网站在百度中的收录情况尤为重要。下面介绍一下如何通过百度的网站收录提交入口提交网站。 1. 百…

Pygame基础9-射击

简介 玩家用鼠标控制飞机&#xff08;白色方块&#xff09;移动&#xff0c;按下鼠标后&#xff0c;玩家所在位置出现子弹&#xff0c;子弹匀速向右飞行。 代码 没有什么新的东西&#xff0c;使用两个精灵类表示玩家和子弹。 有一个细节需要注意&#xff0c;当子弹飞出屏幕…

视觉里程计之对极几何

视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容&#xff0c;相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念&#xff0c;对极几何。 对极几何 对极几何是立体视觉中的几何关系&#xff0c;描…

从学习海底捞到学习巴奴,中国餐饮带洋快餐重归“产品主义”

俗话说“民以食为天”&#xff0c;吃饭一向是国人的头等大事&#xff0c;餐饮业也是经济的强劲助推力。新世纪以来&#xff0c;餐饮业不断讲述着热辣滚烫的商业故事。 2006年&#xff0c;拥有“必胜客”、“肯德基”等品牌的餐饮巨头百胜集团&#xff0c;组织两百多名区域经理…

Effective-C++阅读解析条款(条款二:尽量以const,enum,inline替换#define)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 书中说这个条款或许改为“宁可以编译器替换预处理器”比较好&#xff0c;这句话在我看来原因是这样的&#xff1a; 如果我们有这样一个宏(假设写这个宏的人比较粗心)&#xff1a;#define Add(x, y) x y 我们本意是想得到…

全栈的自我修养 ———— redux入门(看这么一篇就够了!!!)

redux时react中负责状态管理的工具 一、下载二、配置1、目录2、store配置3、redux中index.js配置4、启动类中index.js配置 三、使用1、调用store的数据2、调用store里面的方法3、改变store里面的值 一、下载 npm I reduxjs/toolkit react-redux二、配置 1、目录 modules里面…

uniapp-打包IOS的APP流程

打包前所需配置 在manifest文件内配置 1. APP图标 2. 启动界面 有三种启动界面配置 第一种是 HBuilderX 官方给的通用启动界面&#xff0c;页面单一&#xff0c;屏幕中间就一个圆框图标 第二种是自定义的启动图&#xff0c;无法通过AppStore的审核 第三种是自定义storyboard启动…