Redis面试题

Redis6为啥引入多线程

  1. 网络IO瓶颈
  2. 提升带宽利用率
  3. 降低延迟
  4. 充分利用多核CPU
  5. 略微改变工作模型:多线程主要处理请求的网络IO,执行命令还是单线程

缓存热key问题怎么解决

  1. 本地缓存:代码中实现本地缓存
  2. 请求分摊:请求压力非常大,redis节点都承受不住的情况。把热key数据拆分为多个key,集群模式下可以分散在不同的redis节点
  3. 限流
  4. 监控报警:接入热key探测系统

缓存大key问题

一般单个key超过10kb被认为是大key,可能会导致

  • 网络延迟增大
  • 阻塞redis性能
  • 内存不足导致OOM

我们可以

  • 拆分大key:分段存储数据
  • 压缩数据

规范上:

  • 更新删除大key时开启惰性删除:避免阻塞整个redis
  • SCAN代替KEYS:一批一批遍历数据

缓存与数据库双写不一致问题

首先,对实时性要求非常高的场景不建议使用缓存,使用了缓存就会牺牲一定的实时性。以下方式都是缓解问题

  1. 利用过期时间,在下一次读取数据时候自动更新(性能高,实时性差)
  2. 在更新数据库的时候,把缓存删了下一次读取数据时候自动更新(一般与第一种结合使用,性能高,实时性差)
  3. 使用canal中间键监听binlog异步更新缓存(监听数据更新缓存的过程也有可能不一致)
  4. 同第二个,不过加一把分布式读写锁(实时性高,性能低,读写串行)

1、2可以加一个更新的分布式锁,防止大量线程在缓存失效时导致数据库压力大

Redis过期key的删除策略

  • 惰性删除

    当客户端访问一个key时检查key是否过期,过期就会删除。如果有大量过期key没有被再次访问,就会浪费大量空间

  • 定期删除

    周期性随机抽部分设置了过期时间的key检查是否过期,并删除已过期的key

  • 定时删除

    创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作。CPU压力很大

Key和Value的设计原则

key原则

  • 简短精炼:节省内存,命名易理解
  • 统一命名规范:例如用:分隔,业务名和id(或者表名和id)
  • 避免热Key:负载均衡,集群模式下让key分布均匀到不同的节点
  • key唯一性

value设计原则

  • 选择合适的数据结构
  • 单个value不要过大
  • 利用压缩
  • TTL设置
相关推荐
这个DBA有点耶2 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户6279947182622 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹2 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿2 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪2 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛3 小时前
导出mysql数据结构
数据库·mysql
GlobalTradercrb3 小时前
独立站SEO先写博客还是先优化产品页?看站点阶段
数据库·人工智能·google·pdf·go·seo
PingCAP3 小时前
善战者无赫赫之功:消费金融核心系统的数据库选型与升级路径
数据库·分布式·架构
花间相见4 小时前
【计算基础|MySQL09】索引(下):失效与设计
数据库·后端·面试
张宇Joaquin4 小时前
Linux系统下磁盘扇区512n、512e和4kn的区别
linux·运维·数据库