redis相关

导读

  1. redis的工作模型和常用数据结构
  2. redis的持久化及数据淘汰机制
  3. redis的应用场景及应对措施
    1. 分布式锁
    2. 缓存穿透、缓存击穿和缓存雪崩
  4. redis的性能瓶颈

redis工作模型

redis的特点:

  1. 单线程
  2. 高并发
  3. 高性能
  4. 支持分布式锁

单线程

  1. 多线程的优缺点:

    1. 优点:提高cpu的利用率
    2. 缺点:需要额外的管理开销,需要复杂的同步机制,避免死锁等等。
  2. 单线程的优缺点:

    1. 没有线程切换的消耗
    2. 实现并发处理,有点复杂
  3. redis为什么要使用单线程?

    1. 没有线程上下文切换的消耗
    2. redis在内存中工作,性能比较好,无需多线程
    3. redis依赖多路复用,实现了并发处理

    redis为什么选择单线程工作模型
    redis单线程解读

底层数据结构

  1. redis底层的数据类型

    • 字符串

      • 简单动态字符串
      • free:可以知道缓存区还有多少剩余空间,可以将惰性空间释放
      • len:做字符串间隔,不需要用指定的字符来间隔,并且可以直接获取字符串长度,不需要遍历
    • 链表

      1. 压缩列表

      2. 双端链表

      3. 快速链表
        :压缩列表和双端链表的折中方案。

      4. 无环

      5. 如果列表中的元素较少,Redis倾向于使用压缩列表进行存储,因为压缩列表占用内存更少,而且比双端链表可以更快载入;当列表对象元素较多时,压缩列表就会转化为更适合存储大量元素的双端链表。

    • 哈希

      1. table:指向桶
      2. size:元素的个数
      3. sizemask:hash计算掩码
      4. rehash的过程:
        1. 按照ht[0]的大小给h[1]分配空间
        2. 将ht[0]的元素rehash计算放入ht[1]中
        3. ht[0]放完之后,释放ht[0]
        4. 将原ht[0]指向ht[1]
      5. 渐进式rehash
        1. 按照ht[0]的大小给h[1]分配空间
        2. 维持一个rehashIndex,记录迁移状态
        3. 每次增删改查都对ht[0]和ht[1]操作,将ht[0]删除,rehashIndex++
        4. 当迁移完成之后,将ht[0]释放,并rehashIndex置未-1
    • 集合

      • 无序
      • 不重复
      • 整数集合:当这个集合内只有整数的时候,redis会自动选择使用整数集合
    • 有序集合 sortSet

  2. redis的工作模型
    了解redis的单线程模型工作原理?一篇文章就够了
    多路复用模型+事件处理器

  3. redis的应用场景
    Redis在互联网公司一般有以下应用:
    String:缓存、限流、计数器、分布式锁、分布式Session
    Hash:存储用户信息、用户主页访问量、组合查询
    List:微博关注人时间轴列表、简单队列
    Set:赞、踩、标签、好友关系
    Zset:排行榜

持久化

  1. redis持久化
    1. RDB:数据快照模式(save、bgsave、自定义)
      • 优点:
        • 简单、恢复快
        • 不影响性能(bgsave)
      • 缺点:
        • 在fork的之后,如果有变更,会丢失
        • 实现比较重,只有数据的最终状态
    2. AOF:增量日志模式(always、second、自定义)
      • 优点:
        • 安全,可以根据不同配置,保证较小区间的数据丢失
        • 轻量、灵活
      • 缺点:
        • rewrite可能会影响系统性能
        • 恢复慢

    10分钟彻底理解Redis的持久化机制:RDB和AOF

缓存淘汰

  1. redis过期策略和内存淘汰
    1. 过期淘汰策略

      • redis采用定时删除+惰性删除,缺点是如果一些key始终没有被操作,那会一直存在于内存中。这时就需要内存淘汰机制。
      • redis的定时删除

      Redis 默认会每秒进行 10 次(redis.conf 中通过 hz 配置)过期扫描,扫描并不是遍历过期字典中的所有键,而是采用了如下方法:

      从过期字典中随机取出 20 个键
      删除这 20 个键中过期的键
      如果过期键的比例超过 25% ,重复步骤 1 和 2

      为了保证扫描不会出现循环过度,导致线程卡死现象,还增加了扫描时间的上限,默认是 25 毫秒(即默认在慢模式下,如果是快模式,扫描上限是 1 毫秒)

    2. 内存淘汰机制

redis集群

  1. redis分布式集群的常见形式
    主从模式
    哨兵模式
    集群模式

    Redis分布式集群----redis的三种集群方式总结(5)

  2. Redis的多路复用

    Redis I/O 多路复用

  3. 集群模式下key是怎么寻址的

  4. 分布式寻址都有哪些算法

  5. 一致性hash算法如何动态的增加和删除一个节点

常见问题

  1. 缓存穿透、缓存击穿、缓存雪崩

    1. 缓存穿透
      1. 查询了不存在的数据,每次都会透过redis,查询db
      2. 解决方法:布隆过滤器、当返回结果为空,也进行缓存。
    2. 缓存雪崩
      1. 大量key在同一时刻过期,导致db压力暴增。
      2. 解决方法:
        1. 可以设置一个随机范围的过期时间
        2. 互斥锁更新
    3. 缓存击穿
      1. 单个key过期时,正好有大量调用,请求直接打到db上。
      2. 解决方法:
        1. 互斥锁更新
        2. 设置永不失效(不推荐)
        3. 无论结果是否存在都返回,不存在则起异步线程去获取
  2. redis性能为什么高?

    1. 设计巧妙的数据结构
    2. 多路复用模型
    3. 事件机制

    为什么单线程的Redis能够达到百万级的QPS?

  3. 有海量key和value都比较小的数据,在redis中如何存储才更省内存?
    首先这是一个hash结构的数据,在redis中hash结构的数据通常是有两种结构保存。

    1. 压缩列表
    2. hashtable

    从更省内存的角度来看,应该选择压缩列表,这种场景,可以将key映射到不同的map里,因为key和value都很小,这样就可以使用压缩列表的数据结构保存数据。
    (事实上,redis在创建数据的时候,会自我判断使用哪种数据结构。)

  4. 如何保证redis和DB中的数据一致性?

    参考

  5. 如何用redis实现分布式锁?

  6. 压测产生的垃圾数据该怎么清理

    1. db,用影子表
    2. redis,key带上后缀,标志
  • 常见缓存问题解决方案
  • redis事务
  • redis的CAS方案
  • redis的pipeline
  • redis的主从复制原理
  • 百亿级key存储方案
  • 如何保证redis和数据库的一致性
  • redis和membercache的区别,为什么单线程的redis性能要比多线程的membercache要高
  • redis的并发竞争实质是什么?如何解决

redis的并发竞争问题是什么?如何解决这个问题?

延伸

  1. redis中hash的扩容与缩容与java的hashmap方法的比较?
  2. 有序链表的实现
    1. redis中的跳跃表与hashmap的红黑树

参考

1. 一文深入了解Redis内存模型

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • Redis相关 Reids没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple ...
    万福来阅读 335评论 0 0
  • 原文:https://blog.csdn.net/qq_14958051/article/details/1061...
    longLiveData阅读 216评论 0 0
  • 1、Redis的数据类型 String:格式:set key valuestring是二进制安全的,可包含任何数据...
    夏与清风阅读 329评论 0 0
  • 一 目前主流应用的架构实现草图   该应用架构是最常见的应用架构,一般为了提升性能,都会在中间添加一个缓存层,当客...
    十丈_红尘阅读 561评论 0 8
  • 最近写了一篇自己搭建redis集群并在自己项目中使用的文章,今天早上看别人写的面经发现redis在面试中还是比较常...
    南风开发大大阅读 931评论 0 0