redis相关的一些面试题?

1.什么是缓存穿透,什么是缓存雪崩,什么是缓存击穿?

缓存穿透:假如某一时刻访问redis的大量key都在redis中不存在(比如黑客故意伪造一些乱七八糟的key),那么也会给数据造成压力,这就是缓存穿透,解决方案是使用布隆过滤器,它的作用就是如果它认为一个key不存在,那么这个key就肯定不存在,所以可以在缓存之前加一层布隆过滤器来拦截不存在的key

缓存击穿:和缓存雪崩类似,缓存雪崩是大批热点数据失效,而缓存击穿是指某一个热点key突然失效,也导致了大量请求直接访问Mysql数据库,这就是缓存击穿,解决方案就是考虑这个热点key不设过期时间

缓存雪崩:如果缓存中某一时刻大批热点数据同时过期,那么就可能导致大量请求直接访问Mysql了,解决办法就是在过期时间上增加一点随机值,另外如果搭建一个高可用的Redis集群也是防止缓存雪崩的有效手段

2.redis怎么设置key的过期时间?

(1)分开设置

// 两条命令分别设置值和过期时间

// 时间单位:秒

redis.expire("key",6);

// 时间单位:毫秒

//redis.pexpire("key",6000L)

(2)合并设置

一条命令同时设置值和过期时间,推荐使用此方式。

// 一条语句设置值和过期时间

// 时间单位:秒

redis.setex("key",6,"value");

// 时间单位:毫秒

//redis.psetex("key",6000L,"value")

3.redis怎么删除过期时间

(1)定期删除

当放入数据后,设置一个定时器,当定时器读秒完毕后,将对应的数据从dict中删除。

优点: 内存友好,数据一旦过期就会被删除

缺点: CPU不友好,定时器耗费CPU资源,并且频繁的执行清理操作也会耗费CPU资源。

用时间换空间

定期删除可以通过:第一、配置redis.conf 的hz选项,默认为10 (即1秒执行10次,100ms一次,值越大说明刷新频率越快,最Redis性能损耗也越大) 第二、配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时,就会触发主动清理策略

(2)懒汉式删除

当数据过期的时候,不做任何操作。当访问数据的时候,查看数据是否过期,如果过期返回null,并且将数据从内存中清除。如果没过期,就直接返回数据。

优点: CPU友好,数据等到过期并且被访问的时候,才会删除。

缺点: 内存不友好,会占用大量内存。

4.redis为什么读取速度比较快

(一)纯内存操作,避免大量访问数据库,减少直接读取磁盘数据,redis将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快;

(二)单线程操作,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

(三)采用了非阻塞I/O多路复用机制 用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。这样用户可以注册多个socket,然后不断地调用select读取被激活的socket,redis服务端将这些socke置于队列中,然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中,提高读取效率。

相关推荐
CodeHackerBhx17 小时前
Spring Boot 4 防重复提交:从接口幂等到 Redis 分布式锁的完整实践
java·数据库·spring boot·redis·分布式
凌虚17 小时前
Kubernetes 编年史:从 Borg 到云原生操作系统
后端·程序员·kubernetes
xlxxy_17 小时前
外部系统调用SAP接口遇到的一些报错
开发语言·数据库·sap·abap
麦聪聊数据17 小时前
连锁零售全域数据管控(下):API 化服务输出,释放全域数据业务价值
数据库
郝亚军17 小时前
FE1.1S-BQFN24BT可以指定IP端口吗?
开发语言·php
就改了17 小时前
Docker安装并运行Redis
redis·docker·容器
SelectDB17 小时前
金城银行基于 Apache Doris 构建实时数据平台:T+1 到分钟级的金融级实践
后端
奇树谦17 小时前
NAS + 对象存储 + LMDB/HDF5:海量小文件存储最佳实践
数据库
Csvn18 小时前
📊 SQL 入门 Day 13:窗口函数进阶
后端·sql
卷无止境18 小时前
拯救乱码方块:pandas 绘图中文字体的一揽子解决方案
后端·python