当前位置: 首页 > news >正文

【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录

1.既然redis那么快,为什么不用它做主数据库,只用它做缓存?

2.Redis 一般在什么场合下使用?

 3.redis为什么这么快?

4.Redis为什么要引入了多线程?


1.既然redis那么快,为什么不用它做主数据库,只用它做缓存?

redis设计者的初衷,就只是为了存储小量级的共享数据

所以,他敢直接单线程直接干上去,因为数据量小,所以够快。

因此,一旦碰到大key的情况, redis的风险就来了。

我曾经遇到过,用redis做队列,产生了大key,然后导致主服务器阻塞。

接下里引发了集群的客观下线,数据全面紊乱。

试想一下,如果用redis存储个千万级别的数据,那select一下,是不是其他线程都别玩了。

ok,你可以说,那咱们搞个多线程版的redis不就解了。

但别忘了,关系型数据库,牛逼之处就是对事务的管控,比如mysql的mvcc。

那redis有这些东西吗?它没有啊。

那强行上车,到时候各种脏读,不可重复读,幻读全来了。

何必呢,有mysql这种现成的产品,何必为了追求那一点效率,去回炉重造呢?

2.Redis 一般在什么场合下使用?

Redis 是一种开源的、支持网络、基于内存、可持久化的键值数据库。常用于在高并发、高性能场景下进行缓存、消息队列、计数器、排序等操作。

  1. 缓存:Redis 的读写性能非常高,适合做缓存。
  2. 消息队列:Redis 支持发布订阅模式,可以作为消息队列使用。
  3. 计数器:Redis 支持原子计数器操作,可以用来统计网站的访问量等。
  4. 排序:Redis 支持对数据进行排序,可以用来做排行榜等应用。



 3.redis为什么这么快

Redis 之所以被认为是快速的原因有以下几点:

内存存储:Redis 将数据存储在内存中,这使得它能够提供快速的读写操作。与传统的磁盘存储相比,内存存储的访问速度更快,因为它无需进行磁盘 I/O 操作。

单线程模型:Redis 使用单线程模型来处理所有的客户端请求。这样可以避免多线程之间的上下文切换开销和锁竞争,使得请求的处理更加高效。此外,单线程模型还简化了 Redis 的实现和维护。

非阻塞 I/O:Redis 使用非阻塞的网络 I/O 模型,通过使用事件驱动的方式处理客户端请求。它利用操作系统提供的 epoll、kqueue 等机制,在单线程中同时处理多个客户端连接,避免了传统阻塞 I/O 的等待时间,提高了并发性能。

简单数据结构:Redis 提供了一些简单而高效的数据结构,如字符串、哈希表、列表、集合和有序集合等。这些数据结构的实现经过了优化,能够在常数时间内执行大多数操作,如插入、删除和查找等。

持久化选项:Redis 提供了多种持久化选项,包括快照(snapshot)和日志(append-only file)。通过将数据保存到磁盘上的文件,可以在重启后快速恢复数据,保证数据的持久性。

高效的操作:Redis 提供了丰富的命令和功能,可以通过一条命令完成复杂的操作。例如,它支持原子操作、批量操作、管道操作和事务等,这些操作可以减少网络往返次数,提高了性能。

4.Redis为什么要引入了多线程?

1、线程是什么?

线程是操作系统能够进行运算调度的最小单位,换句话说线程就是cpu调度的最小单位。在多线程编程中,线程是程序执行的流程,每个线程都有自己的执行路径和上下文,并且可以独立执行和同步与其他线程。

2、使用线程带来的好处?

  • 并发处理:线程可以让程序同时执行多个任务,实现并发处理。多线程可以充分利用多核处理器的优势,提高系统的处理能力。
  • 资源共享:线程可以共享进程的资源,如内存、文件等。这样可以减少资源的重复创建和占用,提高系统的效率和性能。
  • 提高响应性:通过多线程,可以将耗时的操作和阻塞任务放在后台线程中处理,保持主线程的响应性,提高用户体验。

3、Redis引入线程后的好处?

  • 并发处理能力:Redis是一个高性能的缓存和数据存储系统,引入多线程可以提高其并发处理能力,同时处理多个客户端请求,减少请求的排队等待时间。
  • 提高吞吐量:通过多线程处理客户端请求,Redis可以同时执行多个命令,提高系统的吞吐量,加快数据处理速度。
  • 高效利用资源:Redis引入线程后,可以更好地利用多核处理器的性能,充分发挥硬件资源的优势,提高系统的效率和性能。

总的就是redis引入多线程可以提高并发处理能力和性能,能够更好地应对高并发的请求,而且能充分利用多核处理器的性能,提高系统的吞吐量和响应速度。多线程还可以优化资源的利用和提高系统的效率,好好处多多。

另外很多人有个误解redis 不是单线程的吗?怎么并发处理?

这是对于Redis的误解。事实上,Redis在处理客户端请求时采用了单线程的模型,但这并不意味着它不能并发处理。

Redis之所以可以并发处理,主要有以下几个原因:

  • 非阻塞式I/O:Redis使用了非阻塞式的网络I/O模型,通过异步地处理网络请求,减少了对于阻塞等待的需求,提高了系统的并发处理能力。
  • 高速内存访问:Redis将数据存储在内存中,并通过内存访问来处理请求,相比于磁盘访问,内存访问更快速,能够更快地响应客户端请求。
  • 单线程模型的优化:虽然Redis使用单线程处理请求,但它通过使用高效的数据结构和算法来优化性能,例如使用跳表(Skip List)来实现有序集合,使用字典(Dictionary)来实现快速的键值查找,这些优化使得Redis能够在单线程下处理大量的请求。
  • 多路复用技术:Redis使用多路复用技术来管理多个客户端连接,通过监听多个连接的事件并进行处理,从而实现了同时处理多个客户端请求的能力。

尽管Redis在处理客户端请求时采用了单线程的方式,但它通过上面优化策略,使得单线程能够高效地处理并发请求。这也是Redis在性能高的原因之一。

相关文章:

【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快,为什么不用它做主数据库,只用它做缓存? 2.Redis 一般在什么场合下使用? 3.redis为什么这么快? 4.Redis为什么要引入了多线程? 1.既然redis那么快,为什么不用它做主数据…...

SpringBoot之JWT登录

JWT JSON Web Token(JSON Web令牌) 是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任,因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…...

【备战蓝桥杯】——循环结构

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-bFHV3Dz5xMe6d3NB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

【数据分享】1929-2023年全球站点的逐年平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…...

探索Pyecharts关系图绘制技巧:炫酷效果与创意呈现【第42篇—python:Pyecharts水球图】

文章目录 Pyecharts绘制多种炫酷关系网图引言准备工作代码实战1. 基本关系网图2. 自定义节点样式和边样式3. 关系网图的层级结构4. 添加标签和工具提示5. 动态关系网图6. 高级关系网图 - Les Miserables 示例7. 自定义关系网图布局8. 添加背景图9. 3D 关系网图10. 热力关系网图…...

蓝桥杯-循环节长度

两个整数做除法,有时会产生循环小数,其循环部分称为: 循环节。比如,11/136>0.8461553846153..... 其循环节为[846153] 共有 6 位。下面的方法,可以求出循环节的长度。请仔细阅读代码,并填写划线部分缺少的代码。 注…...

Jython调用openwire库连接activemq转发topic订阅消息到另一个activemq 服务器上 完整代码

以下是一个示例代码,演示如何在Jython中使用OpenWire库连接ActiveMQ,将一个主题(topic)上的订阅消息转发到另一个ActiveMQ服务器上: from org.apache.activemq import * from org.apache.activemq.transport import *…...

面试经典题---30.串联所有单词的子串

30.串联所有单词的子串 我的解法: 滑动窗口: 解法中用到了两个哈希表map1和map2,分别用于记录words中各个单词的出现频数和当前滑动窗口[left, right)中单词的出现频数;外部for循环i从0到len - 1,内部while循环每次会…...

字符串随机生成工具(开源)-Kimen(奇门)

由于最近笔者在开发数据脱敏相关功能,其中一类脱敏需求为能够按照指定的格式随机生成一个字符串来代替原有信息,数据看起来格式需要与原数据相同,如:电话号码,身份证号以及邮箱等。在网上搜索了下,发现没有…...

UE4 CustomDepthMobile流程小记

原生UE opaque材质中获取CustomDepth/CustomStencil会报错 在其Compile中调用的函数中没有看到报错逻辑 材质节点的逻辑都没有什么问题,所以看一下报错 在HLSLMaterialTranslator::Translate中 修改之后 mobile流程的不透明材质可以直接获取SceneTexture::customd…...

Docker 基础篇

目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成(Docker 三要素) 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …...

Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?

Git的基本概念:Git是一个版本控制系统,用于管理代码的变更历史记录。核心概念包括仓库、分支、提交和合并。 1、可以帮助开发者合并开发的代码 2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 3、代码文件版本管理 问题描述 当我们使用git提交代码…...

vue3封装el-pagination分页组件

1、效果如图&#xff1a; 2、分页组件代码&#xff1a; <template><div class"paging"><el-config-provider :locale"zhCn"><el-paginationv-model:current-page"page.currentPage"v-model:page-size"page.pageSize…...

负载均衡下Webshell连接思路及难点

君衍. 一、应用场景二、环境搭建三、思路以及难点1、查看内部结构2、查看webshell3、使用蚁剑进行连接4、难点1 shell文件上传问题5、难点2 命令执行时飘逸6、难点3 大工具上传失败7、难点4 脚本失效 四、解决方式1、关闭对方节点服务器2、基于IP地址判断是否执行3、脚本实现流…...

基于链表实现贪吃蛇游戏

本文中&#xff0c;我们将使用链表和一些Win32 API的知识来实现贪吃蛇小游戏 一、功能 &#xff08;1&#xff09;游戏载入界面 &#xff08;2&#xff09;地图的绘制 &#xff08;3&#xff09;蛇身的移动和变长 &#xff08;4&#xff09;食物的生成 &#xff08;5&…...

Python网络爬虫实战——实验6:Python实现js逆向与加解密

【实验内容】 本实验主要介绍在数据采集过程中对js代码进行分析从而对加密字段进行解密。 【实验目的】 1、理解js逆向工程的概念 2、学会逆向工程中的加解密分析 【实验步骤】 步骤1 理解js逆向工程的概念 步骤2 学会逆向工程中的加解密分析 步骤3 采集广东政府采购网 步…...

【python】使用aiohttp库编写一个简单的异步服务器

1. aiohttp介绍 aiohttp 是一个用于编写异步 HTTP 客户端和服务器的 Python 库。它建立在 Python 的 asyncio 库之上&#xff0c;提供了一种方便的方式来处理异步请求和响应。 官网地址&#xff1a;Welcome to AIOHTTP — aiohttp 3.9.1 documentation 以下是 aiohttp 的一些…...

新手使用代理IP接入代码教程

“实现匿名访问与数据保护在当今互联网高速发展的时代&#xff0c;网络安全和隐私保护成为了越来越重要的议题。代理IP可以隐藏用户的真实IP地址&#xff0c;从而实现匿名访问。为了保护用户的隐私和数据安全&#xff0c;许多网站和应用程序都采用了代理IP技术。” 一、代理IP的…...

JVM问题排查手册

三万字长文&#xff1a;JVM内存问题排查Cookbook 一、Heap快照 # jmap命令保存整个Java堆&#xff08;在你dump的时间不是事故发生点的时候尤其推荐&#xff09; jmap -dump:formatb,fileheap.bin <pid> # jmap命令只保存Java堆中的存活对象, 包含live选项&#xff0c;…...

前端canvas项目实战——简历制作网站(三)——右侧属性栏(线条宽度样式)

目录 前言一、效果展示二、实现步骤1. 实现线条宽度&#xff08;strokeWidth&#xff09;的属性模块2. 实线线条样式&#xff08;strokeDashArray&#xff09;的属性模块3. 意料之外的“联动” 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们初步实现了右侧属性栏…...

字节跳动二面经典题目

前言 语论即为「语兴式论语」&#xff0c;以语录体及对话的形式&#xff0c;沉淀球友实际工作学习中存在的疑难杂症解答&#xff0c;希望能够更好的帮助到球友和粉丝。欢迎关注公众号&#xff1a;语数 本期投稿 本期语数精选来源于球友应对字节跳动二面时候的场景问题 数仓工程…...

微搭低代码从入门到精通01应用介绍

目录 1 学习路线图2 应用介绍3 编辑器介绍总结 低代码的概念于2014年由 Forrester 首次正式提出。其将低代码定义为&#xff1a;能够以“最少的手写代码”和设置快速开发应用、配置和部署业务应用程序。 不同应用厂商的解法不一样&#xff0c;Gartner评估了400多款低代码/无代码…...

论文阅读《thanking frequency fordeepfake detection》

项目链接&#xff1a;https://github.com/yyk-wew/F3Net 这篇论文从频域的角度出发&#xff0c;提出了频域感知模型用于deepfake检测的模型 整体架构图&#xff1a; 1.FAD&#xff1a; 频域感知分解&#xff0c;其实就是利用DCT变换&#xff0c;将空间域转换为频域&#xff…...

ArcgisForJs快速入门

文章目录 0.引言1.前端代码编辑工具2.使用ArcgisForJs创建一个简单应用3.切片地图服务图层4.动态地图服务图层5.地图事件 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调用ArcGIS Server的REST API&#xff0c…...

【解决方法】git pull报错ssh: connect to host github.com port 22: Connection timed out

问题 git pull ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository.解决方法 在C:\Users\username.ssh文件夹下新建config文件&#xff0c;填入以下文本&#xff08;如有则直接在文件最后一行新增&#xff09;&am…...

30天精通Nodejs--第三十天:项目实战-物联网应用

目录 引言架构设计编码创建项目数据服务模拟设备消息接收并保存设备数据后端接口项目启动及接口测试项目启动测试源码地址结语引言 在之前的一系列文章中,我们已系统性地探讨了诸多Node.js相关的技术要点与理论背景。随着知识体系的铺垫到位,我们现在步入了实战环节。接下来…...

java 社区资源管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web社区资源管系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…...

网络编程套接字(Socket)

为什么需要网络编程??? -丰富的网络资源 每天你在b站上刷着喜欢的up主的视频,实质是通过网络,获取到网络上的一个视频资源 与本地打开文件类似,只是视频文件这个资源来源是网络 所谓的网络编程,其实就是从网络上获取各种数据资源 什么是网络编程?? 网络编程,指的是网络…...

C语言第十一弹---函数(下)

​ ✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…...

Unity读书系列《Unity3D游戏开发》——拓展编辑器(一)

文章目录 前言一、扩展Project视图1、右键扩展菜单&#xff08;Asset&#xff09;2、监听事件3、拓展布局 二、扩展Hierarchy视图1、拓展菜单&#xff08;GameObject&#xff09;2、拓展布局3、重写菜单 三、扩展Inspector视图1、扩展原生组件2、扩展继承组件 四、扩展Scene视图…...