redis面试题(参考)

redis:
为什么要使用缓存:
用户第一次访问数据库的时候是比较慢的,因为他们从硬盘上读取的,硬盘的寻址速度是毫秒级的,从数据库获取到的数据存储在redis中,这样下一次再去查询就可以用redis中获取了,redis是存储在内存中的,内存中的数据是纳米级的,加快了获取速度,同时缓解了数据库压力
redis数据类型:
string:缓存、计数器
hash:  用来存储对象、绘画缓存
list:  用来存储热点新闻或者列表、阻塞队列、
set:   用来做去重
zset: 用来做排行榜
分布式锁、会话缓存、缓存、计数器、存储热点数据(list)、分布式消息、阻塞队列、

redis持久化:
RDB:RDB格式就是把数据以快照的形式保存在磁盘上,
   RDB的三种触发机制:
      save方式:该命令会阻塞当前的redis服务器,执行save命令期间,redis不能处理其他命令,直到命令完成为止
      bgsave方式:该命令时候,redis会在后台异步进行操作,快照同时相应客户端需求
      RDB持久化优点:
        1、RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复
        2、生成RDB文件的时候,redis主进程会fork一个子进程来处理所有的保存工作,主进程不需要进行任务磁盘io操作
        3、RDB在恢复大数据集时候的速度比AOF的回复速度快
      RDB:持久化弊端:当redis服务器宕机以后后面的数据不会被持久化,导致数据丢失
AOF机制:
 AOF是将执行的命令保存到磁盘上,
 AOF的三种方式:
    1、每修改同步always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差,但是数据完成行比较好
    2、每秒同步everysec:异步操作,每秒记录,如果一秒内宕机,有数据丢失
    3、不同。从不同步

目前常用的持久化方式是两者一起使用:


 redis处理过期数据:
   过期淘汰:
      惰性删除:redis服务器不主动删除过期的键值,当访问键值时需要先查询当前键值是否过期,如果过期则执行删除并返回null,如果不过期则正常返回信息给客户端,优点是简单,不需要对过期数据进行额外处理,只是在查询时后判断健值队是否过期,节省了cpu,缺点是可能检查不及时,导致了内存空间的浪费
      定期删除:redis每隔一段时间需要去检查是否有过期的健值队可以被清除,redis默认定期检查的频率是每秒扫描10次,用于清理过期健,定期删除并不是扫描所有的键值对会浪费时间,redis采取随机抽样,每次抽取20个键值队进行检查,当过期白分比大于25%
 redis内存淘汰策略:
    当redis内存使用超过最大允许内存maxmemory时,redis会触发内存淘汰策略
    1、random算法:随机淘汰键值对算法
    2、TTL算法:优先淘汰所有设置了过期时间的任意键值的更早过期的键值进行移除
    3、LRU算法:淘汰所有设置了过期时间的任意键值的最久未使用的键值
     LRU维护了一个大小为16的候选池,候选池里面的数据会根据时间进行排序,每一次随机抽取5个key放入后候选池里面,当候选池满了以后,访问时间间隔最大的key取出来淘汰掉,通过这一个设计(假如一个key很长时间没访问到,最近一次偶然被访问到,LRU会认为这是一个热点key,不会被淘汰)
    4、LFU算法:优先淘汰了所有设置了过期时间的键值中最少使用的键值,
    相较于LRU,LFU增加一个访问次数的情况,
    (LFU使用了两个双向链表形成了一个二维双向链表,当增加元素的时候,默认访问频次为1,于是找到相同频次的节点,然后添加到相同频次节点的双向链表的头部,当元素被访问的时候增加访问的频次,如果单凭访问频次开看的话也会有问题,但是也会存在一个元素前期访频次很高,但是后面一直没背访问到,所以增加了最近访问时间,如果长时间没有被访问就减少访问频次)

redis和数据库的一致性:
   1、先更新数据库、在更新redis
   2、先删除redis,在更新数据库、再去查询数据库,更新缓存
   3、先删除redis,再去更新mysql,延迟几秒再去删除redis,更新mysql


redis主从复制(提高redis的可靠性):
  1、读写分离
  2、数据容灾
  主从复制过程:
  1、从节点向主节点发送sync命令,请求同步数据
  2、主节点收到sync命令后,开始同步bgsave进行持久化为rdb文件,同时将持久话期间新的执行写入命令都保存到缓冲区中
  3、当持久化命令结束以后,主节点将rdb文件发送到从服务器,从服务器接收到该文件以后加载到内存中
  4、主节点将缓冲区中的指令发送到从节点
  5、每当主节点接收到些命令的时候,都会将指令按照redis协议发送到从节点,从节点接收主节点发送过来的命令
 缓存穿透:
 此时数据库和mysql中都不存在的key值,这时候如果频繁请求这个key值会对数据库造成很大的影响
    解决方案:
       1、增加接口检验,针对一些不合理的请求进行拦截
       2、当缓存中和数据库汇总都没有取到数据时,可以将key中的value置为空,这样可以防止用户重复用一个ID进行攻击
       3、布隆过滤器
  缓存击穿:
  当以一个访问频率很高的key值突然失效时候,会导致短时间内大量的请求访问到数据库,对数据库造成很大的影响
     解决方案:
        1、设置热点数据永不过期
   缓存雪崩:
     缓存汇总大量的数据同时到过期时间或者服务器宕机 ,查询数据量过大,导致数据库压力大甚至down机,
      解决方案:
         1、缓存数据的过期时间随机,防止同一时间大量数据过期
         2、可以设置redis集群


Redis是单线程吗?单线程为啥速度很快?

redis过期策略:

1、定时过期:在设置redis缓存key时设置一个定时器,到期的时候会自动清除缓存中的key,这种方式节省了内存资源,但是会对cpu造成很大的负担,导致吞吐量下降

2、惰性过期:这种方式是当访问到key时发现此时key过期了,然后清除key,这种方式节省了

cpu资源,但是会存在大量没有访问到的key,占用大量内存

3、定期删除:每隔一段时间扫描redis数据库中expires过期字典里面的key值,并且清除已经过期的key,

redis使用的过期策略是 惰性删除和定期删除两种方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值