redis的网络模型


redis使用的是单reactor网络模型,因为redis都是网络io,单reactor可以满足。

为什么mysql每一条连接对应一个线程?

mysql有网络io,磁盘io,涉及的操作比较多,需要有一个单独的线程来处理。使用单线程或者线程池都不太合适。

redis pipeline

redis pipeline 是由客户端提供的,而不是服务端提供的,是将多条命令一起发送到redis。redis是单线程的,所以会顺序执行pipeline中的命令,但是pipeline不具备事务性,所以并不会保证这些命令会一起执行。

pipeline一般和事务一起使用,让pipeline中的多个命令一起执行,不会被其他命令打断。

redis事务

MULTI EXEC事务

redis命令事务与pipeline一起使用,做一些简单的工作,让几个命令一起执行。

MULTI

开启事务

queued, 表示加入一个队列,并没有执行。

EXEC

提交事务

DISCARD

取消事务

WATCH

事务开始前使用watch监测key的变动,如果事务过程中监测到key有变化,则事务提交的时候会先检测key是否有变动,如果有变动则返回nil,并不会执行事务中的命令。

lua脚本

lua脚本解决什么问题?

lua脚本主要是来实现原子性。

redis中加载了一个 lua 虚拟机;用来执行 redis lua 脚本;redis lua 脚本的执行是原子性的;当某个脚本正在执行的时候,不会有其他命令或者脚本被执行。有pipeline的效果,lua中可以写多个语句。

redis lua与mysql存储过程类似。

redis lua脚本具有原子性;mysql存储过程不具备原子性。

mysql存储过程可以写很多sql语句,减少网络传输,可以实现简单的逻辑运算;

lua脚本具备原子性,因为执行lua脚本是一个命令,redis是一个单线程,所以具备原子性,可以通过lua实现逻辑进行回滚。

lua脚本解决了哪些问题?

  1. 减少网络传输;
  2. 实现原子性。

lua脚本使用

  1. 使用script load将lua脚本传到redis
  2. evalsha执行lua脚本

ACID分析

原子性

原子性要保证要么全部成功,要么全部失败。

redis事务不支持原子性

在EXEC前,只是入队,并不做检查命令是否能执行,EXEC后,如果有命令执行失败,后面的命令仍然会执行。

使用lua脚本,可以通过逻辑判断,自己写回滚保证原子性。

一致性

一致性指不破坏完整性约束。redis事务也不满足严格意义的一致性。

隔离性

事务的操作不被其他用户操作所打断;redis 是单线程执行,天然具备隔离性。

持久性

redis支持4种持久化方式。aof、rdb、aof复写、aof-rdb混用。

只有aof方式是在单线程中进行磁盘io;其他三种是采用fork进程的方式进行持久化。

redis pub/sub

为了支持消息的多播机制,redis 引入了发布订阅模块。类似一个分布式消息队列。消息不一定可达,如果连接断开了,对于该连接来说,pub的消息就丢失了。

redis异步连接

同步连接方案采用阻塞io来实现。优点是代码书写是同步的,业务逻辑没有割裂;缺点是阻塞当前线程,直至redis返回结果。通常用多个连接实现连接池来解决效率问题。

异步连接方案采用非阻塞io来实现;优点是没有阻塞当前线程,redis 没有返回,依然可以往redis发送命令;缺点是代码书写是异步的(回调函数),业务逻辑割裂,可以通过协程解决(openresty,skynet)。

如何实现异步连接?

hiredis提供了async的方法,但只是读写的操作,实现了redis协议。如果要实现完整的异步连接,需要在hiredis的基础上,结合我们自己实现的网络库(reactor), 一起实现异步连接。

reactor主要实现io检测,当检测到有io可读可写的时候,调用hiredis的异步读写方法。需要实现几个回调函数:addRead,delRead,addWrite ,delWrite等,这几个方法主要是用来检测io的, 通过epoll_ctl设置需要检测的io事件。

hiredis里面提供了一些常用的网络库(如libevent),实现redis异步连接的example。可以参考它们,实现我们自己的redis异步连接。

  1. read、write注册时的listen事件,还是读写io?
  2. 异步请求的reactor中的event,都是对应同一个fd,这个OK吗?

同时发出多个request,操作的其实是reactor同一个event,并且会把这个fd的设置为检测读事件。等到读事件发生,怎么找到response对应的是哪个request呢?因为这是个单线程,request肯定是有顺序的,redis对于同一个连接的命令处理也是顺序的,所以按顺序就能够找到是对应的是哪个命令。

主要的工作就是对hiredis进行适配,用我们自己reactor的io检测方法适配hiredis的方法,需要比较方法,比较参数。

比较巧妙地使用struct中成员的地址,得到struct地址的方法:

-1642752392324)]

比较巧妙地使用struct中成员的地址,得到struct地址的方法:

[外链图片转存中…(img-Om2YyUmf-1642752392328)]

[外链图片转存中…(img-mnVv2hhk-1642752392329)]

redis事务与异步请求相关推荐

  1. ORM中的事务和锁、Ajax异步请求和局部刷新、Ajax文件上传、日期时间类型的Json、多表查询图书系统

    一.ORM中的事务和锁 事务 事务要确保原子性 """ 事务ACID原子性:不可分隔的最小单位一致性:跟原子性是相辅相成隔离性:事务之间相互不干扰持久性:事务一旦确认永久 ...

  2. 项目1在线交流平台-4. 使用radis高性能储存方案-5.redis常用使用场景-开发关注功能-redis事务

    文章目录 功能需求 1. dao层设计redis对应的key 设计储存关注对象信息的健值对 key value 设计储存粉丝信息的健值对 key value 2. Service层处理关注和取关的业务 ...

  3. 【2020尚硅谷Java大厂面试题第三季 04】Redis 9种数据类型使用场景,分布式锁演变步骤,lua脚本,redis事务,Redisson,Redis内存占用,删除策略,内存淘汰策略,手写LRU

    1.安装redis6.0.8 2023 02 02 为:redis-7.0.8.tar.gz 2.redis传统五大数据类型的落地应用 3.知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的 ...

  4. Redis 事务的实现

    目录 1 事务的实现 1.1 事务开始 1.2 命令入队 1.3 事务队列 1.4 执行事务 2 WATCH 命令的实现 2.1 使用 WATCH 命令监视数据库键 2.2 监视机制的触发 2.3 判 ...

  5. Redis事务实现原理

    一:简介 Redis事务通常会使用MULTI,EXEC,WATCH等命令来完成,redis实现事务实现的机制与常见的关系型数据库有很大的却别,比如redis的事务不支持回滚,事务执行时会阻塞其它客户端 ...

  6. 架构设计|异步请求如何同步处理?

    来自:程序通事 本文创意来自一次业务需求,这次需要接入一个第三方外部服务.由于这个服务只提供异步 API,为了不影响现有系统同步处理的方式,接入该外部服务时,应用对外屏蔽这种差异,内部实现异步请求同步 ...

  7. 十七、Redis事务

    一.Redis事务的概念: Redis 事务的本质是一组命令的集合.事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求 ...

  8. python redis事务_python redis事务源码及应用分析

    在多个客户端同时处理相同的数据时,不谨慎的操作很容易导致数据出错.一般的关系型数据库中有事务保证了数据操作的原子性,同样Redis中也设置了事务,可以理解为"将多个命令打包,然后一次性.按顺 ...

  9. Redis事务(transaction)

    Redis事务(transaction) 本文档翻译自: http://redis.io/topics/transactions . MULTI . EXEC . DISCARD 和 WATCH 是 ...

  10. 面试问到 Redis 事务,我脸都绿了。。

    前言 前几天有读者说自己面试被问到Redis的事务,虽然不常用,但是面试竟然被问到,平时自己没有注意Redis的事务这一块,面试的时候被问到非常不好受. 虽然,这位读者面试最后算是过了,但是薪资方面没 ...

最新文章

  1. (U3D)Time的使用
  2. java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)
  3. 关于Python编程的一些问答
  4. 自动生成业务单据流水号方案
  5. python正则表达式操作指南_第二篇详细Python正则表达式操作指南(re使用)
  6. Linux基础知识-文件管理
  7. JavaScript = TypeScript 入门
  8. HeadFirst设计模式学习笔记
  9. 【深度学习】图像超分实验:SRCNN/FSRCNN
  10. 企业进行OA系统选型的四大标准
  11. 43种名车标志及来历
  12. (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  13. 颗粒粒径的众多测试方法
  14. Java大数据开发知识体系简介
  15. Linux下的进程PCB以及线程详解
  16. ACM/ICPC是什么
  17. 形容词记忆(一):able, ible后缀常用词
  18. 2023年高新技术企业认定时间
  19. TryHackMe-Bypass_Disable_Functions
  20. 让你的MacBook不需要插件就能支持NTFS读写

热门文章

  1. 【NOIP普及组】1961:【13NOIP普及组】计数问题
  2. Java程序员必会!三面蚂蚁核心金融部
  3. SAP FICO 会计科目/客户/供应商/公司代码(组)OB55创建工作清单满足报表查询需求
  4. 系统平台新店铺该如何控制单量?实用技巧有哪些?
  5. The user specified as a definer (''@'%') does not exist
  6. Transform角度和旋转
  7. 名帖85 蔡襄 小楷《寒蝉赋》
  8. 【IoT】11.Opportunity Identification 发现合适的机会
  9. 上 网 童 谣(转)
  10. 配合debian搭建KMS服务器,激活Win和Office