集群情况下的分布式锁

集群情况下,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. 利用sharding-jdbc分库分表
  3. 微服务落地,我们在考虑什么?
  4. 卡写入速度_看清商家买相机送SD卡的套路,一文教你掌握存储卡选购秘诀
  5. RIPv1 与 RIPv2 基础配置
  6. 轻松解决(,|)和(and,or)之间的区别
  7. WINFORM 调用 Close 不会释放窗体
  8. Qt4_基于项的图形视图
  9. vue全局引入scss文件(推荐)
  10. 十沣科技自主研发仿真软件 有效实现飞机起落噪声精细仿真
  11. jupyter报错EnvironmentLocationNotFound: Not a conda environment: /root/anaconda3/envs/anaconda3
  12. python函数(一)——def语句,作用域和参数
  13. 什么从什么写短句_什么在什么,在什么,什么仿写句子,怎样写
  14. cad绘制正八边形_软件CAD | 各种“线”工具
  15. 智能无感验证实战案例:神州优车
  16. Vue实现拖拽升级(九宫格拖拽)
  17. 5、CYC-GPS接收机
  18. redis-cluster环境搭建
  19. Unity游戏开发工具的下载与安装
  20. 【SpringBoot】升级2.4.0所出现的问题:When allowCredentials is true, allowedOrigins cannot contain the specia

热门文章

  1. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程
  2. java希尔排序_java_java高级排序之希尔排序,希尔排序对于多达几千个数据 - phpStudy...
  3. 数据标注——VoTT的学习笔记
  4. Vscode 在 Linux 上配置远程开发
  5. Python 中遇到note: see declaration of '_ts'
  6. Activity之间的跳转和四种启动模式
  7. char varchar nchar nvarchar 四者的区别是什么(为何SQL Server自动给字符串末尾加空格)...
  8. 同行压力(兼谈敏捷团队,绩效管理,自组织团队)
  9. Hashtable 为什么不叫 HashTable?
  10. selenium中,运行测试用例,报NosuchElementException错误,用try --except 捕获异常