集群情况下的分布式锁

集群情况下,redis的分布式锁有不安全的因素,下面这个场景:

  1. 主节点拥有锁
  2. 客户端获取锁后,主节点挂掉
  3. 从节点接替,成为主节点,但是从节点没有客户端获取的锁
  4. 新来的客户端向现在的主节点获取锁,会成功,导致出现数据竞争

RedLock算法可以解决该问题,该算法基本的思想是,加锁时向过半节点发送set(key, value, nx=True, ex=xxx)指令,只要半数节点set成功,则加锁成功;释放锁时,向所有节点发送del指令。实际的情况还要考虑出错重试和时漂移等,比较复杂。

该算法可以保证高可用性,但是牺牲性能,而且需要更多的redis实例。

过期策略

定时删除: Redis把过期的key放在一个单独的字典中,之后会定时遍历该字典,然后删除已经过期的key。集中处理
惰性删除:客户端访问一个key时,redis先检查key是否过期,如果过期则立刻删除。零散处理

redis默认每10秒扫描一次过期词典,定时扫描策略如下:

  1. 从过期词典中随机选出20个key
  2. 删除20个key中已经过期的
  3. 如果过期的key超过14\frac{1}{4}41​,则重复步骤1

为了防止循环过度,redis默认上限的循环时间时25ms,过时立刻停止,不影响服务。

如果redis中大量的key在同一时刻过期,可能会造成redis卡顿,原因有2个:

  • redis持续扫描过期词典,直到key稀疏
  • 内存管理器需要频繁回收内存页,产生CPU消耗

服务器如果处于扫描过期状态,则客户端请求至少25ms才能得到应答,此时在业务上,会出现大量连接超时关闭的异常。redis的slowlog的慢查询记录无法看到,因为这个记录只是记录了执行的时间,不包括等待时间。因此,如果有大批量的key,请设置随机的超时时间,防止同时过期。

从节点没有定期扫描机制,过期处理时被动的。主节点的key到期时,会在AOF中追加del指令,这样同步到所有的从节点,从节点执行该指令来删除过期的key。同步指令异步执行,如果执行不及时,则可能出现数据不一致的情况。

Redis的删除机制

如果内存超出物理限制,内存数据会和磁盘交换,redis为了效率,不允许这种情况。

Redis使用类似LRU的算法。因为LRU算法本身比较消耗内存。随机LRU给每个key一个24bit的空间,用于表示时间戳。当redis执行写操作时,如果超过maxmemory限制时,随机选出5个(可调节)key,然后删除这些key,如果任然超时,则继续删除,直到满足条件为止。

懒惰删除

redis的单线程,不是完全只有一个线程,而是只有一个主线程处理逻辑等操作,多个异步线程处理异步任务。

ulink key

是把key丢个后台异步线程删除。这里不会有数据竞争,一旦使用该命令,则外界不会获取到该key了。

flushall async  # 异步删除,同样的原理,没有数据竞争。

主线程把数据“删除”后,对应的key的内存,会进入一个线程安全的异步队列,由后台线程完成内存回收。同样的,AOF操作也是有自己的任务队列。

redis笔记6 拓展内容相关推荐

  1. 【大厂面试】面试官看了赞不绝口的Redis笔记

    文章目录 一.Redis简介 二.Redis API的使用和理解 (一)通用命令 (二)单线程架构 (三)数据结构和内部编码 (四)字符串 (五)hash (字典) (六)列表 (七)Set集合 (八 ...

  2. 兄弟连NoSQL视频教程 redis笔记

    兄弟连NoSQL视频教程 redis笔记 ================================课程目录====================================== 01.N ...

  3. 【大厂面试】面试官看了赞不绝口的Redis笔记(二)

    文章目录 说明 四.Redis的其他功能 (一)慢查询 (二)pipeline (三)发布订阅 (四)Bitmap (五)HyperLogLog (六)GEO 五.Redis持久化的取舍和选择 (一) ...

  4. 狂神说Redis笔记

    以下是狂神Redis笔记,个人觉得总结的很好,故收藏一下,日后再总结一下自己的笔记 ⭐学习时间2022.1.4-2022.1.6 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90 ...

  5. 初学Oracle的笔记(2)——基础内容(实时更新中..)

    续 初学Oracle的笔记(1)--基础内容(实时更新中..) 1.oracle中创建一张表,写法与sql server中的一样. SQL> create table Course 2 ( cn ...

  6. 【Java Web开发指南】redis笔记

    今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis 文章目录 今日内容 Redis 案例: Redis 1. 概念: ...

  7. 【狂神说】Redis笔记

    文章目录 1.Nosql概述 1.1 为什么要用Nosql 1.2 什么是NoSQL 1.3 阿里巴巴演进分析 2.NoSQL的四大分类 3.Redis入门 3.1 概述 3.2 Windows安装 ...

  8. 【Redis笔记】缓存穿透与缓存击穿以及应对方法

    [Redis笔记]缓存穿透与缓存击穿以及应对方法 一.缓存穿透 1. 缓存穿透概念 2. 缓存穿透解决方法 示例代码 二.缓存击穿 1. 缓存击穿概念 2. 缓存击穿解决方法 方法一:互斥锁 示例代码 ...

  9. 小红书笔记如何发布内容

    很多人都在吐糟自己不能发送小红书的笔记本,但很多人对于小红书笔记发不了是为什么,还是找不到原因,其实原因有很多种,小编也不一一给大家介绍了,今天小编给大家演示下正确的小红书笔记发布流程,下面小编就给大 ...

最新文章

  1. 关于计算机中二进制原码,反码,补码的简要解释
  2. $.ajax 的async参数在crossdomain跨站下的问题
  3. Ubuntu 调节屏幕亮度
  4. SAP 电商云 Spartacus UI feature level directive 的工作原理
  5. boot spring test 文档_Spring、Spring Boot 和 TestNG 测试指南 ( 3 )
  6. glDrawElements参数在新旧版本传最后一个参数的不同
  7. ckeditor5自定义 vue_vue中的富文本编辑器CKEditor5
  8. 在计算机管理中创建不同的用户,为什么在计算机管理员里创建密码密码总是不符合要求...
  9. mysql集群方案,保准看明白!
  10. SQL Server内存泄漏
  11. 解决求平均值出现加和导致的溢出问题
  12. centos 7下搭建wiki系统
  13. 什么是OCR?如何使用OCR文字识别软件?
  14. Android Studio中ListView通过自定义Adapter显示数据3-1
  15. 一个简单证件照的设计过程
  16. 人大、北外、北航三校开启在职硕士(学位)商业数据分析方向 | 报名
  17. 光驱刻录空盘提示函数不正确
  18. request与response的笔记梳理
  19. 计算机图形学方向的基本能力
  20. 云计算之存储虚拟化 -02

热门文章

  1. avg最多用多少列 mysql_使用MySQL中的AVG函数求平均值的教程
  2. python怎么用turtle画圆_在Python中用turtle函数画同心圆
  3. iphone导出照片到电脑_苹果手机照片删除了怎么恢复?简单方法图文教程
  4. batch入门教程(3)
  5. pytorch学习笔记(二十六):NIN
  6. Anaconda prompt下常用命令
  7. Ubuntu:如何卸载 vmware player 或 VMWare Workstation
  8. web服务器一些概念
  9. CMMI与Agile敏捷开发比较之二:需求管理篇(兼谈用敏捷实现和满足CMMI的ReqM过程域)...
  10. 排序算法第四篇——冒泡排序