Redis相关面试题
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 标明是没有设置过期时间的数据
LRU(Least Recently Used)最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
LFU(Least Frequently Used)最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。
注意:
1、不带allkeys字样的淘汰策略是随机从Redis中选择指定的数量的key然后按照对应的淘汰策略进行删除,带allkeys是对所有的key按照对应的淘汰策略进行删除。
2、缓存淘汰策略常见配置项
maxmemory-policy noeviction # 配置淘汰策略
maxmemory ?mb # 最大可使用内存,即占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上。
maxmemory-samples count # 设置redis需要检查key的个数
使用建议:
- 优先使用 allkeys-lru 策略。充分利用 LRU 算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。
- 如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用 allkeys-random,随机选择淘汰。
- 如果业务中有置顶的需求,可以使用 volatile-lru 策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据。
- 如果业务中有短时高频访问的数据,可以使用 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相关面试题相关推荐
- 【2023】DevOps、SRE、运维开发面试宝典之Redis相关面试题
文章目录 1.redis主从复制原理 2.redis哨兵模式的原理 3.reids集群原理 4.Redis 哈希表进行的触发时机是什么? 5.Redis 的 RDB 和 AOF 机制各自的优缺点是什么 ...
- 含泪整理Redis相关面试题大全
1.什么是redis?redis有哪些优缺点? redis是一个C语言编写的开源的高性能NOSQL键值对数据库吗,支持5种数据类型:字符串,列表,集合,散列表,有序集合.与传统数据库不一样,Redis ...
- 【面试题】8.Redis相关
8.1 Redis基础 8.1.1 Redis与Memorycache的区别? Redis使用单线程,而Memcached是多线程 Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存:M ...
- redis相关知识点讲解,redis面试题
redis相关知识点讲解,redis面试题 1. redis基本知识点 1.1 什么是redis? 1.2 redis的key的设计 1.3 redis的value数据类型有哪些? 1.3.1 str ...
- 小李学知识之redis相关(含redis面试题)
Redis相关学习 1. 简单介绍 2. redis缓存数据的流程 2.1 redis作为缓存的原因 3. redis的基本命令 4. redis支持的五种数据结构以及相关命令 4.1 String ...
- 收集Redis 经典面试题
本文的面试题如下: Redis 持久化机制 缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 ...
- Redis经典面试题
本文分享一些Redis相关的经典面试题,看下你是不是都掌握了. 文章目录 Redis Redis redis优化策略 redis除了做缓存还能做什么? 说说redis持久化方式?分别优缺点是什么?re ...
- 大厂面试 Mysql数据库相关面试题总结
1.列举常见的关系型数据库和非关系型都有那些? 关系型数据库:Oracle.DB2.Microsoft SQL Server.Microsoft Access.MySQL 非关系型数据库:NoSql. ...
- 2022年Redis最新面试题
2022年Redis最新面试题 一.Redis基础知识 1.什么是 Redis, 有哪些优缺点? 2.Redis 最适合的场景, 可以简单的说说吗? 3.Redis 相比 Memcached 有哪些优 ...
- Redis常见面试题汇总
Redis 接下来内容概述: 安装redis6.0.8 redis传统五大数据类型的落地应用 知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的理解,删key的时候有什么问题? redis缓 ...
最新文章
- 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc
- JavaScript一步一步:JavaScript 对象和HTML DOM 对象
- html前端登录验证码,前端登录页面开发_js生成验证码并验证
- 单脉冲雷达的相干干扰的研究文章_什么是量子纠缠和量子退相干?这个比喻太绝了!...
- 3005-基于二叉链表的二叉树最大宽度的计算(附思路,注释,可能错误分析)
- 数据库-MySQL-数据库设计-外键
- SpringCloud分布式开发五大神兽
- 回车,换行,转义字符“\r”,“\n”是什么关系?
- Python入门--python中的global
- Android文本输入框EditText方法说明和属性
- 显示器屏幕的刷新率hz和帧数fps有什么区别?
- rem适配的浏览器_[史上最全]UI相关尺寸单位详解 | px、pt、dp、sp、rem、vwvh、rpx、ppi、dpi、dppx...
- BZOJ2157旅游——树链剖分+线段树
- Anaconda的安装与基本使用
- make_heap(), pop_heap(), push_heap()用法
- 从0到100:基于微信小程序的羽毛球馆预约系统的开发笔记
- 每日一书丨金融反欺诈的底层逻辑
- Android应用切换皮肤功能实现
- 【网络】能远程电脑,但ping不通
- 【Gitee + Hexo】从0开始搭建自己的博客网站
热门文章
- [转]出现蓝屏代码stop ** 0x000000a5(0x00000001,0x89758d98,0x000000000,0x00000000)
- 我的世界里 有你还不知道的秘密 边走边学习 且行且珍惜吧
- 图像直方图及其均衡化--opencv
- gitter 卸载_最佳Gitter频道:数学
- crypto-js 加密解密 (TS版本)
- Ftp搜索引擎开发实践
- 计算机超链接文档顶端,电脑在Word文档里插入目录超链接的方法
- 基于51单片机的简易计算器proteus仿真 数码管显示
- 如何将IE浏览器设置为默认浏览器
- vue中好用的视频插件推荐,video+canvas实现视频截图第一帧,ffmpeg实现视频截图第一帧