前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis-面试

Redis-面试

原创
作者头像
知识浅谈
修改2022-03-01 18:27:22
2850
修改2022-03-01 18:27:22
举报
文章被收录于专栏:分享学习分享学习

Redis单线程原理

首先必须明确,Redis单线程指的是网络请求模块使用了一个线程,其他模块仍用了多个线程,并不是一个线程完成了所有功能。 原理上,其采用了利用epoll的多路复用特性,因此可以采用单线程处理其网络请求。

Redis数据类型

String:字符串类型,最简单的类型 Hash:类似于Map的一种结构。 List:有序列表。 Set:无序集合。 ZSet:带权值的无序集合,即每个ZSet元素还另有一个数字代表权值,集合通过权值进行排序。

什么情况下使用redis

针对热点数据进行缓存,热点数据即查询频繁的数据

对于特定限时数据的存放

针对带热点权值数据的排序list

分布式锁

redis与memcache的区别

redis处理网络请求采用单线程模型原理上是采用了IO多路复用,而memcache采用多线程异步IO的方式。

redis支持数据持久化(采用RDB打包镜像的方式和AOF日志文件保存的方式),memcache不支持。

redis支持的数据格式比memcache更多。

简述缓存穿透

缓存穿透指缓存和数据库均没有需要查询的数据,攻击者不断发送这种请求,使数据库压力过大。

简述缓存穿透的解决方法

在数据库操作访问前进行校验,对不合法请求直接返回。

对于经常被访问的,并且数据库没有的键,缓存层记录键=null。

简述缓存击穿

缓存击穿指缓存中没有数据,但数据库中有该数据。一般这种情况指特定数据的缓存时间到期,但由于并发用户访问该数据特别多,因此去数据库去取数据,引起数据库访问压力过大。

简述缓存击穿的解决方法

设置热点数据永远不过期。

对并发读数据设置并发锁,降低并发性。

简述缓存雪崩

缓存雪崩指缓存中一大批数据到过期时间,而从缓存中删除。但该批数据查询数据量巨大,查询全部走数据库,造成数据库压力过大。

简述缓存雪崩的解决方法

缓存数据设置随机过期时间,防止同一时间大量数据过期。

设置热点数据永远不过期。

对于集群部署的情况,将热点数据均匀分布在不同缓存中。

Redis有哪些集群部署方式

  1. 主从复制
  2. 哨兵模式
  3. cluster集群模式

简述主从复制模式

在主从复制中,有主库(Master)节点和从库(Slave)节点两个角色。 从节点服务启动会连接主库,并向主库发送SYNC(同步)命令。

主节点收到同步命令,启动持久化工作,工作执行完成后,主节点将传送整个数据库文件到从库,从节点接收到数据库文件数据之后将数据进行加载。此后,主节点继续将所有已经收集到的修改命令,和新的修改命令依次传送给从节点,从节点依次执行,从而达到最终的数据同步。

通过这种方式,可以使写操作作用于主库,而读操作作用于从库,从而达到读写分离。

简述哨兵模式

哨兵模式监控redis集群中Master的工作的状态。在Master主服务器宕机时,从slave中选择新机器当作master,保证系统高可用。

每个哨兵每10秒向主服务器,slave和其他哨兵发送ping。

客户端通过哨兵,由哨兵提供可供服务的redis master节点。

哨兵只需要配master节点,会自动寻找其对应的slave节点。

监控同一master节点的哨兵会自动互联,组成哨兵网络,当任一哨兵发现master连接不上,即开会投票,投票半数以上决定Master下线,并从slave节点中选取master节点。

cluster集群

cluster提出了虚拟槽的概念。

  1. redis cluster默认有16384个槽,在集群搭建的时候,需要给节点分配哈希槽尽可能相同数量虚拟槽。
  2. 如果目前redis执行set操作,redis先对这个key经过CRC16 hash运算,并把结果对16384取余,得到槽编号。根据槽编号,寻找到其对应的redis节点,在节点上执行hash命令。
  3. 如果此时执行get操作,节点先验证该key对应的槽编号是不是归本节点管,如果是则保存数据。如果不是,则发送正确节点编号给客户端。

简述Redis的RDB

RDB即将当前数据生成快照,并保存于硬盘中。可以通过手动命令,也可以设置自动触发。

RDB:将服务器包含的所有数据库数据以二进制文件的形式保存到硬 盘里面。

有两种形式生成RDB文件,一种是SAVE 命令 一种是BGSAVE命令。

  1. 执行SAVE命令的时候会阻塞当前Redis服务,知道RDB文件生成完成。
  2. 执行BGSAVE命令的时候不会阻塞当前的Redis服务,因为当前的redis床fork()一个子线程去生成RDB文件,生成之后告诉redis主线程接受。

简述Redis的save命令

save命令是redis手动触发RDB过程的命令。使用该命令后,服务器阻塞,直到RDB过程完成后终止。该过程占用内存较多。

简述Redis的bgsave命令

bgsave命令不阻塞主进程(严格意义上也不是完全不阻塞,详看下面过程),该命令fork一个子进程用于执行RDB过程。其具体过程为:

  1. 判断此时有没有子进程用于RDB,有的话直接返回。
  2. redis进行fork子进程过程,此时父进程处于阻塞状态。
  3. 子进程创建RDB文件,完成后返回给父进程

简述Redis自动触发RDB机制

  1. 通过配置文件,设置一定时间后自动执行RDB
  2. 如采用主从复制过程,会自动执行RDB
  3. Redis执行shutdown时,在未开启AOF后会执行RDB

简述Redis的AOF

AOF通过日志,对数据的写入修改操作进行记录。这种持久化方式实时性更好。通过配置文件打开AOF。

简述AOF的持久化策略

always。每执行一次数据修改命令就将其命令写入到磁盘日志文件上。

everysec。每秒将命令写入到磁盘日志文件上。

no。不主动设置,由操作系统决定什么时候写入到磁盘日志文件上。

简述AOF的重写

随着客户端不断进行操作,AOF对应的文件也越来越大。redis提供了bgrewriteaof函数,针对目前数据库中数据,在不读取原有AOF文件的基础上,重写了一个新的AOF文件,减少文件大小。

RDB与AOF优缺点比较

RDB

优点3更:

体积更小:生成的RDB文件体积更小。

恢复更快:因为rdb是数据的快照,基本上就是数据的复制,不用重新读取再写入内存。

性能更高:父进程在保存rdb时候只需要fork一个子进程,无需父进程的进行其他io操作,也保证了服务器的性能。

缺点:

故障丢失,耐久性差。

AOF:

优点:

数据保证:我们可以设置fsync策略,一般默认是everysec

自动缩小:当aof文件大小到达一定程度的时候,后台会自动的去执行aof重写

缺点:

性能相对较差

体积相对更大

.恢复速度更慢

总结:

AOF占用的文件体积比RDB大。一般来说利用AOF备份对系统的消耗比RDB高。

对于备份时出现系统故障,RDB数据可能会全丢,但AOF只会损失一部分。 RDB恢复速度比AOF快。

简述Redis淘汰机制

noeviction:默认禁止驱逐数据。内存不够使用时,对申请内存的命令报错。

volatile-lru:从设置了过期时间的数据集中淘汰最近没使用的数据。

volatile-ttl:从设置了过期时间的数据集中淘汰即将要过期的数据。

volatile-random:从设置了过期时间的数据中随机淘汰数据。

allkeys-lru:淘汰最近没使用的数据。

allkeys-random:随机淘汰数据。

MySQL与Redis区别

mysql是关系型数据库,并且其将数据存储在硬盘中,读取速度较慢。

redis是非关系型数据库,并且其将数据存储在内存中,读取速度较快,只有当持久化的时候才存储到磁盘。

简述Redis过期策略

  1. 定期删除,redis默认是每100ms就随机抽取一些设置了过期时间的key,并检查其是否过期,如果过期就删除。因此该删除策略并不会删除所有的过期key。
  2. 惰性删除,在客户端需要获取某个key时,redis将首先进行检查,若该key设置了过期时间并已经过期就会删除。

实际上redis结合上述两种手段结合起来,保证删除过期的key。

Redis基本数据类型实现原理

字符串:采用类似数组的形式存储

list:采用双向链表进行具体实现

hash:采用hashtable或者ziplist进行具体实现

集合:采用intset或hashtable存储 有序集合

采用ziplist或skiplist+hashtable实现

Redis快的原因

redis是基于内存的数据库,内存数据读取存储效率远高于硬盘型

redis采用多路复用技术通过采用epoll的非阻塞多路复用IO,提升了效率

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis单线程原理
  • Redis数据类型
  • 什么情况下使用redis
  • redis与memcache的区别
  • 简述缓存穿透
  • 简述缓存穿透的解决方法
  • 简述缓存击穿
  • 简述缓存击穿的解决方法
  • 简述缓存雪崩
  • 简述缓存雪崩的解决方法
  • Redis有哪些集群部署方式
  • 简述主从复制模式
  • 简述哨兵模式
  • cluster集群
  • 简述Redis的RDB
  • 简述Redis的save命令
  • 简述Redis的bgsave命令
  • 简述Redis自动触发RDB机制
  • 简述Redis的AOF
  • 简述AOF的持久化策略
  • 简述AOF的重写
  • RDB与AOF优缺点比较
  • 简述Redis淘汰机制
  • MySQL与Redis区别
  • 简述Redis过期策略
  • Redis基本数据类型实现原理
  • Redis快的原因
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档