redis笔记6 拓展内容
集群情况下的分布式锁
集群情况下,redis的分布式锁有不安全的因素,下面这个场景:
- 主节点拥有锁
- 客户端获取锁后,主节点挂掉
- 从节点接替,成为主节点,但是从节点没有客户端获取的锁
- 新来的客户端向现在的主节点获取锁,会成功,导致出现数据竞争
RedLock
算法可以解决该问题,该算法基本的思想是,加锁时向过半节点发送set(key, value, nx=True, ex=xxx)
指令,只要半数节点set
成功,则加锁成功;释放锁时,向所有节点发送del
指令。实际的情况还要考虑出错重试和时漂移等,比较复杂。
该算法可以保证高可用性,但是牺牲性能,而且需要更多的redis实例。
过期策略
定时删除: Redis把过期的key放在一个单独的字典中,之后会定时遍历该字典,然后删除已经过期的key。集中处理
惰性删除:客户端访问一个key时,redis先检查key是否过期,如果过期则立刻删除。零散处理
redis默认每10秒扫描一次过期词典,定时扫描策略如下:
- 从过期词典中随机选出20个key
- 删除20个key中已经过期的
- 如果过期的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 拓展内容相关推荐
- 【大厂面试】面试官看了赞不绝口的Redis笔记
文章目录 一.Redis简介 二.Redis API的使用和理解 (一)通用命令 (二)单线程架构 (三)数据结构和内部编码 (四)字符串 (五)hash (字典) (六)列表 (七)Set集合 (八 ...
- 兄弟连NoSQL视频教程 redis笔记
兄弟连NoSQL视频教程 redis笔记 ================================课程目录====================================== 01.N ...
- 【大厂面试】面试官看了赞不绝口的Redis笔记(二)
文章目录 说明 四.Redis的其他功能 (一)慢查询 (二)pipeline (三)发布订阅 (四)Bitmap (五)HyperLogLog (六)GEO 五.Redis持久化的取舍和选择 (一) ...
- 狂神说Redis笔记
以下是狂神Redis笔记,个人觉得总结的很好,故收藏一下,日后再总结一下自己的笔记 ⭐学习时间2022.1.4-2022.1.6 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90 ...
- 初学Oracle的笔记(2)——基础内容(实时更新中..)
续 初学Oracle的笔记(1)--基础内容(实时更新中..) 1.oracle中创建一张表,写法与sql server中的一样. SQL> create table Course 2 ( cn ...
- 【Java Web开发指南】redis笔记
今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis 文章目录 今日内容 Redis 案例: Redis 1. 概念: ...
- 【狂神说】Redis笔记
文章目录 1.Nosql概述 1.1 为什么要用Nosql 1.2 什么是NoSQL 1.3 阿里巴巴演进分析 2.NoSQL的四大分类 3.Redis入门 3.1 概述 3.2 Windows安装 ...
- 【Redis笔记】缓存穿透与缓存击穿以及应对方法
[Redis笔记]缓存穿透与缓存击穿以及应对方法 一.缓存穿透 1. 缓存穿透概念 2. 缓存穿透解决方法 示例代码 二.缓存击穿 1. 缓存击穿概念 2. 缓存击穿解决方法 方法一:互斥锁 示例代码 ...
- 小红书笔记如何发布内容
很多人都在吐糟自己不能发送小红书的笔记本,但很多人对于小红书笔记发不了是为什么,还是找不到原因,其实原因有很多种,小编也不一一给大家介绍了,今天小编给大家演示下正确的小红书笔记发布流程,下面小编就给大 ...
最新文章
- 关于计算机中二进制原码,反码,补码的简要解释
- $.ajax 的async参数在crossdomain跨站下的问题
- Ubuntu 调节屏幕亮度
- SAP 电商云 Spartacus UI feature level directive 的工作原理
- boot spring test 文档_Spring、Spring Boot 和 TestNG 测试指南 ( 3 )
- glDrawElements参数在新旧版本传最后一个参数的不同
- ckeditor5自定义 vue_vue中的富文本编辑器CKEditor5
- 在计算机管理中创建不同的用户,为什么在计算机管理员里创建密码密码总是不符合要求...
- mysql集群方案,保准看明白!
- SQL Server内存泄漏
- 解决求平均值出现加和导致的溢出问题
- centos 7下搭建wiki系统
- 什么是OCR?如何使用OCR文字识别软件?
- Android Studio中ListView通过自定义Adapter显示数据3-1
- 一个简单证件照的设计过程
- 人大、北外、北航三校开启在职硕士(学位)商业数据分析方向 | 报名
- 光驱刻录空盘提示函数不正确
- request与response的笔记梳理
- 计算机图形学方向的基本能力
- 云计算之存储虚拟化 -02
热门文章
- avg最多用多少列 mysql_使用MySQL中的AVG函数求平均值的教程
- python怎么用turtle画圆_在Python中用turtle函数画同心圆
- iphone导出照片到电脑_苹果手机照片删除了怎么恢复?简单方法图文教程
- batch入门教程(3)
- pytorch学习笔记(二十六):NIN
- Anaconda prompt下常用命令
- Ubuntu:如何卸载 vmware player 或 VMWare Workstation
- web服务器一些概念
- CMMI与Agile敏捷开发比较之二:需求管理篇(兼谈用敏捷实现和满足CMMI的ReqM过程域)...
- 排序算法第四篇——冒泡排序