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 远程批量删除key

    一、遇到的问题 在开发的过程中,经常会遇到要批量删除某种规则的key,如缓存的课程数据”course-课程uid”,其中课程uid是变量,我们需要删除&#8…

    Linux 2023年5月28日
    069
  • Docker镜像构建之docker commit

    我们可以通过公共仓库拉取形象,但有时公共仓库拉取的形象不符合我们的需求。虽然我们已经从繁琐的部署工作中解脱出来,但在实际开发中,我们可能希望镜像包含整个项目的完整环境,将打包的完整…

    Linux 2023年5月27日
    086
  • 大华海康NVR录像JAVA下载及WEB播放

    近期在处理一个将NVR录像机上的录像下载到服务器并通过浏览器播放的需求。 梳理记录下过程,做个备忘,同时遇到的一些细节问题解决,也供需要的同学参考。 需求比较简单,就是把指定时间段…

    Linux 2023年6月13日
    0135
  • Java 内功修炼 之 数据结构与算法(二)

    一、二叉树补充、多叉树 1、二叉树(非递归实现遍历) (1)前提前面一篇介绍了 二叉树、顺序二叉树、线索二叉树、哈夫曼树等树结构。可参考:https://www.cnblogs.c…

    Linux 2023年6月11日
    069
  • bzoj 1191 特别行动队

    一道不错的斜率优化入门题,传送门:bzoj 1911 题目描述稍微有点不太清楚,先解释一下 将n个士兵分成几个连续的组,每一组的战斗力为f(y),其中:f(x)=ax2+bx+c(…

    Linux 2023年6月6日
    095
  • 四年测试的面试题分享

    其实想说为什么每次面试都要先来点自我介绍,说来说去简历上都有,我曾想过不能快速进入面试阶段嘛 我的专业技能: 基本上这些专业技能是在工作上用过或者自己摸索过,实战经验比较少,下面是…

    Linux 2023年6月8日
    075
  • 在Linux下配置RealVNC和TigerVNC

    作者:alittlemc | 更新中 | 原创文章,可能有技术理解错误,欢迎指正,请与我联系,谢谢! 命令和快速总结 realvnc创建# :会话id -name 取名字 -dep…

    Linux 2023年6月6日
    098
  • AIX系统NTP同步配置

    前言 当AIX系统的本地时间与时间服务器授出的标准时间误差大于±1000秒时。xntpd服务将无法同步时间并变得无法正常工作,请进行ntp配置前,先修改AIX系统的本地时间,尽量和…

    Linux 2023年6月6日
    096
  • Linux特殊权限之suid、sgid、sbit权限

    文件权限管理之特殊命令 一:特殊权限 昨天所学的Linux基本权限为为9个;分别是rwx rwx rwx。但有时会发现系统中会有一些特殊的权限位符号; 例如: Linux系统一共有…

    Linux 2023年5月27日
    0124
  • Redis配置参数详解

    Redis是一个应用非常广泛的高性能Key-Value型数据库,与memcached类似,但功能更加强大!本文将按照不同功能模块的方式,依次对各个功能模块的配置参数进行详细介绍。 …

    Linux 2023年5月28日
    074
  • 测试代理的墙是否是通的

    curl -v -x 代理ip:端口 目的ip:端口通过代理访问对方wget “http://目的IP:端口” -e use_proxy=yes -e ht…

    Linux 2023年6月14日
    094
  • Ansible Playbook概览

    Ansible playbook 执行需要三步路执行: 1.编写playbook 2.定义主机清单文件 3.设置运行环境,写入配置文件 1.编写playbook Playbook使…

    Linux 2023年6月6日
    071
  • Java 集合框架

    一、 Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据。 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元…

    Linux 2023年6月7日
    075
  • python实现Mysql数据库批量新增数据

    一、批量插入数据的场景 二、插入数据的工具选择 三、选择Python进行批量插入 Python实现批量插入Mysql数据库数据 一、批量插入数据的场景 在进行数据压力时需要进行大数…

    Linux 2023年6月14日
    073
  • Vim 文本替换介绍与使用

    range 作用范围 空 # 默认为光标所在的行 . # 光标所在的行 n # 第 n 行(1表示第 1行,10表示第 10行),可使用:set nu 显示vim行号 $ # 最后…

    Linux 2023年6月6日
    077
  • Sharding-jdbc 5.1.2案例

    简介 sharding-jdbc案例,版本5.1.2 springboot + mybatis-plus + sharding-jdbc 项目地址:sharding-jdbc-ex…

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