Redis第一关之常规用法

简介

Redis不用多说,已经火了很多年了,也用了很多年了。现在做一些归纳总结。
这篇文章主要介绍Redis的常规知识及用法,包括数据结构、使用场景、特性、过期机制、持久化机制。

Redis与Mysql

Mysql是一款基于磁盘的关系型SQL数据库。
Redis是一款基于内存的、非关系型、Nosql数据库,

Mysql的基本构成结构是二维表,由行和列组成。
Redis的数据存储形式是Key-Value结构,由键和值组成。

相较于传统的RDBMS数据库,NOSQL数据库更满足Web2.0时代数据爆炸式需求。不需要固定的格式,严格的关系,提供高并发性能等等。单NOSQL并不能完全取代传统数据库,因此,RDBMS+NOSQL是最好的方式。

下面具体来分析Redis的数据结构

Redis数据结构

Redis是Key-Value结构,Key值都是单字符串,Value也是字符串,但却有9种数据类型,分别如下:

  1. String(字符串)
  2. List(链表)
  3. Set(无序集合)
  4. ZSet(有序集合)
  5. Hash(哈希)
  6. Geo 地理位置
  7. Bitmaps 位图
  8. HyperLogLog 基数统计

除了最后三种特殊数据结构外,常用的5种数据结构可以按类型分类。

1. 按单、多个字符串分类:
String为单个字符串结构
List、Set、Zset、Hash为多字符串结构2. 在多字符串结构中,再按有序、无序分类
List、ZSet为有序数据结构,其中List底层为链表结构,以插入顺序排序。ZSet通过分数Score来排序。
Set、Hash为无序数据结构,其中Set为无序唯一性集合,会自动去重。

Hash数据结构是以field-value形式,非常适合存储对象结构。同时支持对对象属性的增删。
在这里插入图片描述

Redis应用场景

Redis作为Web2.0时代受欢迎的产物,其基于内存的高性能、过期机制、特殊的数据结构都分别决定了它的用途广泛。

在这里插入图片描述

缓存应用的三大问题

缓存击穿

概念: 缓存将某个或小面积热Key击穿,
造成原因:误操作、缓存过期
解决办法:暂时设置永不过期、增加热点监控

缓存穿透

概念: 请求穿过了缓存,直达缓存后的数据库层,大并发下容易造成数据库宕机,从而影响全局。
造成原因:大并发请求,缓存层未命中,黑客攻击等
解决办法:增加数据有效性校验,对不存在的数据进行Null值缓存,使用布隆过滤器。

缓存雪崩

概念:大面积缓存的key值在同一时间段都未命中
造成原因:key值过期时间过于集中,或者Redis宕机。
解决办法:分散key值得过期时间,通过随机数加权计算。增加Redis高可用性。 

过期时间

在Redis中,很多场景可以通过过期机制来实现。比如短信验证码、七天免登录等。
但是Redis中允许key不设置过期时间,这会让key值永不过期,占用内存。如果不是特殊设计不建议这样使用。

关于Redis的设计缺陷及补丁措施思考

Redis是一款基于内存的数据库,其目的是为了满足快速处理的高并发特性。
但是内存是有物理局限的,它无法像硬盘一样容量可以扩充到很大,也容易受到断电丢失数据影响。
在这里插入图片描述

因此,Redis作者又做了几个补丁。

补丁一:过期机制

如果Redis没有过期机制?

那么意味着,所有存入到内存的数据都是永不过期的,使用完了就得删除,这像是 C++语言开发,而过期机制相当于Java的内存回收机制,操作起来更柔性。

过期机制的底层原理?

Redis内部采用的是定期删除+惰性删除,两种机制相配合保证了最终一定被删除。

定期删除
设置了定时器,每次会取出一部分过期的key进行删除。

为什么不是轮询全部过期的key值?

因为如果内存较大,过期的key值较多,轮询比较耗时,会消耗大量的CPU在轮询上。

那么,未被取出的过期key值如何删除?

惰性删除
惰性删除,类似于java中的类的懒加载,Spring IOC对象的懒加载。
未被定期删除策略命中的过期key,只有当这个key再次被访问时来判断是否要删除。

因此,定期删除+惰性删除策略,一定会删除所有过期的key,但是有一个时间差问题。

某个key值过期了,它的最快删除时间是定期任务第一次扫描就被取出来并删除。它的最慢删除时间是…很久,这取决于定期删除是怎么取出数据的了。

在这里插入图片描述

虽然这些过期的key最终会被删除,但Redis内存容量总是动态变化的,不断的有增量Key,也有不断的删除Key。

在这里插入图片描述
如果:

增量速度 > 删除速度,删除速度>=0(等于0时所有的key都未过期)

Redis内存就会膨胀,逐渐趋于饱和。这时候,那些未被及时删除的过期Key就亟需被找到并删除掉了,作者怎么做的呢?

内存淘汰策略

当出现上述情况时,作者设计了一种内存淘汰机制,使用者可以不同的策略来清理内存,保证Redis能否正常使用。

1. volatile-lru(least recently used) 从设置了过期时间的数据中(server.db[i].expires) 淘汰最近最少被使用的数据。
2. volatile-random 从设置了过期时间的数据中 随机淘汰数据。
3. volatile-lfu 从设置了过期时间的数据中 淘汰最不频繁被使用的数据。4. allkeys-lru 从所有的数据中(server.db[i].dict) 淘汰最近最少被使用的数据。- 常用
5. allkeys-random 从所有的数据中(server.db[i].dict)随机淘汰数据。
6. allkeys-lfu 从所有的数据中(server.db[i].dict)淘汰最不频繁被使用的数据。7. volatile-ttl 从设置了过期时间的数据中(server.db[i].expires)淘汰将要过期的数据。
8. no-eviction 禁止淘汰数据。

补丁二: 持久化机制

Redis毕竟是基于内存的数据库,如果断电了肯定会导致数据丢失。所以设计持久化机制是必然的。

作者设计了两种持久化机制:AOF、RDB

AOF持久化

AOF是一种以记录实时日志的方式,将Redis的每个操作命令持久化,其优点是实时性比较强,可以每秒钟记录一次,其缺点是产生的日志量较大,重启恢复时的耗时较长。

RDB持久化

RDB是一种全量备份模式,将Redis中的所有数据全部备份下来,可以实现备份和迁移。
其优点是产生的数据量较小,重启时可以快速的恢复,其缺点是实时性较弱,容易产生数据丢失。

RDB持久化时,如果发生在Redis运行中,由于数据是动态变化的,因此常见的备份方式是将Redis其他操作阻塞,直到全量备份完成在放行,另一种方式是Redis作者提供的异步备份。

1. 同步备份 save
2. 异步备份 bgsave

异步备份是bgsave命令,其原理是在主进程中fork一个子进程异步执行,不会阻塞主进程操作。

Redis高可用设计

Redis提供了高可用设计,分别是主从模式、哨兵模式、集群模式。

主从模式
Redis数据库的主从模式和Mysql数据库的主从模式类似,都是以容灾备份为目的设计的,因此当Redis主结点发生故障时,可手动切换为从结点提供服务。
主从模式需要两个Redis结点。

哨兵模式

虽然主从模式可以提供容灾备份的功能,但是当发生故障时,需要手动切换,并不智能。 于是,哨兵模式解决了这个问题。

哨兵模式通过哨兵集群监控所有Redis结点,让主结点发生故障时,自动将主节点踢出,然后重新选择一个从节点作为主节点提供服务,保证了高可用性。
哨兵模式最大的优点是故障自动转移,但至少需要3个Redis结点。

群集模式

群集模式提供了Redis分布式数据存储功能,由于单机内存上限的限制,群集模式解决了这个问题,通过数据分片的形式将Redis数据分散到多个结点,实现容量的横向扩展,每个主结点都需要配置一个从结点作为数据容灾备份,以便故障自动转移。
Redis群集模式一般需要3主3从,共6个Redis结点。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何低成本实现商场室内导航地图制作

商场地图导航可提升顾客服务体验,促进商场信息化建设。蜂鸟视图提供两种低成本的商场导航实现方式,以满足不同需求。 一、模拟导航 用户可选用“模拟导航”:将商场CAD图纸导入蜂鸟视图地图编辑器,通过简单操作生成室内3D地图&…

【网络安全 | 网络协议】一文讲清HTTP协议

HTTP概念简述 HTTP(Hypertext Transfer Protocol)协议,又称超文本传输协议,用于传输文本、图像、音频、视频以及其他多媒体文件。它是Web应用程序通信的基础,通过HTTP协议,Web浏览器可以向Web服务器发起请…

代码随想录算法训练营第三十六天|435. 无重叠区间 763.划分字母区间 56. 合并区间

435. 无重叠区间 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 细节: 1. 这道题目和 452.用最少数量的箭引爆气球 ,452中的弓箭数量其实就是 无重叠区间的数量,用总的区间数减去 无重叠区间的数…

vscode 开发代码片段插件

环境准备 node - 20v版本 ,推荐使用nvm进行版本控制全局安装 "yo" 是 Yeoman 工具的命令行工具, npm i yo -g全局安装 generator-code 是一个 Yeoman 脚手架 gernerator-code npm i gernerator-code -g全局安装 npm install -g vsce官方文档 …

使用openai-whisper实现语音转文字

使用openai-whisper实现语音转文字 1 安装依赖 1.1 Windows下安装ffmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 # ffmpeg官网 https://ffm…

Unity之闪电侠大战蓝毒兽

目录 🎨一、创建地形 🎮二、创建角色 🏃2.1 动画 🏃2.2 拖尾 🏃2.3 角色控制 ​🏃2.4 技能释放 🏃2.5 准星 📱三、创建敌人 🐲3.1 选择模型 🐲3.…

Netty Review - NIO空轮询及Netty的解决方案源码分析

文章目录 Pre问题说明NIO CodeNetty是如何解决的?源码分析入口源码分析selectCntselectRebuildSelector Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty Review - 服务端channel注册流程源码解析 问题说明 N…

专题十一、指针和数组

指针和数组 1. 指针的算术运算1.1 指针加上整数1.2 指针减去整数1.3 两个指针相减1.4 指针比较1.5 指向复合常量的指针 2. 指针用于数组处理3. 用数组名作为指针3.1 数组型实际参数(改进版)3.2 用指针作为数组名 4. 指针和多维数组4.1 处理多维数组的元素…

log4j2的使用

基础用法 1. pom文件导入依赖 junit用来做测试 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.5</version></dependency><dependency><groupId>org.…

国际网络专线多少钱一年

国际网络专线作为企业扩展业务的重要通信渠道&#xff0c;已经成为许多企业不可或缺的选择。然而&#xff0c;对 于许多企业来说&#xff0c;选择一条稳定、高质量的国际网络专线&#xff0c;并不是一件容易的事情。那么&#xff0c;国际 网络专线到底多少钱一年呢&#xff1f;…

BGP 邻居建立

拓扑图 配置 BGP进程号及为AS号 使用环回口建立BGP邻居关系时&#xff0c;需要指定更新源地址 EBGP在使用环回口建立邻居关系时&#xff0c;需配置EBGP多跳&#xff0c;环回口路由可达 EBGP的路由器存在IBGP邻居时&#xff0c;需要配置next-hop-local&#xff0c;保证下一跳…

适合tiktok运营的云手机需要满足什么条件?

TikTok作为一款全球热门的社交媒体平台&#xff0c;具有无限的市场潜力。然而&#xff0c;卖家在运营过程中常常会面临到视频0播、账号被降权、限流等问题&#xff0c;甚至可能因为多人同时使用一个IP而导致封号的风险。为了规避这些问题&#xff0c;越来越多的卖家将目光投向了…

C语言—指针(2)

回原点(......?)当我没讲&#xff0c;好难 1. 编写函数,要求用指针做形参&#xff0c;实现将二维数组(行列相同)的进行转置&#xff08;行列数据互换&#xff09;&#xff1a; ...不会写 /*1. 编写函数,要求用指针做形参&#xff0c;实现将二维数组(行列相同)的进行转置&a…

看小姐姐的效果棒极了,写了一个工具,逐帧解析视频转成图片,有没有带上商业思维的小伙伴一起研究下

一个突然的想法&#xff0c;促成了这个项目雏形。 原理是&#xff1a; 上传一个视频&#xff0c;自动将视频每一帧保存成图片 然后前端访问 就能实现如图效果 后端是python/flask 数据库mysql 前端uniapp 项目演示&#xff1a; xt.iiar.cn 后端代码如下&#xff1a; #学习…

【C深剖】数组名的细节

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 引言&#xff1a;我想我说的这个数组名细节可能很多人并没有留意&#xff0c;现在先来C设计者这样设计也很合理。 就是数组名本质上是一个指针&#xff0c;但是这个指针的内容也就是说指向的空间是固定的&#xff0c…

unplugin-vue-components解决命名冲突

我们在vue项目中通常会利用unplugin-vue-components插件进行自定义组件的自动引入 注&#xff1a;如果不知道怎么配置unplugin-vue-components插件&#xff0c;欢迎看我整理的这篇&#xff1a; vue3项目配置按需自动引入自定义组件unplugin-vue-components 当出现同名文件时&a…

先进电机技术——感应电机与同步电机

一、感应电机 感应电机&#xff08;Induction Motor&#xff09;是一种广泛应用的交流电动机&#xff0c;其工作原理基于电磁感应定律。在感应电机中&#xff0c;定子绕组连接到电源后会因通入的交流电而产生一个旋转磁场。这个磁场在空间中是连续变化并以恒定的速度&#xff…

【医学大模型】Text2MDT :从医学指南中,构建医学决策树

Text2MDT &#xff1a;从医学指南中&#xff0c;构建医学决策树 提出背景Text2MDT 逻辑Text2MDT 实现框架管道化框架端到端框架 效果 提出背景 论文&#xff1a;https://arxiv.org/pdf/2401.02034.pdf 代码&#xff1a;https://github.com/michael-wzhu/text2dt 假设我们有一…

算法-矩阵置零

1、题目来源 73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1…

机器学习---规则学习(一阶规则学习、归纳逻辑程序设计)

1. 一阶规则学习 “一阶”的目的&#xff1a;描述一类物体的性质、相互关系&#xff0c;比如利用一阶关系来挑“ 更好的”瓜&#xff0c;但实际应用 中很难量化颜色、 …、敲声的属性值。一般情况下可以省略全称量词。 命题逻辑&#xff1a;属性-值数据 色泽程度&#xff1a…