Redis面试题汇总

news2024/11/28 4:31:43

一、动力节点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真的安全吗?(详见讲义)

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

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

相关文章

Aspect使用

今天在敲苍穹外卖的时候用到了 SpringBoot 中的 AOP&#xff0c;这里简单记录下使用过程。 背景 目前的CreateTime、CreateUser、UpdateTime、UpdateUser等字段都是在插入和更新操作时手动设置&#xff0c; 每次都要手动操作太麻烦&#xff0c;可以把这几个操作放到一块包装一…

前端开发的主要语言有哪些?

1、HTML (HyperText Markup Language) 作用&#xff1a;HTML是构建网页内容的基础&#xff0c;是一种标记语言&#xff0c;用来定义网页的结构&#xff0c;如标题、段落、列表、表格、图像、链接等元素。优点&#xff1a;易于学习&#xff0c;广泛兼容&#xff0c;标准化程度高…

【MATLAB源码-第27期】基于matlab的QPSK定时同步仿真,采用gardner算法,Costa锁相环。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QPSK&#xff0c;有时也称作四位元PSK、四相位PSK、4-PSK&#xff0c;在坐标图上看是圆上四个对称的点。通过四个相位&#xff0c;QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率&#xff08;BER&#xff09; —…

双目测距项目 | 在Jetson-Nano平台上部署SGBM深度测距+YOLOv5目标检测算法

项目应用场景 面向在 Jetson Nano 平台上部署 SGBM 深度测距和基于 YOLOv5 的目标检测算法&#xff0c;实现双目测距的功能。 项目流程与效果&#xff1a; 项目细节 > 具体参见项目 README.md项目获取 https://download.csdn.net/download/weixin_42405819/89051043

【经验分享】Ubuntu下如何解决问题arm-linux-gcc:未找到命令

【经验分享】Ubuntu下如何解决问题arm-linux-gcc&#xff1a;未找到命令 前言问题分析解决方法 前言 在编译过程中发现一个问题&#xff0c;明明之前安装了gcc-4.6版本&#xff0c;版本信息都是正常显示的&#xff0c;刚安装上去的时候也是可以用的。但不知道什么原因突然不能…

Linux多进程通信(3)——详细说说共享内存原理及使用例程

1.共享内存原理及优缺点 共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间&#xff0c;两个进程同时访问这块物理内存&#xff08;共享内存&#xff09;。 1&#xff09;优点 共享内存是进程间通信访问速度最快。 例如消息队列&#xff0c;FIFO&…

【MATLAB源码-第21期】基于matlab的BCH码编码译码仿真,调制使用QPSK,对比编码与未编码的误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QPSK调制解调&#xff1a;QPSK&#xff08;Quadrature Phase Shift Keying&#xff09;调制解调**是一种数字调制技术&#xff0c;通常用于数字通信系统。 调制&#xff1a; 1. 首先&#xff0c;将数字信号分成两路&#xff…

Django创建多app应用

目录 1. 引言 2. 多app创建的两种方式 2.1 多个app结构 2.2 单个apps多个app 3. 最后 1. 引言 在平常业务开发中&#xff0c;我们遇到的功能可能会有很多&#xff0c;单个app的应用可能无法满足我们 这个时候&#xff0c;我们就需要多app应用&#xff0c;例如&#xff1a…

22-应用构建三剑客:Pflag、Viper、Cobra核心功能介绍

如何构建应用框架 想知道如何构建应用框架&#xff0c;首先你要明白&#xff0c;一个应用框架包含哪些部分。在我看来&#xff0c;一个应用框架需要包含以下3个部分&#xff1a; 命令行参数解析&#xff1a;主要用来解析命令行参数&#xff0c;这些命令行参数可以影响命令的运…

【Servlet基础】Servlet项目创建

目录 一、认识Servlet 1.1、认识Tomcat 1.2、Servlet是什么 1.3、Servlet主要工作 二、实现第一个Servlet项目 2.1、创建Maven项目 2.2、引入依赖 2.3、创建目录结构 2.4、编写servlet代码 2.5、打包 2.6、部署 2.7、验证程序 三、利用smart Tomcat插件一键完…

【Frida】【Android】08_爬虫之网络通信库okhttp3

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

【数据结构】AVL 树

文章目录 1. AVL 树的概念2. AVL 树节点的定义3. AVL 树的插入4. AVL 树的旋转5. AVL 树的验证6. AVL 树的删除7. AVL 树的性能 前面对 map / multimap / set / multiset 进行了简单的介绍【C】map & set&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个共同点是…

152 Linux C++ 通讯架构实战7 ,makefile编写改成for cpp,读配置文件,内存泄漏查找,设置标题实战

读写配置文件代码实战。nginx.conf 一个项目要启动&#xff0c;需要配置很多信息&#xff0c;第一项就是学习如何配置一个项目 nginx.conf的内容 #是注释行&#xff0c; #每个有效配置项用 等号 处理&#xff0c;等号前不超过40个字符&#xff0c;等号后不超过400个字符&#…

时序分解 | Matlab实现GSWOA-VMD改进鲸鱼优化算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现GSWOA-VMD改进鲸鱼优化算法优化变分模态分解时间序…

《编程菜鸟学 Python 数据分析》让工作自动化起来!

随着我国企业数字化和信息化的深入&#xff0c;企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式&#xff0c;通过提供强大丰富的库文件包&#xff0c;极大地简化了应用开发过程&#xff0c;降低了技术门槛。Python开发有哪些优势、挑战以及…

NB-IOT——浅谈NB-IOT及模块测试

浅谈NB-IOT及模块基本使用测试 介绍什么是NB-IOT&#xff1f;NB-IOT的特点 使用准备基本使用 总结 介绍 什么是NB-IOT&#xff1f; NB-IoT&#xff0c;即窄带物联网&#xff08;Narrowband Internet of Things&#xff09;&#xff0c;是一种低功耗广域物联网&#xff08;LPW…

Python学习从0到1 day20 第二阶段 面向对象 ② 封装

缘分 朝生暮死犹如露水 —— 24.4.1 学习目标&#xff1a; 1.理解封装的概念 2.掌握私有成员的使用 一、面向对象三大特性&#xff1a; 面向对象编程&#xff0c;是许多编程语言都支持的一种编程思想 简单理解是&#xff1a;基于模板&#xff08;类&#xff09;去创建实体&…

Lua 和 Love 2d 教程 二十一点朴克牌 (上篇lua源码)

GitCode - 开发者的代码家园 Lua版完整原码 规则 庄家和玩家各发两张牌。庄家的第一张牌对玩家是隐藏的。 玩家可以拿牌&#xff08;即拿另一张牌&#xff09;或 停牌&#xff08;即停止拿牌&#xff09;。 如果玩家手牌的总价值超过 21&#xff0c;那么他们就爆掉了。 面牌…

Tulsimer® CH-99硼选择吸附树脂在超纯水除硼领域的卓越应用与优势

超纯水&#xff08;UPW&#xff09;是一种高度纯净的水体形态&#xff0c;通过一系列精密的净化步骤&#xff0c;几乎去除了所有非氢氧成分&#xff0c;包括但不限于微生物、有机污染物及矿物质微量元素。其制备流程涵盖了预处理、反渗透、离子交换、蒸馏、紫外线或超滤等多种高…

成都三环旁的数字影像文创产业园,建设热度高,创新活力足

在成都市金牛区的“九里九园”簇群建设中心区域&#xff0c;一座充满活力的国际数字影像产业园正在崛起。这个成都数字产业园不仅建设热度高涨&#xff0c;更以其创新活力吸引了无数目光。作为数字产业的重要一环&#xff0c;它正在为成都乃至全球的数字文创产业描绘出一幅充满…