Redis相关面试题

1.数据类型

1.Redis的常用数据类型有哪些 ?

难易程度:☆☆☆

出现频率:☆☆☆☆☆

1、 string

常见命令:set、get、decr、incr、mget等。

基本特点:string数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。

应用场景:常规计数:微博数,粉丝数等。

2、hash

常用命令: hget、hset、hgetall等。

基本特点:hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。

应用场景:存储用户信息,商品信息等。

3、list

常用命令: lpush、rpush、lpop、rpop、lrange等。

基本特点:类似于Java中的list可以存储多个数据,并且数据可以重复,而且数据是有序的。

应用场景:存储微博的关注列表,粉丝列表等。

4、set

常用命令: sadd、spop、smembers、sunion 等

基本特点:类似于Java中的set集合可以存储多个数据,数据不可以重复,使用set集合不可以保证数据的有序性。

应用场景:可以利用Redis的集合计算功能,实现微博系统中的共同粉丝、公告关注的用户列表计算。

5、sorted set

常用命令: zadd、zrange、zrem、zcard 等。

基本特点:和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。

应用场景:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜等。

2.跳表你了解吗?

难易程度:☆☆☆☆

出现频率:☆☆☆

跳表(SkipList)首先是链表,但与传统的链表相比有几点差异:

  • 跳表结合了链表和二分查找的思想

  • 元素按照升序排列存储

  • 节点可能包含多个指针,指针跨度不同

  • 查找时从顶层向下,不断缩小搜索范围

  • 整个查询的复杂度为 O ( log ⁡ n )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tu1QD0xr-1663995699266)(Redis相关面试题.assets/image-20220825104355442.png)]

Redis数据类型Sorted Set使用了跳表作为其中一种数据结构

2.持久化

Redis的数据持久化策略有哪些 ?

难易程度:☆☆☆

出现频率:☆☆☆☆

在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF

RDB:

定期更新,定期将Redis中的数据生成的快照同步到磁盘等介质上,磁盘上保存的就是Redis的内存快照

优点:数据文件的大小相比于aop较小,使用rdb进行数据恢复速度较快

缺点:比较耗时,存在丢失数据的风险

AOF:

将Redis所执行过的所有指令都记录下来,在下次Redis重启时,只需要执行指令就可以了

优点:数据丢失的风险大大降低了

缺点:数据文件的大小相比于rdb较大,使用aop文件进行数据恢复的时候速度较慢

你们的项目中的持久化是如何配置选择的?

RDB+AOF

3.主从和集群

3.1 Redis集群有哪些方案, 知道嘛 ?

难易程度:☆☆☆

出现频率:☆☆☆☆

在Redis中提供的集群方案总共有三种:

1、主从复制

  • 保证高可用性
  • 实现故障转移需要手动实现
  • 无法实现海量数据存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MK4fSgKX-1663995699267)(Redis相关面试题.assets/image-20220825235753402.png)]

2、哨兵模式

  • 保证高可用性
  • 可以实现自动化的故障转移
  • 无法实现海量数据存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0xdrVFX9-1663995699267)(Redis相关面试题.assets/image-20220825235832242.png)]

3、Redis分片集群

  • 保证高可用性
  • 可以实现自动化的故障转移
  • 可以实现海量数据存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wkBZdJzw-1663995699268)(Redis相关面试题.assets/image-20220825235913828.png)]

3.2 什么是 Redis 主从同步?

难易程度:☆☆☆☆

出现频率:☆☆☆☆

主从第一次同步是全量同步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QCndZvnP-1663995699269)(Redis相关面试题.assets/image-20220826000009625.png)]

第一阶段,全量同步流程

1.主节点先去请求从节点,获取从节点id

2.判断主节点的id与与从节点的id是否一致

3.如果不一致,则主节点给从节点返回主节点的id。让主从的id保持一致

4.信息同步后,主节点执行bgsave,生成rdb文件

5.主节点给从节点同步rdb文件,从节点清空自己的数据,加载rdb文件

6.在第5步执行的过程中,主节点有可能会有新的操作,需要记录到一个日志文件中(repl_baklog),发送给从节点,进行增量同步

后期数据变化后,则执行增量同步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UeFcoblO-1663995699270)(Redis相关面试题.assets/image-20220826000106137.png)]

repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步。

repl_baklog可以在配置文件中进行修改存储大小

3.3 你们使用Redis是单点还是集群 ? 哪种集群 ?(说说你们生产环境redis部署情况?)

难易程度:☆☆☆

出现频率:☆☆☆

  • 通常情况下:主从(3台)+哨兵(3台),可以满足一般的需求

    • 一般的企业中redis存储超过100GB就是极少见的,一般只存热点数据
    • 极端情况下,可以设置较大的内存。以阿里云为主,购买内存型服务器,目前最大的为:2048GB

    https://www.aliyun.com/product/ebm?spm=5176.19720258.J_2686872250.8.328576f4mDkIu9&scm=20140722.M_4603843.P_156.MO_871-ID_4603843-MID_4603843-CID_545-ST_5018-V_1

  • 超高容量:集群模式

    • Redis集群支持最大节点数是 16384 个。原因: Redis 集群有 16384 个哈希槽
    • 可以根据业务量追加服务器

3.4 Redis分片集群中数据是怎么存储和读取的 ?

难易程度:☆☆☆

出现频率:☆☆☆

Redis 集群引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nX9tmtLB-1663995699270)(Redis相关面试题.assets/Redis集群Hash槽.jpg)]

上图是存值的流程,取值的流程类似

set {aaa}name zhangsan 计算hash是根据aa计算的

3.5 redis集群脑裂?

难易程度:☆☆☆☆

出现频率:☆☆☆

关于reids集群会由于网络等原因出现脑裂的情况,所谓的集群脑裂就是,由于redis master节点和redis salve节点和sentinel处于不同的网络分区,使得sentinel没有能够心跳感知到master,所以通过选举的方式提升了一个salve为master,这样就存在了两个master,就像大脑分裂了一样,这样会导致客户端还在old master那里写入数据,新节点无法同步数据,当网络恢复后,sentinel会将old master降为salve,这时再从新master同步数据,这会导致大量数据丢失。

正常情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnVGzFCp-1663995699271)(Redis相关面试题.assets/image-20220826005227824.png)]

脑裂情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HB54ztNK-1663995699271)(Redis相关面试题.assets/image-20220826005755464.png)]

当哨兵与主节点由于网络抖动原因断开了链接,哨兵监控到之后,则会从剩余的从节点中选出一个作为主节点

redis的客户端这个时候并没有是可以正常链接之前的maser(主节点),并且可以正常写入数据

假如现在网络恢复了,哨兵发现主从中有两个主节点,则会强制一个主节点变为从节点,看下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YBBQ2dtr-1663995699272)(Redis相关面试题.assets/image-20220826010517578.png)]

由于原来的主节点变成了从节点,则需要执行主从同步流程,清理数据(之前的主节点),同步新主节点中的数据,在之前脑裂过程中,客户端写入的数据丢失

解决方案:

redis中有两个配置参数:

  • min-replicas-to-write 1 表示最少的salve节点为1个

  • min-replicas-max-lag 5 表示数据复制和同步的延迟不能超过5秒

配置了这两个参数:如果发生脑裂:原master会在客户端写入操作的时候拒绝请求。这样可以避免大量数据丢失。

3.6 怎么保证redis的高并发高可用

难易程度:☆☆☆

出现频率:☆☆☆

  • 主从+哨兵

  • 集群

4.使用场景

4.1 项目中哪块使用了缓存?

难易程度:☆☆☆

出现频率:☆☆☆☆☆

结合自己简历上写的项目模块说明这个问题,要陈述出当时的场景

黑马头条:

  • 用户行为数据
  • 延迟队列实现
  • 热点文章
  • 集群情况下定时任务(分布式锁)

立可得项目:

  • 工单排行榜
  • 下单(分布式锁)

4.2 什么是缓存穿透 ? 怎么解决 ?

难易程度:☆☆☆☆

出现频率:☆☆☆☆☆

加入缓存以后的数据查询流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6g0ACYcz-1663995699272)(Redis相关面试题.assets/image-20220505084631909.png)]

缓存穿透

概述:指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。

get请求:api/v1/news/13

解决方案:

1、查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短

2、布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询

4.3 什么是缓存击穿 ? 怎么解决 ?

难易程度:☆☆☆☆

出现频率:☆☆☆☆☆

概述:对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。

解决方案:

1、使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法

2、永远不过期:不要对这个key设置过期时间

4.4 什么是缓存雪崩 ? 怎么解决 ?

难易程度:☆☆☆☆

出现频率:☆☆☆☆☆

概述:设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存。

解决方案:

将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

4.5 什么是布隆过滤器?

难易程度:☆☆☆☆

出现频率:☆☆☆☆☆

概述:布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上由一个很长的二进制向量(二进制数组)和一系列随机映射函数(hash函数)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tIKvo41y-1663995699272)(Redis相关面试题.assets/image-20220505124612288.png)]

作用:布隆过滤器可以用于检索一个元素是否在一个集合中。

添加元素:将商品的id(id1)存储到布隆过滤器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DHHMuKD1-1663995699273)(Redis相关面试题.assets/image-20220505125247251.png)]

假设当前的布隆过滤器中提供了三个hash函数,此时就使用三个hash函数对id1进行哈希运算,运算结果分别为:1、4、9那么就会数组中对应的位置数据更改为1

判断数据是否存在:使用相同的hash函数对数据进行哈希运算,得到哈希值。然后判断该哈希值所对应的数组位置是否都为1,如果不都是则说明该数据肯定不存在。如果是说明该数据可能存在,因为哈希运算可能就会存在重复的情况。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQqAFUKz-1663995699273)(Redis相关面试题.assets/image-20220505130720532.png)]

假设添加完id1和id2数据以后,布隆过滤器中数据的存储方式如上图所示,那么此时要判断id3对应的数据在布隆过滤器中是否存在,按照上述的判断规则应该是存在,但是id3这个数据在布隆过滤器中压根就不存在,这种情况就属于误判。

误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时带来了更多的内存消耗。

删除元素:布隆布隆器不支持数据的删除操作,因为如果支持删除那么此时就会影响判断不存在的结果。

使用布隆过滤器:在谷歌的guava缓存工具中提供了布隆过滤器的实现,使用方式如下所示:

pom.xml文件

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version>
</dependency>

测试代码:

// 创建一个BloomFilter对象
// 第一个参数:布隆过滤器判断的元素的类型
// 第二个参数:布隆过滤器存储的元素个数
// 第三个参数:误判率,默认值为0.03
int size = 100_000 ;
BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), size, 0.03);
for(int x = 0 ; x < size ; x++) {bloomFilter.put("add" + x) ;
}// 在向其中添加100000个数据测试误判率
int count = 0 ;     // 记录误判的数据条数
for(int x = size ; x < size * 2 ; x++) {if(bloomFilter.mightContain("add" + x)) {count++ ;System.out.println(count + "误判了");}
}// 输出
System.out.println("总的误判条数为:" + count);

Redis中使用布隆过滤器防止缓存穿透流程图如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdqTWofr-1663995699274)(Redis相关面试题.assets/image-20220505134107303.png)]

4.6 redis双写问题?

难易程度:☆☆☆

出现频率:☆☆☆☆☆

同步方案:更改代码业务代码,加入同步操作缓存逻辑的代码(数据库操作完毕以后,同步操作缓存)

异步方案:

1、使用消息队列进行缓存同步:更改代码加入异步操作缓存的逻辑代码(数据库操作完毕以后,将要同步的数据发送到MQ中,MQ的消费者从MQ中获取数据,然后更新缓存)

2、使用阿里巴巴旗下的canal组件实现数据同步:不需要更改业务代码,部署一个canal服务。canal服务把自己伪装成mysql的一个从节点,当mysql数据更新以后,canal会读取binlog数据,然后在通过canal的客户端获取到数据,更新缓存即可。

使用缓存

​ 查询redis

​ 没有则查库,同时把数据同步到redis

​ 写操作

​ 先删除redis的数据,再更新数据库

5 Redis分布式锁

5.1 Redis分布式锁如何实现 ?

难易程度:☆☆☆

出现频率:☆☆☆☆☆

Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则 SET)的简写。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UxHRInKo-1663995699274)(Redis相关面试题.assets/image-20220825225528939.png)]

上面这几个命令就是最基本的用来完成分布式锁的命令。

加锁:使用setnx key value命令,如果key不存在,设置value(加锁成功)。如果已经存在lock(也就是有客户端持有锁了),则设置失败(加锁失败)。

解锁:使用del命令,通过删除键值释放锁。释放锁之后,其他客户端可以通过setnx命令进行加锁。

/*** 加锁* @param name* @param expire* @return*/
public String tryLock(String name, long expire) {name = name + "_lock";String token = UUID.randomUUID().toString();RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();RedisConnection conn = factory.getConnection();try {//参考redis命令://set key value [EX seconds] [PX milliseconds] [NX|XX]Boolean result = conn.set(name.getBytes(),token.getBytes(),Expiration.from(expire, TimeUnit.MILLISECONDS),RedisStringCommands.SetOption.SET_IF_ABSENT //NX);if (result != null && result)return token;} finally {RedisConnectionUtils.releaseConnection(conn, factory,false);}return null;
}

5.2 Redis实现分布式锁如何合理的控制锁的有效时长?

难易程度:☆☆☆☆

出现频率:☆☆☆☆☆

有效时间设置多长,假如我的业务操作比有效时间长?我的业务代码还没执行完就自动给我解锁了,不就完蛋了吗。

解决方案:

1、第一种:程序员自己去把握,预估一下业务代码需要执行的时间,然后设置有效期时间比执行时间长一些,保证不会因为自动解锁影响到客户端业务代码的执行。

2、第二种:给锁续期。

锁续期实现思路:当加锁成功后,同时开启守护线程,默认有效期是用户所设置的,然后每隔10秒就会给锁续期到用户所设置的有效期,只要持有锁的客户端没有宕机,就能保证一直持有锁,直到业务代码执行完毕由客户端自己解锁,如果宕机了自然就在有效期失效后自动解锁。

上述的第二种解决方案可以使用redis官方所提供的Redisson进行实现。

使用步骤如下:

1、加入依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version>
</dependency>

2、定义配置类

@Configuration
public class RedisConfig {@Beanpublic RedissonClient redissonClient(){Config config = new Config();config.useSingleServer().setAddress("redis://192.168.200.130:6379").setPassword("leadnews");return Redisson.create(config);}
}

3、业务代码加入分布式锁

public void redisLock() throws InterruptedException {RLock lock = redissonClient.getLock("anyLock");try {//第一个参数30s:表示尝试获取分布式锁,并且最大的等待获取锁的时间为30s//第二个参数10s:表示上锁之后,10s内操作完毕将自动释放锁boolean isLock = lock.tryLock(30, 10, TimeUnit.SECONDS);String num = redisTemplate.opsForValue().get("num");Integer intNum = Integer.parseInt(num);if (intNum == null || intNum <= 0) {throw new RuntimeException("商品已抢完");}if(isLock){intNum = intNum - 1;redisTemplate.opsForValue().set("num", intNum.toString());System.out.println(redisTemplate.opsForValue().get("num"));}} finally {//释放锁lock.unlock();}}

4、Jmeter测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvQed6o5-1663995699275)(Redis相关面试题.assets/image-20220825230303894.png)]

5.Redisson分布式锁原理(重要)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWodkmo4-1663995699275)(Redis相关面试题.assets/image-20220825230509879.png)]

redisson实现的分布式锁是可重入的

public void add1(){boolean isLock = lock.tryLock(30, 10, TimeUnit.SECONDS);//执行业务add2();//释放锁lock.unlock();}public void add2(){boolean isLock = lock.tryLock(30, 10, TimeUnit.SECONDS);//执行业务//释放锁lock.unlock();}

5.3 你的项目中哪里用到了分布式锁 ?

难易程度:☆☆☆

出现频率:☆☆☆☆

黑马头条:

  • 集群情况下定时任务(分布式锁)

立可得项目:

  • 下单(分布式锁)

其他情况:

  • 秒杀
  • 幂等性场景

6.其他

6.1 Redis的数据过期策略有哪些 ?

难易程度:☆☆☆

出现频率:☆☆☆☆

数据删除策略:Redis中可以对数据设置数据的有效时间,数据的有效时间到了以后,就需要将数据从内存中删除掉。而删除的时候就需要按照指定的规则进行删除,这种删除规则就被称之为数据的删除策略。

Redis中数据的删除策略:

① 惰性删除

概述:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。

  • 优点:对CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。
  • 缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。

set name zhangsan 10

get name

② 定期删除

概述:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键)。

  • 优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

  • 缺点:难以确定删除操作执行的时长和频率。

    如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。

另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用定期删除函数的运行频率,

在Redis2.6版本中,规定每秒运行10次,大概100ms运行一次。在Redis2.8版本后,可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数。

6.2 Redis的数据淘汰策略有哪些 ?

难易程度:☆☆☆

出现频率:☆☆☆☆

数据的淘汰策略:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

常见的数据淘汰策略:

noeviction                           # 不删除任何数据,内存不足直接报错(默认策略)
volatile-lru                        # 挑选最近最久使用的数据淘汰(举例:key1是在3s之前访问的, key2是在9s之前访问的,删除的就是key2)
volatile-lfu                        # 挑选最近最少使用数据淘汰  (举例:key1最近5s访问了4次, key2最近5s访问了9次, 删除的就是key1)
volatile-ttl                        # 挑选将要过期的数据淘汰
volatile-random                     # 任意选择数据淘汰
allkeys-lru                         # 挑选最近最少使用的数据淘汰
allkeys-lfu                         # 挑选最近使用次数最少的数据淘汰
allkeys-random                      # 任意选择数据淘汰,相当于随机
  • volatile 标明是设置了过期时间的数据

  • allkeys 标明是没有设置过期时间的数据

  • LRULeast Recently Used)最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

  • LFULeast Frequently Used)最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

注意:

1、不带allkeys字样的淘汰策略是随机从Redis中选择指定的数量的key然后按照对应的淘汰策略进行删除,带allkeys是对所有的key按照对应的淘汰策略进行删除。

2、缓存淘汰策略常见配置项

maxmemory-policy noeviction          # 配置淘汰策略
maxmemory ?mb                       # 最大可使用内存,即占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上。
maxmemory-samples count             # 设置redis需要检查key的个数

使用建议:

  1. 优先使用 allkeys-lru 策略。充分利用 LRU 算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。
  2. 如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用 allkeys-random,随机选择淘汰。
  3. 如果业务中有置顶的需求,可以使用 volatile-lru 策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据。
  4. 如果业务中有短时高频访问的数据,可以使用 allkeys-lfu 或 volatile-lfu 策略。

6.3 数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?

难易程度:☆☆☆

出现频率:☆☆☆

使用 allkeys-lru 淘汰策略

6.4 Redis的内存用完了会发生什么?

难易程度:☆☆☆

出现频率:☆☆☆

主要看数据淘汰策略是什么?如果是默认的配置,则直接报错

6.5 你们用过Redis的事务吗 ? 事务的命令有哪些 ?

难易程度:☆☆☆☆

出现频率:☆☆

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

Redis中的事务:Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

总结说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。Reids中,单条命令式原子性执行的,但事务不保证原子性,且没有回滚。

事务相关的命令:

1、MULTI:用来组装一个事务

2、EXEC:执行一个事物

3、DISCARD:取消一个事务

4、WATCH:用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行

5、UNWATCH:取消 WATCH 命令对所有key的监视

如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SdMUXeyp-1663995699276)(Redis相关面试题.assets/image-20220225132328333.png)]

6.6 Redis是单线的,但是为什么还那么快?

难易程度:☆☆☆

出现频率:☆☆☆☆

Redis总体快的原因:

1、完全基于内存的,C语言编写

2、采用单线程,避免不必要的上下文切换可竞争条件

3、数据简单,数据操作也相对简单

4、使用多路I/O复用模型,非阻塞IO

​ bgsave 在后台执行rdb的保存,不影响主线程的正常使用,不会产生阻塞

​ bgrewriteaof 在后台执行aof文件的保存,不影响主线程的正常使用,不会产生阻塞

s的事务吗 ? 事务的命令有哪些 ?

难易程度:☆☆☆☆

出现频率:☆☆

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

Redis中的事务:Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

总结说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。Reids中,单条命令式原子性执行的,但事务不保证原子性,且没有回滚。

事务相关的命令:

1、MULTI:用来组装一个事务

2、EXEC:执行一个事物

3、DISCARD:取消一个事务

4、WATCH:用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行

5、UNWATCH:取消 WATCH 命令对所有key的监视

如下所示:

[外链图片转存中…(img-SdMUXeyp-1663995699276)]

6.6 Redis是单线的,但是为什么还那么快?

难易程度:☆☆☆

出现频率:☆☆☆☆

Redis总体快的原因:

1、完全基于内存的,C语言编写

2、采用单线程,避免不必要的上下文切换可竞争条件

3、数据简单,数据操作也相对简单

4、使用多路I/O复用模型,非阻塞IO

​ bgsave 在后台执行rdb的保存,不影响主线程的正常使用,不会产生阻塞

​ bgrewriteaof 在后台执行aof文件的保存,不影响主线程的正常使用,不会产生阻塞

Redis相关面试题相关推荐

  1. 【2023】DevOps、SRE、运维开发面试宝典之Redis相关面试题

    文章目录 1.redis主从复制原理 2.redis哨兵模式的原理 3.reids集群原理 4.Redis 哈希表进行的触发时机是什么? 5.Redis 的 RDB 和 AOF 机制各自的优缺点是什么 ...

  2. 含泪整理Redis相关面试题大全

    1.什么是redis?redis有哪些优缺点? redis是一个C语言编写的开源的高性能NOSQL键值对数据库吗,支持5种数据类型:字符串,列表,集合,散列表,有序集合.与传统数据库不一样,Redis ...

  3. 【面试题】8.Redis相关

    8.1 Redis基础 8.1.1 Redis与Memorycache的区别? Redis使用单线程,而Memcached是多线程 Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存:M ...

  4. redis相关知识点讲解,redis面试题

    redis相关知识点讲解,redis面试题 1. redis基本知识点 1.1 什么是redis? 1.2 redis的key的设计 1.3 redis的value数据类型有哪些? 1.3.1 str ...

  5. 小李学知识之redis相关(含redis面试题)

    Redis相关学习 1. 简单介绍 2. redis缓存数据的流程 2.1 redis作为缓存的原因 3. redis的基本命令 4. redis支持的五种数据结构以及相关命令 4.1 String ...

  6. 收集Redis 经典面试题

    本文的面试题如下: Redis 持久化机制 缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 ...

  7. Redis经典面试题

    本文分享一些Redis相关的经典面试题,看下你是不是都掌握了. 文章目录 Redis Redis redis优化策略 redis除了做缓存还能做什么? 说说redis持久化方式?分别优缺点是什么?re ...

  8. 大厂面试 Mysql数据库相关面试题总结

    1.列举常见的关系型数据库和非关系型都有那些? 关系型数据库:Oracle.DB2.Microsoft SQL Server.Microsoft Access.MySQL 非关系型数据库:NoSql. ...

  9. 2022年Redis最新面试题

    2022年Redis最新面试题 一.Redis基础知识 1.什么是 Redis, 有哪些优缺点? 2.Redis 最适合的场景, 可以简单的说说吗? 3.Redis 相比 Memcached 有哪些优 ...

  10. Redis常见面试题汇总

    Redis 接下来内容概述: 安装redis6.0.8 redis传统五大数据类型的落地应用 知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的理解,删key的时候有什么问题? redis缓 ...

最新文章

  1. 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc
  2. JavaScript一步一步:JavaScript 对象和HTML DOM 对象
  3. html前端登录验证码,前端登录页面开发_js生成验证码并验证
  4. 单脉冲雷达的相干干扰的研究文章_什么是量子纠缠和量子退相干?这个比喻太绝了!...
  5. 3005-基于二叉链表的二叉树最大宽度的计算(附思路,注释,可能错误分析)
  6. 数据库-MySQL-数据库设计-外键
  7. SpringCloud分布式开发五大神兽
  8. 回车,换行,转义字符“\r”,“\n”是什么关系?
  9. Python入门--python中的global
  10. Android文本输入框EditText方法说明和属性
  11. 显示器屏幕的刷新率hz和帧数fps有什么区别?
  12. rem适配的浏览器_[史上最全]UI相关尺寸单位详解 | px、pt、dp、sp、rem、vwvh、rpx、ppi、dpi、dppx...
  13. BZOJ2157旅游——树链剖分+线段树
  14. Anaconda的安装与基本使用
  15. make_heap(), pop_heap(), push_heap()用法
  16. 从0到100:基于微信小程序的羽毛球馆预约系统的开发笔记
  17. 每日一书丨金融反欺诈的底层逻辑
  18. Android应用切换皮肤功能实现
  19. 【网络】能远程电脑,但ping不通
  20. 【Gitee + Hexo】从0开始搭建自己的博客网站

热门文章

  1. [转]出现蓝屏代码stop ** 0x000000a5(0x00000001,0x89758d98,0x000000000,0x00000000)
  2. 我的世界里 有你还不知道的秘密 边走边学习 且行且珍惜吧
  3. 图像直方图及其均衡化--opencv
  4. gitter 卸载_最佳Gitter频道:数学
  5. crypto-js 加密解密 (TS版本)
  6. Ftp搜索引擎开发实践
  7. 计算机超链接文档顶端,电脑在Word文档里插入目录超链接的方法
  8. 基于51单片机的简易计算器proteus仿真 数码管显示
  9. 如何将IE浏览器设置为默认浏览器
  10. vue中好用的视频插件推荐,video+canvas实现视频截图第一帧,ffmpeg实现视频截图第一帧