Redis常用面试题

news2024/9/23 17:15:10

Redis为什么执行这么快?

1.基于内存存储实现。

我们都知道内存读写比在磁盘快很多的,Redis基于内存储存实现的数据。相对于数据库存在磁盘的MySql数据库,剩余磁盘I/O的消耗

2.redis是单线程模型的,而单线程避免了CPU不必要的上下文切换和竞争锁的消耗。也正是因为单线程,如果某个命令执行过长如 keys,hgetall命令。会造成阻塞。

3.虚拟内存机机制

Redis直接构建了VM机制。不会像一般的系统调用系统函数处理,会浪费一定的时间去移动和请求。(备注:Redis的虚拟内存机制是啥? 虚拟内存机制就是暂时把不经常访问的数据从 内存交换到磁盘中,从而腾出宝贵的空间用于需要访问呢的数据(热数据))。通过VM功能可以实现冷热数据分离,是热数据人在内存中,冷数据保存在磁盘中,这样就 避免因为内存不足而造成访问数据下降的问题。

说说Redis的基本数据类型。

Redis常用的五种基本类型。

String(字符串),Hash(哈希),List(列表),Set(集合),Zset(排序集合)

String(字符串)

String字符串是Redis最基础的数据结构类型,他是二进制安全的,可以储存图片和序列化对象,最大值储存之512M.

简单使用举例:set key value, get key 等

使用场景:共享session,技术器,限流。

Hash(哈希)

简介:在Redis中。哈希类型是v(值)本身就是一个键值对(k-v)结构

简单使用举列:hset key field value,hget key field

应用场景:缓存用户信息等。

注意:如果开发使用 hgetall,哈希元素比较多的话,可能导致Redis阻塞,可以使用hscan.

List(列表)

简介:list类型用于储存多个有序的字符串,一个列表最多可以存储2^32-1个元素

应用场景:消息队列,文章队列

Set(集合)

简介:集合(Set)类型也是用于保存多个的字符串元素,但是不允许重复元素

简单使用举例:sadd key element [element ...]、smembers key

注意点:smembers和 lrange、hgetall 都数据比较中的命令,如果元素过多存在阻塞 Redis的可能,可以使用sscan 来完成。

应用场景: 用户标签,生成随机数抽奖,社交需求

有序集合(zset)

简介:已排序的字符串集合,同时元素不能重复

使用场景:积分排行榜,用户点赞排行榜。

什么是缓存击穿、缓存穿透、缓存雪崩?

先来看一个常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没有命中,就去查询数据库,然后把数据库的值更新到缓存,在返回。

缓存穿透:指的是 查询一个一定不存在的数据,由于缓存是不命中需要去数据库,导致这个不存在的数据每次请求都要到数据库查询,从而给数据库带来压力。

通俗点:读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就缓存穿透。

缓存穿透一般都是这几中情况产生的:

业务/运维/开发 事务的操作,比如缓存和数据库的数据都被误删了。

客户非法请求攻击,比如客户故意捏造大量非法请求,读取不存在的业务数据。

解决方案:

1.缓存空对象。

指的是在持久层没有命中的情况下,对key进行set(key,null)。尽管这种垃圾浪费了一些 内存空间,在redis内存空间优先的前提时,会影响其他热点key的命中率,所以,比较有效的的方法时正对这类数据设计一个较短的ttl,让其自动删除

2.布隆过滤器拦截。

在访问缓存层和持久层前,将存在的key用布隆过滤器提前保存起来,做第一层拦截,当收到一个对key请求时先用布控过滤器验证key是否存在。如果存在进入缓存层、持久层。

{对于布隆过滤器的理解:布隆过滤器实际就是一个很长的二进制向量和一些列随机函数。布隆过滤器就是用于检查一个元素是否在一个集合中}。

  他的优点就是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

缓存击穿:

当前key是一个热点key(列如一个秒杀活动),并发量很大。在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用奔溃。

解决方案:

分布式互斥锁,其他线程等待 重建缓存的线程执行完毕后,重新从从缓存获取即可。

 

缓存雪崩问题:

缓存雪崩:指的缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据数据库压力过大甚至down机。

可以分析用户行为,尽量让失效时间点均匀分布。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。

做二级缓存,或者双缓存策略:
      采用多级缓存,本地进程作为一级缓存,redis作为二级缓存,不同级别的缓存设置的超时时间不同,即使某级缓存过期了,也有其他级别缓存兜底

如何保证redis 和MySQL数据的一致性。

读取binlog后分析,利用消息队列,推送更新各台的redis缓存数据。

这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。

其实这种机制,很类似MySQL的主从备份机制,因为MySQL的主备也是通过binlog来实现的数据一致性。

这里可以结合使用canal(阿里的一款开源框架),通过该框架可以对MySQL的binlog进行订阅,而canal正是模仿了mysql的slave数据库的备份请求,使得Redis的数据更新达到了相同的效果。

Redis 的持久化机制有哪些?优缺点说说

Redis是基于内存的非关系K-V数据库,既然他是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避开数据丢失,Redis提供了持久化,就是把数据保存到磁盘。

Redis提供了RDB和AOF 两种持久化机制,它持久化文件加载流程如下:

RDB ,就是内存数据以快照的形式保存到磁盘上。

RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis 默认的持久化方式。执行完操作后,会在指定目录下生成一个dump.rdb文件,Redis重启的时候,通过加载dump.rdb文件来恢复数据。

RDB的优点:

适合大规模的数据回复场景,如备份,全量复制等。

RDB缺点:

没办法做到实时 秒级持久化。

AOF(append only file)持久化,采用日志的形式 来记录每个写的操作,追加到文件中,重启时重新执行AOF文件中的命令 来回复数据。它主要解决数据持久化实时性问题。默认时不开启的。

AOF的优点:

数据的一致性和完整性更高。

AOF的缺点:

AOF记录的内容越多,文件越大,数据恢复变慢

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

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

相关文章

Python 导入引用其他文件的函数(不断更新)

文章目录 构造初始化文件结构,以此为例。【1】导入同目录且同级下其他文件的函数(c.py文件导入d.py文件的函数)(1)只引入d.py文件(2)直接引入函数(3)引入全部函数 【2】导…

抓包看TCP协议

抓包看TCP协议 前言一、三次握手1.1 为什么需要握手?1.2 为什么需要三次握手? 二、四次挥手2.1 为何需要挥手?2.2 为何需要四次挥手? 三、抓个包看看 后记参考 前言 在计算机的世界中,通信双方的交互一般要通过网络这个…

LVS负载均衡集群 keepalived

目录 1.实现方法 1.故障自动切换 (failover) 2.节点健康状态检查 (health checking) 2.实现LVS负载调度器 节点服务器的高可用(HA) 3.keepalived高可用故障切换原理 4.三个主要模块 5.案例 1.实现方法 1.故障自动切换 (failover) 主…

万字解析帮你深入理解MySQL!!!(事物、视图和索引)

今日金句 每一个不曾起舞的日子,都是对生命的辜负 文章目录 一、事物1.1 概述1.2 语法1.3 代码验证1.4 事务的四大特征1.5 事务并发问题1.5.1 四种隔离级别1.5.2 何为脏读,幻读,不可重复读? 二、视图2.1 概念2.2 视图与数据表的区…

pytest参数化的多种使用技巧

前言 unittest单元测试框架使用DDT进行数据驱动测试,那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢?其实Pytest是使用pytest.mark.parametrize装饰器来实现数据驱动测试的,那么今天我们就简单来说说在它是如何进…

代码随想录算法训练营 个人总结

训练营周期:2023/5/10 - 7/8,共计60天 LeetCode记录: 参加训练营之前,就有想刷LeetCode的想法,一方便没有头绪地不知道按什么顺序刷题,另一方面也没有找到很好的讲解材料,都是自己看LeetCode页面…

Notepad++ - 只需一张图教你如何将字符串“\n”替换成换行

问题描述 今天在一个响应体日志返回换行在字符串中,没想到我输入 \n,原本是直接给我出换行效果,结果它也就给我返回 \n,那怎么分析日志啊?! 解决方案 还得是万能的 Notepad,直接看图说话

协同过滤 springboot+vue基于java的个性化图书推荐系统_1k4p4

在飞速发展的信息时代,随着网络学习的的普及,大量的学习平台和大量的图书数量迅速膨胀,使得学生在进行网络学习时面临“数据爆炸”和“数据过载”的情况,无法寻找到适合自己的图书。在面对着越来越多的图书资源,如何快…

【开源软件治理】MITRE : 开源软件

定义: 开源软件(OSS)是一种商业软件,只需同意遵守附带的 OSS 许可证即可获得全部所有权,无需立即进行第三方验证。同意 OSS 许可证允许个人、公司或政府实体根据需要尽可能频繁和广泛地复制、分发和运行 OSS 应用程序&…

【Redis】秒杀业务设计、悲观锁与乐观锁

1 全局ID生成器 一些情境下,使用数据库的ID自增将会产生一些问题。 一方面,自增ID规律性明显,可能被猜测出来并产生一些漏洞另一方面,当数据量很大很大很大时,单表数据量可能会受到限制,需要分表&#xf…

【Linux指令集】---cp指令(超详细)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境&#xff1…

cmake include命令

目录 cmake include命令 CMAKE_CURRENT_LIST_DIR: CMAKE_CURRENT_LIST_FILE: CMAKE_CUEERNT_LIST_LINE: demo top CMakeLists.txt test.cmake subDir下的 CMakeLists.txt 结果: cmake include命令 include()命令也是将一个新的cmake内容引入当前cmake内容中. 格式: …

JVM理论(一)基础概念

JVM概述 JVM就是二进制字节码的运行环境,负责装载字节码到其内存,解释/编译为对应平台上的机器指令执行,每条java指令在java虚拟机规范中都有详细定义,包括如何取、处理操作数等;JVM特点如下 一次编译,到处运行(各CPU的架构不同的情况下JVM为了实现跨平台,字节码指…

删除链表的倒数第 N 个结点——力扣19

题目描述 法一)计算链表长度 class Solution { public:int getLength(ListNode* head){int len0;while(head){len;head head->next;}return len;}ListNode* removeNthFromEnd(ListNode* head, int n) {int len getLength(head);ListNode* dummy new ListNode …

汽车架构解析:python解析Autosar架构的ARXML

文章目录 前言一、Container-I-PDU概念引入二、以文本形式读取ARXML文件三、解析Frame的基本参数四、解析Frame中的PDU五、解析PDU中的Signals六、解析Signal中的初始值和长度七、解析Signal中的起始位置八、解析Signal中的枚举值或公式九、解析ARXML总结 前言 Autosar架构下a…

什么是人工智能?

人工智能基本定义: 人工智能(Artificial Intelligence),英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 人工…

美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制)

本文首发于公众号【看点代码再上班】,欢迎围观,第一时间获取最新文章。 原文:美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制) “全文共计4270字,预计阅读时间6分钟 …

MATLAB | 爱心图例与精致半透明圆角图例

本文中全部示意图均为本人自制,传播时请注明出处。 写了点小成品函数,比如如何绘制饼图时把图例上的图标变成心形: 比如如何自制半透明圆角图例: 依旧先讲原理再给出这俩代码哈: 1 原理讲解-图形对象 封闭四边形对…

3.7.使用cuda核函数加速warpaffine

目录 前言1. warpAffine2. warpAffine案例2.1 导言2.2 main函数2.3 warpaffine_to_center_align函数2.4 warp_affine_bilinear函数2.5 warp_affine_bilinear_kernel核函数2.6 AffineMatrix结构体 3. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0…

【滨小之旅搜索】八皇后

题目传送门 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有…