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

Redis高频面试点

作者头像
BUG弄潮儿
发布2021-01-05 11:42:23
3550
发布2021-01-05 11:42:23
举报
文章被收录于专栏:JAVA乐园
0x01:内存淘汰策略
  • noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键;
  • allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键;
  • volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键;
  • allkeys-random:加入键的时候如果过限,从所有key随机删除;
  • volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐;
  • volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键;
  • volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键;
  • allkeys-lfu:从所有键中驱逐使用频率最少的键;

0x02:过期策略

Redis是key-value数据库,可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)

0x03:缓存穿透

定义:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  • 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击;

0x04:缓存击穿

定义:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决方案:

  • 设置热点数据永远不过期;
  • 加互斥锁;

0x05: 缓存雪崩

定义:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  • 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生;
  • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中;
  • 设置热点数据永远不过期;

0x06:部署方案

  • 单机模式
  • 主从模式
  • 哨兵模式
  • 集群模式

对于Redis的集群模式,是Redis 3.0之后才推出cluster分布式集群方案;在Redis 3.0之前可以采用中间件代理的模式,例如使用Twemproxy、Codis和Nginx。

0x07:持久化机制RDB和AOF

RDB就像是一台给Redis内存数据存储拍照的照相机,生成快照保存到磁盘的过程。触发RDB持久化分为手动触发和自动触发。Redis重启读取RDB速度快,但是无法做到实时持久化,因此一般用于数据冷备和复制传输。

优点:

  • 非常适合全量备份
  • 恢复速度比AOF快

缺点:

  • RDB方式没有办法做到实时持久化
  • 版本兼容RDB格式问题

RDB方式不能提供强一致性,如果Redis进程崩溃,那么两次RDB之间的数据也随之消失。那么AOF的出现很好的解决了数据持久化的实时性,AOF以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令来恢复数据。AOF会先把命令追加在AOF缓冲区,然后根据对应策略写入硬盘(appendfsync)。

优点:

  • 做到最多丢失1-2s内的数据(最多丢失2s数据,因为AOF追加阻塞)

缺点:

  • AOF文件比RDB文件大
  • 可能导致追加阻塞

0x08:Redis常用业务场景

  • 热点数据的缓存
  • 限时业务的运用
  • 计数器相关问题
  • 排行榜相关问题
  • 分布式锁
  • 延时操作
  • 分页、模糊搜索
  • 点赞、好友等相互关系的存储
  • 队列
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档