Redis快速度特性及为什么支持多线程及应用场景

转载请注明出处:

1.Redis 访问速度快特性

正常情况下,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能;Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务;为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?可以将其归结为四点:

第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。

第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间

第三,单线程避免了线程切换和竞态产生的消耗

第四,用C语言实现的,一般来说C语言实现的程序”距离”操作系统更近,执行速度相对会更快。且Redis源代码可以说是精打细磨,曾经有人评价Redis是少有的集性能和优雅于一身的开源代码。

2.Redis 6.0 为什么支持多线程?

Redis处理一个请求的过程:

  • 建立连接
  • 读取请求
  • 解析请求
  • 处理请求
  • 返回响应

那么这个流程中,性能的瓶颈主要在哪呢?

1)建立连接:这个操作是无法避免的,不予考虑(可以通过长连接来解决)。

2)读取请求:因为多路I/O复用机制(以epoll为例),可将 I/O 事件注册到epoll instance上,当我们通过epoll_wait获取到该可读I/O事件时,请求数据已经存在于Linux Kernel,开销不大。

4)处理请求:同建立连接,这个操作是无法避免的,不予考虑。

5)返回响应:在上述操作执行完毕后,Redis接下来会返回响应至客户端,底层是通过调用write来实现的,它是一个阻塞操作。以客户端与Redis建立的是TCP连接为例,TCP协议是一个可靠的协议,也就是说数据发送方要确保数据接收方获取到的数据是正确的,因此在这段期间内,write调用并不会返回,而网络传输速度显然是慢于内存的读写速度的,确实相对来说比较耗时。

这里除了建立连接之外,其它的操作都是不间断顺序执行的,由于Redis的单线程机制导致在此期间无法处理其它的请求。如果要在此基础上提高性能,本质上来说就是要能够在单位时间内处理更多的请求。

Redis 6.0中的多线程,也只是针对处理网络请求过程采用了多线程,而数据的读写命令,仍然是单线程处理的。

Redis 6.x引入了I/O线程,以并发的方式(主线程+I/O线程)同时读取和解析多个请求,串行的方式(主线程)处理多个请求(减少并发带来的复杂度),最后是以并发的方式(主线程+I/O线程)同时返回多个响应,达到了单位时间内处理更多请求的目的,提高了吞吐量。

那么为什么Redis要引入多线程?因为Redis想在原来的基础上进一步提高单位时间内处理的请求个数,以提高吞吐量。

3.Redis可以做什么

缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。

排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。

计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。

消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。

Original: https://www.cnblogs.com/zjdxr-up/p/16307673.html
Author: 香吧香
Title: Redis快速度特性及为什么支持多线程及应用场景

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528982/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 分析redis key大小的几种方法

    当redis被用作缓存时,有时我们希望了解key的大小分布,或者想知道哪些key占的空间比较大。本文提供了几种方法。 一. bigKeys 这是redis-cli自带的一个命令。对…

    Linux 2023年5月28日
    0133
  • 数据结构简单话(一)线性表

    前言 逻辑结构 物理存储结构 一、顺序表 二、链表 总结 前言 本菜鸟笔者打算入门一下数据结构,在学习过程中通过自己简单话术总结相关基础知识要点,希望能帮助同样在入门的小伙伴们快速…

    Linux 2023年6月7日
    0133
  • 操作系统实战45讲- 02 几行汇编几行C:实现一个最简单的内核

    本节源代码位置https://gitee.com/lmos/cosmos/tree/master/lesson02/HelloOS Hello OS 之前,我们先要搞清楚 Hell…

    Linux 2023年6月7日
    0100
  • 单例模式也能玩出花

    一、单例模式 (1)单例模式 (2)单例模式实现要点 (3)使用场景当频繁创建、销毁某个对象时,可以考虑单例模式。当创建对象消耗资源过多时,但又经常使用时,可以考虑单例模式。 (1…

    Linux 2023年6月14日
    093
  • Windows关闭135/137/139/445 端口

    通过IP安全策略(以关闭135端口为例) (1) 依次打开”控制面板–>系统和安全–>管理工具–>本地安全策略&#…

    Linux 2023年6月8日
    0235
  • LeetCode-1047. 删除字符串中的所有相邻重复项

    题目来源 题目详情 给出由小写字母组成的字符串 S, 重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项…

    Linux 2023年6月7日
    0127
  • 关于Google词向量模型(googlenews-vectors-negative300.bin)的导入问题

    起因 项目中有如下代码: word2vec = KeyedVectors.load_word2vec_format(‘./GoogleNews-vectors-negative30…

    Linux 2023年6月7日
    0102
  • 使用JMeter和Zabbix进行压力测试

    Zabbix JMeter 目标 reference Zabbix Zabbix区分探针端、服务端、数据库、WEB前端等多个组件,如果你是在企业内使用,尽量使用运维同学搭建好的环境…

    Linux 2023年6月6日
    094
  • Java基础系列–09_集合2

    昨天介绍了集合的主要架构体系,今天主要的目的是学习集合的迭代器的遍历和List的特有功能。 迭代器:概述: 由于多种集合的数据结构不同,所以存储方式不同,取出方式也不同。但是他们都…

    Linux 2023年6月7日
    079
  • Linux 下统计文件夹下文件的数量

    1、查看当前目录下的文件数量(不包含子目录中的文件) 2、查看当前目录下的文件数量(包含子目录中的文件) 3、 查看当前目录下的文件夹目录个数(不包含子目录中的目录),同上述理,如…

    Linux 2023年6月13日
    0106
  • Linux查看文件内容和压缩文件命令

    Cat(查看文件内容) cat [选项] 文件名 选项 效果 -n 显示行号包括空行 -b 跳过空白行编号 -s 将所有的连续的多个空行替换为一个空行(压缩成一个空行) -A 显示…

    Linux 2023年6月6日
    092
  • SSH升级版本–8.2p1

    前期准备 执行yum update openssh先升级下. 反正官方提供的这种升级是没问题的。如果之前手动编译操作过openssh的升级,变更了默认配置文件路径什么的请自行测试。…

    Linux 2023年6月8日
    095
  • linux系统(centos)配置ssh免密登录

    linux系统(centos)配置ssh免密登录 背景 在日常使用时候,远程执行一些命令或脚本,交互式的输入密码有些不方便。故需配置免密登录。 用SSH命令行在A服务器上远程登录B…

    Linux 2023年6月8日
    098
  • Linux ARMv7架构通用中断流程(1)【转】

    一、ARMv7 Cortex-A系列处理器寄存器组介绍及其功能介绍 1. ARMv7 Cortex-A处理器一般共有37寄存器,其中包括: (1) 31个通用寄存器,包括PC(程序…

    Linux 2023年6月8日
    078
  • 数据转换-整数字节数组

    任务详情 任务详情0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 1 参考《GMT 0009-2012 SM2密码算法使用规范》第6节&#…

    Linux 2023年6月8日
    0143
  • THE EVOLUTION OF INTELLECTUAL FREEDOM;

    分享几张有趣的图: 1:http://www.cs.cmu.edu/~dskarlat/ 2022-03-03 17:47 2:https://www.zhihu.com/ques…

    Linux 2023年6月14日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球