redis的数据结构,内存处理,缓存问题

redisObject

redis任意数据的key和value都会被封装为一个RedisObject,也叫redis对象:

这就redis的头信息,占有16个字节

redis中有两个热门数据结构

1.SkipList,跳表,首先是链表,和普通链表有以下差异:

  • 元素按照升序排列存储
  • 节点可能包含多个指针,指针跨度不同

那么跳表的特点有以下:

  • 跳跃表是一个有序的双向链表
  • 每个节点都可以包含多层指针,层数是1到32之间的随机数
  • 不同层指针到下一个节点的跨度不同,层级越高,跨度越大
  • 增删改查效率与红黑树基本一致,实现却更加简单。但空间复杂度更高

2.Sorted数据结构的特点:

  • 每组数据都包含score和memeber
  • memeber唯一
  • 可根据score排序

所以SortedSet的底层数据结构是怎么样的?

  • 首先SortedSet需要能存储score和memeber值,而且要快捷的根据member查询score,因此底层有一个哈希表,以member为键,以score为value
  • 其次StoredSet还需要能根据score排序,因此底层还维护了一个跳表
  • 当需要根据member查询score时,就去哈希表中查询
  • 当需要根据score排序查询时,则基于跳表查询

内存处理

1. 过期key处理

redis的本身是键值型数据库,其所有数据都存在一个redisDB的结构体中,其中包含两个哈希表:

  • dict:保存Redis中所有的键值对
  • expires:保存Redis中所有的设置了过期时间的KEY及其到期时间(写入时间+TTL)

        Redis是何时删除过期KEY的呢?

        Redis并不会在KEY过期时立刻删除KEY,因为要实现这样的效果就必须给每一个过期的KEY设置时钟,并监控这些KEY的过期状态。无论对CPU还是内存都会带来极大的负担。

Redis的过期KEY删除策略有两种:

  • 惰性删除

  • 周期删除

        惰性删除,顾明思议就是过期后不会立刻删除。那在什么时候删除呢?

Redis会在每次访问KEY的时候判断当前KEY有没有设置过期时间,如果有,过期时间是否已经到期。

        周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:

  • SLOW模式:Redis会设置一个定时任务serverCron(),按照server.hz的频率来执行过期key清理

  • FAST模式:Redis的每个事件循环前执行过期key清理(事件循环就是NIO事件处理的循环)。

2. 内存淘汰策略

Redis支持8种不同的内存淘汰策略:

  • noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。

  • volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰

  • allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选

  • volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。

  • allkeys-lru: 对全体key,基于LRU算法进行淘汰

  • volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰

  • allkeys-lfu: 对全体key,基于LFU算法进行淘汰

  • volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰

比较容易混淆的有两个算法:

  • LRULeast Recently Used),最近最久未使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

  • LFULeast Frequently Used),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。


缓存问题

1.缓存一致性

我们采用Cache aside方案,这个方案就是由业务开发者在更新数据库的同时,更新缓存。

        如果是查询操作,假如先查到redis,redis中没有,那就查数据库,然后把这个数据缓存在redis,并设置TTL。如果是增加数据,那么之间不用管redis,等下一次查到这个数据的时候,再缓存在reids中,如果是删除和修改,那就直接把redis中的这个数据删除掉,等下一次查询的时候再做缓存。但是这个是由线程安全问题的,假如有一个线程在做修改操作,那么它先会把redis中的数据删除,然后这时有另一个线程执行查询操作,查询操作看redis中没有这个数据,就去把数据库的旧数据又缓存在redis中,这时,上一个线程又把数据库的数据修改了,那么这时redis和数据库就出现了数据不一致问题。然后这个问题的出现是由于先删除redis,再操作数据库。那么我们先操作数据库,再操作redis,就不会出现数据不一致了。

所以缓存一致性策略的最佳实践方案:

1. 低一致性要求:使用redis的key过期清理方案

2. 高一致性需求:主动更新,并以超时剔除作为兜底方案

        读操作:

                缓存命中直接返回

                缓存未命中则查询数据库,并写入缓存,设定超时时间

        写操作:

                先写到数据库,然后再删除缓存

                要确保数据库与缓存操作的原子性(同时成功或失败)

2. 缓存穿透

        由于数据库中不存在该数据,那么缓存中肯定也不存在。因此不管请求该数据多少次,缓存永远不可能建立,请求永远会直达数据库。此为缓存穿透。

        那么解决这个问题有两种方案:缓存空值和布隆过滤器

缓存空值实现起来简单,但是有额外的内存消耗

布隆过滤首先需要一个很长的bit数组,默认数组中每一位都是0

然后还需要Khash函数,将元素基于这些hash函数做运算的结果映射到bit数组的不同位置,并将这些位置置为1,例如现在k=3:

  • hello经过运算得到3个角标:1、5、12

  • world经过运算得到3个角标:8、17、21

  • java经过运算得到3个角标:17、25、28

此时,我们要判断元素是否存在,只需要再次基于Khash函数做运算, 得到K个角标,判断每个角标的位置是不是1:

  • 只要全是1,就证明元素存在

  • 任意位置为0,就证明元素一定不存在

假如某个元素本身并不存在,也没添加到布隆过滤器过。但是由于存在hash碰撞的可能性,这就会出现这个元素计算出的角标已经被其它元素置为1的情况。那么这个元素也会被误判为已经存在。

因此,布隆过滤器的判断存在误差:

  • 当布隆过滤器认为元素不存在时,它肯定不存在

  • 当布隆过滤器认为元素存在时,它可能存在,也可能不存在

bit数组越大、Hash函数K越复杂,K越大时,这个误判的概率也就越低。由于采用bit数组来标示数据,即便4,294,967,296bit位,也只占512mb的空间

3. 缓存雪崩

        缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。       

常见的解决方案有:

  • 给不同的Key的TTL添加随机值,这样KEY的过期时间不同,不会大量KEY同时过期

  • 利用Redis集群提高服务的可用性,避免缓存服务宕机

  • 给缓存业务添加降级限流策略,降级就是直接拒绝一部分请求,当然必要情况也可以熔断服务

  • 给业务添加多级缓存,比如先查询本地缓存,本地缓存未命中再查询Redis,Redis未命中再查询数据库。即便Redis宕机,也还有本地缓存可以抗压力

4. 缓存击穿

        缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。(因为这个重建缓存的时间比较长,这段时间内,还有其他很多的线程来访问,那么这些线程都是打到了数据库那一层面,造成数据库压力猛然飙升)

常见的解决方案有两种:

  • 互斥锁:给重建缓存逻辑加锁,避免多线程同时指向

  • 逻辑过期:热点key不要设置过期时间,在活动结束后手动删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551578.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

前端工程规范-2:JS代码规范(Prettier + ESLint)

Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具,它们结合起来可以提供以下作用和优势: 代码格式化和风格统一: Prettier 是一个代码格式化工具,能够自动化地处理代码的缩进、空格、换行等格式问题,…

【STM32单片机_(HAL库)】4-2【定时器TIM】定时器输出PWM配置步骤

PWM介绍 PWM波形(Pulse Width Modulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。 频率 1/Ts 占空比 Ton / Ts 分辨率 占空比变化步距 定时器输出PWM配置

2024年十大热门人力资源管理系统对比与推荐

本文介绍了ZohoPeople、金蝶云、用友、北森等10款热门HRMS系统,包括各自特点如ZohoPeople的全球化管理、北森的全面人才管理等。建议企业先试用再决定购买,以找到最适合的系统。 一、Zoho People Zoho People 是一个基于云的全球化人力资源管理系统 (HR…

啤酒在文学中的浪漫形象:精酿啤酒的诗意之旅

在文学的浩瀚星空中,啤酒并非仅仅是醉人的琼浆,它更是一种情感的载体,一种浪漫的符号。尤其是当提及Fendi Club精酿啤酒时,我们仿佛能闻到那从古老酒窖中飘出的馥郁香气,感受到它在文字间流淌的诗意与温情。 一、啤酒…

鸿蒙开发(NEXT/API 12)【请求用户授权】手机侧应用开发

为保护用户隐私,Wear Engine的API需要用户授权才可以正常访问。建议开发者在用户首次调用Wear Engine开放能力的时候执行本章节操作。 申请用户穿戴设备权限 应用拉起华为账号登录和授权界面,由用户授权相应的数据访问权限。用户可以自主选择授权的数据…

建筑中的文化表达与地方特色:演绎地域之魂

在浩瀚的城市风貌中,每一座建筑都是文化的载体,无声地讲述着地域的故事与精神。建筑不仅需要满足功能需求,更应成为文化传承与创新的舞台。本文旨在深度剖析建筑设计如何在尊重与弘扬地方文化的基础上,巧妙融合现代元素&#xff0…

【含文档】基于Springboot+Vue的公园管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

前端css样式设置元素的绝对定位和相对定位,要注意宽度和高度的设置

vue3子div position absolute,父div positon relative 。如果不设置子div的 width 和height,那么子div中如果数据变长,子div相对父div位置会变化。子div数据超过&#xff0c;显示... 如何实现 <template><div class"parent"><div class"child&q…

开源实战分享 | 新书:《大型语言模型实战手册》随书代码分享

《大型语言模型实战手册》(英文版)目前电子版在亚马逊有售&#xff0c;纸质版预计在2024年10月15日开售。该书通过超过275张定制插图&#xff0c;深入探索大型语言模型的世界&#xff0c;为Python开发者提供使用大型语言模型所需的实用工具和概念。 如果对于插图没有特别执念的…

商务英语口语柯桥外语学习|ass是“屁股”,save是“救”,那 save my ass是什么意思?

有些人活着&#xff0c;屁股却已经“死”了 工作工作&#xff0c;上工就“坐”&#xff0c;“久坐”几乎是无法避免的事情&#xff0c;但你知道吗&#xff0c;长期久坐可能会患上死臀综合症&#xff08;Dormant Butt Syndrome&#xff09;&#xff01; 如果你坐久了就觉得屁股痛…

PCL库简单的icp配准

#include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/registration/icp.h>int main(int argc, char** argv) {// 确保提供了两个PCD文件作为输入if (argc ! 3) {PCL_ERROR("请提供两个PCD文件作为输入。\n");return (-1);}// …

Spring系列 BeanPostProcessor

文章目录 BeanPostProcessor注册时机执行时机 InstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessor 本文源码基于spring-beans-5.3.31 参考&#xff1a;https://docs.spring.io/spring-framework/reference/core/beans/factory-extension.html#beans…

C#实战|人员管理系统[1]:项目主体框架如何搭建

哈喽,你好啊,我是雷工! 有人的地方就有江湖,有江湖的地方就得用人员管理系统,今天开始练习实现一个人员管理系统。 以下为练习笔记。 01 UI层 这里使用的版本是:VS2022 创建一个Windows窗体应用程序,命名为:PeopleManger 可以添加一个通用类文件夹,集中放置通用的一些…

mybatis-plus ==> 入门教程

文章目录 为什么要学呢&#xff1f;注意事项 简单入门案例配置日志雪花算法更改 ID 的方法 CRUD插入&#xff08;不解释了&#xff0c;代码非常简单&#xff09;更新查询&#xff08;批量查询&#xff09;按条件查询分页查询删除&#xff08;批量、通过条件、逻辑删除&#xff…

AutoSar 通信服务架构,CAN通信诊断详解

文章目录 Com&#xff08;通信服务模块&#xff09;PDU的定义和结构PDU的分类IPDU Mux 模块PDU R 模块&#xff08;路由&#xff09;Bus TP 模块BUS InterfaceCanIf模块LinIf模块 发送数据示例&#xff08;CAN报文&#xff09;接收数据示例&#xff08;CAN报文&#xff09;通信…

基于SpringBoot的休闲娱乐代理售票系统设计与实现

1.1研究背景 21世纪&#xff0c;我国早在上世纪就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统&#xff0c;由从今传统的管理模式向互联网发展&#xff0c;如今开发自己的系统是理所当然的。那么开发休闲娱乐代理售票…

CSS外边距

元素的外边距&#xff08;margin&#xff09;是围绕在元素边框以外&#xff08;不包括边框&#xff09;的空白区域&#xff0c;这片区域不受 background 属性的影响&#xff0c;始终是透明的。 为元素设置外边距 默认情况下如果不设置外边距属性&#xff0c;HTML 元素就是不会…

北京中实新材料:携手知名建筑企业,共筑重大工程辉煌篇章

近年来,北京中实新材料有限责任公司(以下简称“北京中实”)凭借其卓越的产品质量、专业的技术服务和良好的市场信誉,积极参与了一系列重大工程项目的建设,与多家知名建筑企业建立了长期稳定的合作关系,共同书写了城市发展的辉煌篇章。 深耕行业,铸就品质基石 自成立以来,北京中…

悬浮提词器免费版,5款便捷软件分享推荐

在这个信息爆炸、内容为王的时代&#xff0c;无论是直播带货、视频创作还是公开演讲&#xff0c;流畅自然的表达都是吸引观众的关键。然而&#xff0c;面对镜头时忘词卡顿却成了不少人的“心头痛”。今天&#xff0c;就给大家揭秘五款完全免费的悬浮提词器软件&#xff0c;它们…

MyBatis的注入问题

对之前文章的补充&#xff1a;MyBatis中的#{}与${}注入问题----原文链接 前言&#xff1a; MyBatis是一个流行的Java持久层框架&#xff0c;用于将对象与数据库中的数据进行映射。然而&#xff0c;如果不当使用&#xff0c;MyBatis也可能受到诸如SQL注入这类的安全问题的影响。…