【高频】redis快的原因

相关问题:

1.为什么Redis能够如此快速地进行数据存储和检索?

2.Redis作为内存数据库,其内存存储有什么优势吗?

3.Redis的网络模型有何特点,如何帮助提升性能?

一、问题回答

  • Redis使用了内存数据结构,例如字符串、哈希表、列表、集合、有序集合等,这些数据结构在内存中操作速度很快,有助于Redis的高性能。

  • Redis采用单线程模型,避免了多线程的线程切换和同步开销,提高了处理速度。

  • Redis使用了非阻塞I/O,可以在一个线程中处理多个客户端请求,提高了并发处理能力。

  • Redis支持多种持久化方式,包括RDB快照和AOF日志,可以根据需要选择合适的持久化方式,同时保证数据安全和性能。

  • Redis主要是基于内存操作,避免了频繁的磁盘IO操作,从而提高了读写性能。

二、redis的数据类型

1.String:主要用来存储字符串,底层基于动态字符串SDS实现,其通过动态调整长度节省内存。

场景:分布式锁session、分布式锁。  指令:set, hget, setnx, set ex

2.hash:类似于map,底层采用两种方式,当数据量较少并且元素占用内存少(小整数或短字符串时)采用ziplist(压缩列)。

场景:实现购物车    指令:hset, hgetall, hdel

3.list:有序可重复集合,当数据量少并且元素占用内存少,用ziplist,反之用quicklist(快速列表),节省内存。

【ziplist: 连续内存空间,通过紧凑的存储来节省空间。 quicklist:基于ziplist和链表,节省内存,高效增删】

场景:栈(LPush+Lpop) \ 队列(Lpush + Lpop) \ 发布订阅

4.set:元素不可重复,当数据量少且元素为整,用intset(整数集合),反之用hashtable(哈希表)。

【intset:有序数组,紧凑空间。 hashtable:基于dict(字典)实现,采用拉链表解决。】

场景:抽奖(srandmember) \点赞收藏关注(sadd) \共同关注(sinter)\可能认识的人(sdiff)

5.zset(sorted set):有序不可重复,数据量少用ziplist,反之skiplist(跳表)+dict(字典)。

【skiplist:有序链表配上多级索引,通过多级索引位置的跳转实现快速查找元素,按分值排序。】

场景:排行榜(zrange\zreverange\zunionscore)

6.bitmap:位图。

场景: 月打卡、月活跃、布隆过滤器

7.stream:参考kafka设计的消息队列,支持持久化,适合小基数的消息队列场景。

三、Reactor模型

Reactor 模式也叫 Dispatcher 模式,即 I/O 多路复用监听事件,收到事件后,根据事件类型分配(Dispatch)给某个进程 / 线程

1.单线程模式:一个线程负责多个事件处理,当连接数过多时会造成性能瓶颈,适合连接数少,复杂度低的场景。

2.多线程模式(单线程、工作线程池):在单线程的基础上,将业务处理部分交给了线程池提高并发能力,需要注意线程安全。

3.主从多线程模式:将整体拆分为主、从Reactor

  • 主:负责监听连接事件,将事件分发给从Reactor去处理。
  • 从:负责与客户端读写操作,充分利用多核CPU,提升并发。

四、IO多路复用

一种同步IO模型,允许单线程去同时监听多个文件描述符,一旦文件描述符就绪就会通知程序处理。【多个请求复用了一个进程,这就是多路复用】

select/poll/epoll 内核提供给用户态的多路复用系统调用,进程可以通过一个系统调用函数从内核中获取多个事件

  • select:基于数组实现,每次调用都进行遍历,最大连接有上限。
  • poll:基于链表实现,无最大连接上限。
  • epoll:通过哈希表实现,通过事件通知,当IO事件就绪,系统注册的回调函数就被调用,无上限。【epoll 支持两种事件触发模式,分别是边缘触发(edge-triggered,ET水平触发(level-triggered,LT

注:(以下摘自:这次答应我,一举拿下 I/O 多路复用!)

1.poll 和 select 并没有太大的本质区别,都是使用「线性结构」存储进程关注的 Socket 集合,因此都需要遍历文件描述符集合来找到可读或可写的 Socket,时间复杂度为 O(n),而且也需要在用户态与内核态之间拷贝文件描述符集合,这种方式随着并发数上来,性能的损耗会呈指数级增长。

2.epoll 通过两个方面,很好解决了 select/poll 的问题。

  • epoll 在内核里使用红黑树来跟踪进程所有待检测的文件描述字,把需要监控的 socket 通过 epoll_ctl() 函数加入内核中的红黑树里,红黑树是个高效的数据结构,增删查一般时间复杂度是 O(logn),通过对这棵黑红树进行操作,这样就不需要像 select/poll 每次操作时都传入整个 socket 集合,只需要传入一个待检测的 socket,减少了内核和用户空间大量的数据拷贝和内存分配。
  • epoll 使用事件驱动的机制,内核里维护了一个链表来记录就绪事件,当某个 socket 有事件发生时,通过回调函数内核会将其加入到这个就绪事件列表中,当用户调用 epoll_wait() 函数时,只会返回有事件发生的文件描述符的个数,不需要像 select/poll 那样轮询扫描整个 socket 集合,大大提高了检测的效率。

五、持久化机制

1.RDB 就是 Redis DataBase 的缩写,中文名为快照/内存快照,RDB持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。【自动触发 和 手动触发】

2.Redis是“写后”日志,Redis先执行命令,把数据写入内存,然后才记录日志。日志里记录的是Redis收到的每一条命令,这些命令是以文本形式保存。PS: 大多数的数据库采用的是写前日志(WAL),例如MySQL,通过写前日志和两阶段提交,实现数据和逻辑的一致性。 【而AOF日志采用写后日志,即先写内存,后写日志。 】

  • RDB:通过快照进行持久化,通过快照触发条件将内存中的数据写到rdb文件中。
  • AOF:一种接近实时的方式,通过执行命令都写到AOF中。

很少使用RDB,因为它容易丢失数据,通常会采用AOF,但AOF持久化速度慢,故混合使用。

RDB全量持久化 + AOF增量持久化

  1. 若数据不敏感,可不开启持久化
  2. 数据比较重要且允许几分钟数据丢失用RDB
  3. 作为内存数据,建议都开启,优先从AOF中进行数据恢复,因为它数据更完整。

详细了解:Redis进阶 - 持久化:RDB和AOF机制详解 | Java 全栈知识体系

六、基于内存操作

内存直接由 CPU 控制,也就是 CPU 内部集成的内存控制器,所以说内存是直接与 CPU 对接,享受与 CPU 通信的最优带宽。Redis 将数据存储在内存中,读写操作不会因为磁盘的 IO 速度限制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pycharm中,出现SyntaxError: Non-ASCII character ‘\xe4‘ in file... 的问题以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 在pycharm中,使用python中编写中文字符时,会提示如下错误信息: SyntaxError: Non-ASCII character \xe4 in file ...... on line 8, but no encoding declared; see http://python.org/dev…

TypeScript-初识

TypeScript 是具有类型语法的JavaScript&#xff0c;是一门强类型的编程语言 变量不能做随意类型赋值 好处&#xff1a; 1️⃣ 静态类型检查&#xff0c;提前发现代码错误 function arrToStr(arr: Array<string>){return arr.join() } arrToStr(123) // 类型“stri…

网页版应用授权的核心难点

Web应用的出现 随着数字化时代发展&#xff0c;越来越多的企业开始关注工业软件上云。这种趋势不仅满足了企业对于提高生产效率、降低运维成本的需求&#xff0c;还帮助企业更好地应对市场竞争、实现产业升级和智能制造。 在软件上云的过程中&#xff0c;会产生新产品形态和新…

2024 京麟ctf -MazeCodeV1

文章目录 检查代码思路一个字节的指令注意附上S1uM4i佬们的exp https://www.ctfiot.com/184181.html 检查 代码 __int64 __fastcall check_solve(char *a1) {__int64 result; // rax__int64 v2; // rax__int64 index_step; // rax__int64 v4; // rax__int64 v5; // rax__int64…

贪心(临项交换)+01背包,蓝桥云课 搬砖

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0搬砖 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 将物品按照w[i] v[i]升序排序然后跑01背包就是答案 下面证明&#xff1a;&#xff08;不要问怎么想到的&#xff0c;做题多了就能想到&#xff…

一致性hash算法原理图和负载均衡原理-urlhash与least_conn案例

一. 一致性hash算法原理图 4台服务器计算hash值图解 减少一台服务3台服务器计算hash值图解 增加一台服务器5台服务器计算hash值图解 二. 负载均衡原理-urlhash与least_conn 2.1.urlhash案例 # urlhash upstream tomcats {hash $requ

5分钟教你APP变现,让商业浪潮为你助力!

在这个数字时代&#xff0c;几乎每个人都有一个或多个应用程序&#xff08;APP&#xff09;的想法&#xff0c;它们可能是为了解决特定问题&#xff0c;提供娱乐或简化日常任务。然而&#xff0c;许多开发者面临的最大挑战之一是如何将这些创意转化为盈利的商业模式。本文将探讨…

idea+tomcat+mysql 从零开始部署Javaweb项目(保姆级别)

文章目录 新建一个项目添加web支持配置tomcat优化tomcat的部署运行tomcatidea数据库连接java连接数据库 新建一个项目 new project&#xff1b;Java&#xff1b;选择jdk的版本&#xff1b;next&#xff1b;next&#xff1b;填写项目名字&#xff0c;选择保存的路径&#xff1b;…

基于GO 写的一款 GUI 工具,M3u8视频下载播放器-飞鸟视频助手

M3u8视频下载播放器-飞鸟视频助手 M3u8视频飞鸟视频助手使用m3u8下载m3u8 本地播放 软件下载地址m3u8嗅探 M3u8视频 M3u8视频格式是为网络视频播放设计&#xff0c;视频网站多数采用 m3u8格式。如腾讯&#xff0c;爱奇艺等网站。 m3u8和 mp4的区别&#xff1a; 一个 mp4是一个…

HTTP Basic Access Authentication Schema

HTTP Basic Access Authentication Schema 背景介绍流程安全缺陷参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 HTTP Basic Access Authentication Schema&#xff0c;HTTP 基本访问认证模式…

JavaScript-JavaWeb

目录 什么是JavaScript? js引入方式 js基础语法 书写语法 变量 数据据类型 运算符 类型转换 流程语句 js函数 js对象 1.Array 2.String 3.JSON js事件监听 什么是JavaScript? ● JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能…

【busybox记录】【shell指令】readlink

目录 内容来源&#xff1a; 【GUN】【readlink】指令介绍 【busybox】【readlink】指令介绍 【linux】【readlink】指令介绍 使用示例&#xff1a; 打印符号链接或规范文件名的值 - 默认输出 打印符号链接或规范文件名的值 - 打印规范文件的全路径 打印符号链接或规范文…

英语学习笔记29——Come in, Amy!

Come in, Amy! 进来&#xff0c;艾米&#xff01; shut v. 关严 区别&#xff1a;shut the door 把门关紧 口语&#xff1a;Shut up! 闭嘴&#xff01;    态度强硬&#xff0c;不礼貌 例句&#xff1a;请不要把门关严。    Don’t shut the door, please. bedroom n. …

内存函数<C语言>

前言 前面两篇文章介绍了字符串函数&#xff0c;不过它们都只能用来处理字符串&#xff0c;C语言中也内置了一些内存函数来对不同类型的数据进行处理&#xff0c;本文将介绍&#xff1a;memcpy()使用以及模拟实现&#xff0c;memmove()使用以及模拟实现&#xff0c;memset()使用…

关于微信小程序低功耗蓝牙ECharts实时刷新(涉及自定义缓冲区)

简单的蓝牙显示&#xff08;串口手动发数据测试&#xff09; 最近搞了这方面的东西&#xff0c;是刚刚开始接触微信小程序&#xff0c;因为是刚刚开始接触蓝牙设备&#xff0c;所以这篇文章适合既不熟悉小程序&#xff0c;又不熟悉蓝牙的新手看。 项目要求是获取到蓝牙传输过来…

A 股涨停板实时数据 API 数据接口

A 股涨停板实时数据 API 数据接口 股票 / A股 / 涨停数据&#xff0c;所有A股涨停板实时数据&#xff0c;A 股涨停数据 / 实时数据。 1. 产品功能 支持所有 A 股涨停板实时数据查询&#xff1b;包含 A 股实时交易多项指标数据&#xff1b;毫秒级查询性能&#xff1b;全接口支…

继电器的选型和英应用

如何保证信号的稳定&#xff1f; 怎么消除继电器触点的电弧&#xff1f; 危害&#xff1a; 继电器的触点在动作时容易产生电弧&#xff0c;电弧具有热效应容易导致触点烧蚀粘接&#xff0c;缩短继电器的寿命&#xff0c;并且产生电弧的过程中会对外进行电磁辐射&#xff0c;…

vmware中Ubuntu虚拟机和本地电脑Win10互相ping通

初始状态 使用vmware17版本安装的Ubuntu的20版本&#xff0c;安装之后什么配置都要不懂&#xff0c;然后进行下述配置。 初始的时候是NAT&#xff0c;没动的. 设置 点击右键编辑“属性” 常规选择“启用”&#xff1a; 高级选择全部&#xff1a; 打开网络配置&#xff0c;右键属…

2024.05.29学习记录

1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成

用户接入和认证技术

一、用户接入和认证配置 称为网络接入控制&#xff0c;通过对接入网络的客NAC (Network Admission Control)户端和用户的认证保证网络的安全&#xff0c;是一种“端到端”的安全技术。包括802.1x认证、MAC认证与Portal认证。 二、三种认证方式简介 1、Portal认证 Portal认证通…