首页 > 数据库 >redis知识点

redis知识点

时间:2023-02-24 10:25:43浏览次数:70  
标签:知识点 单线程 redis 网络 事件 IO 客户端

通信协议

  • 协议概念: 所谓协议 其实就是 发送和接收 双方约定的数据格式而已;类似于 加密解密; 没有什么神秘; 比如 http协议,双方约定好格式,如何读取url,取参赛,取请求头数据等等;
  • redis传输层协议是TCP
  • redis应用层协议是其自己实现的一种协议,叫 RESP(redis serialization protocol:redis序列化协议); 这种协议 特点在于 实现简单,快速解析,人类易读,
  • 采用这种协议原因是 redis是高性能内存数据库,需要尽可能的减少不必要的计算量及时间,而http是比较复杂的协议;
  • RESP协议只用于 redis客户端与服务端之间的交流;
  • 协议工作流程(以客户端发送一个命令为例):
  • 客户端:原始命令->RESP编码->传输
  • 服务端:接收->RESP解码->原始命令

redis高性能的原因

  • redis是纯内存的操作,性能瓶颈不在cpu上(因为其不读取硬盘数据),而是网络IO时间 和 内存大小 问题上,而且在硬件上基本不涉及磁盘(除了持久化等情况);
  • redis采用单线程模型(指网络事件处理模式(单reactor单线程模型),不是说redis只是单线程程序),因其实现简单,避免多线程频繁上下文切换,及同步机制加锁的开销;
  • redis采用 单Reactor单线程 模式的网络事件处理器,内部使用了 I/O多路复用模型,如linux的epoll,使其能同时连接成千上万个客户端连接;
  • redis基础数据结构简单高效,如链表,字典,整数集合等,在此基础上实现用户能操作的对象:字符串,列表,hash,集合,有序集合等

redis是单线程系统?

  • 常说的redis单线程指其网络事件出来模型 reactor是单线程;
  • 由于 redis瓶颈在于网络IO时间较长,所以在redisV6.0引入了多线程去处理客户端IO读写相应,而redis命令的处理还是在主线程 单线出来;
  • 针对整个redis系统,则一直有其他线程进行异步任务出来,如 AOF,RDB等数据持久化任务;

单Reactor单线程模型

介绍

image

  • Reactor对象通过epoll监听事件,收到准备就绪的事件后通过dispatch分发,根据事件类型,决定分发到Acceptor(建立客户端连接)或Handler(处理业务的对象)
  • 当是 建立连接事件时,则Acceptor对象会通过 accept方法获取连接,然后建立client对象和socket对象,然后产生read事件,将此事件与 命令出来handler关联,表示后续此socket为可读事件,也就是接收客户端的命令操作;
  • 当接收到客户端命令的读事件时,Reactor的dispatch(分发)将读事件分发给对应的hanlder,handler读取命令,执行完后,生成一个 包含数据的写事件扔给Reacotr,让其再次分发给写事件的handler; 然后此hanler将数据写入socket发送给客户端;

优点

  • 单线程操作,方便管理,没有锁的困扰;

缺点

  • 所有业务操作都在一个线程中执行,如果一个连接的操作耗时较长会导致 所有连接响应延迟;但redis没此问题,因为其是内存操作,瓶颈不在cpu;
  • 随着高并发的增长,网络IO操作耗时越来越明显(read操作,从内核读数据到应用程序,write操作,应用程序中的数据写到内核),而这些操作 都在主线程中执行,由于这些网络IO操作 浪费了CPU资源,所以网络IO就是瓶颈;

缺点解决方案

  • 将 网络IO操作从主线程中 提取到 只负责此功能的IO线程中; 这样 主线程只负责执行命令,充分利用cpu; IO线程只负责 从socket读取写入数据;

redis 单reactor单线程模式+多线程网络IO

示意图

image
image

工作方式

  • 网络IO线程 专门负责从socket读取或写入数据,主线程仍然负责执行命令;

优点:此方式解决了网络IO导致的性能瓶颈问题;

标签:知识点,单线程,redis,网络,事件,IO,客户端
From: https://www.cnblogs.com/rgcLOVEyaya/p/17148417.html

相关文章

  • 深入理解跳表及其在Redis中的应用
    前言跳表可以达到和红黑树一样的时间复杂度O(logN),且实现简单,Redis中的有序集合对象的底层数据结构就使用了跳表。其作者威廉·普评价:跳跃链表是在很多应用中有可能替代......
  • 2023前端面试知识点总结
    原型JavaScript中的对象都有一个特殊的prototype内置属性,其实就是对其他对象的引用几乎所有的对象在创建时prototype属性都会被赋予一个非空的值,我们可以把这个属性......
  • python 每天一个知识点 对文件的操作
    对文件的操作:操作功能文件对象=open(file,mode,encoding)打开文件获取文件对象文件对象.read(num)读取指定长度字节,不指定num读取文件全部文件对象.re......
  • DRF思维导图及知识点总结(很值得一看的博客)
    DRF思维导图及知识点总结1.视图类-viewview:djngo自带的请求对象:Django默认的HttpRequest对象获取数据: Get请求数据:request.GETPOST、PUT等请求......
  • Redis入门学习
    认识RedisRedis诞生于2009年全称是RemoteDictionaryServer,远程词典服务器,是一个基于内存的键值型NoSQL数据库。特征:键值(key-value)型,value支持多种不同数据结构,功能丰......
  • arrch架构部署redis,报错: ignore-warnings ARM64-COW-BUG
    做个记录。 arrch架构的redis安装包下载链接:https://pan.baidu.com/s/1TMXNpMvMDWRFD1f5km7MwQ  提取码:36qk 启动redis报错如下:Rediswillnowexittoprev......
  • 以docker方式部署的redis键值查询及清理
     1、首先使用 dockerps 命令来查看正在运行的容器。该命令会列出容器的ID、名称、端口号、状态等信息。也可以使用 dockerps-a 命令来查看所有容器,包括已经停止的......
  • redis分布式锁的实现
    一.正常加锁当两个用户同时注册一个用户名时,为保证用户名不能重复,因此对其注册的用户名加锁。具体步骤:获得用户注册的用户名,进行判断,如果为空则对其进行加锁,保存到数据......
  • redis列表类型 list set&sortedset
    列表类型list可以添加一个元素到列表的头部(左边)或者尾部(右边)1添加1lpushkeyvalue将元素加入列表左表2rpushkeyvalue将元素加入列表右边2获取......
  • redis(1)NoSQL数据库简介
    1.1技术发展redis是用来解决性能问题的数据库技术的分类:解决功能性问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN解决扩展性问题:Struts、Spring、SpringMVC......