Redis(二)网络协议和异步方式(乐观锁悲观锁)

news2024/11/26 16:48:57

Redis系列文章

Redis(一)原理及基本命令(柔性数组)
Redis(二)网络协议和异步方式(乐观锁&悲观锁)
Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)
Redis跳表

文章目录

  • Redis系列文章
  • 一、redis网络模型
    • redis的单线程
  • 二、redis pipeline
  • 三、redis事务
    • 事务相关指令
    • 监听机制原理
  • ACID特性分析
  • lua脚本
    • lua脚本指令
  • 异步机制


一、redis网络模型

redis是基于reactor模式设计的内存数据库。
使用reactor模型的好处:

使用 I/O 多路复用来实现对外部请求的处理,可以减少网络连接和读写等待时间。
在网络 I/O 操作中能并发处理大量的客户端请求,实现高吞吐率,高并发。

redis的单线程

redis 单线程是指其网络事件处理模块 是单线程,即指令的执行是在单线程上操作。但是其包括IO读取,网络IO操作都是通过多线程执行的。

执行模块单线程的优点:

  • 采用单线程,避免了不必要的上下文切换和竞争条件;不存在多线程导致的切换而消耗CPU
  • 不用考虑各种锁的问题,不存在加锁和释放锁的的操作,没有因为可能出现的死锁而导致的性能消耗
  • 简单可维护,多线程模式会使得程序的编写更加复杂和麻烦,单线程实现易实现

原因:

  1. redis主要的瓶颈还是在网络IO上,所以在网络IO仍然可以使用多线程接收,发送数据。
  2. 但是redis的数据操作是在内存上,存内存操作的速度还是非常快的,不需要使用多线程来处理。
  3. 并且多线程还有加锁、切换上下文等情景,可能效率还没有单线程高。
  4. 而MySQL由于操作数据是磁盘IO,所以MySQL是采用多线程,会涉及到多线程并发的情况。

二、redis pipeline

redis pipeline 是一个客户端提供的机制,指将多个命令打包同时发送给redis服务端.

例如多个连续的incr指令,使用pipeline(管道)后,多个连续的incr指令会被统一写到发送缓冲区,只会花费一次网络来回开销,这个开销会随着n数值的增大,大幅减少网络io开销,从而提升整体服务的性能。
但是当发送缓冲区或者接收缓冲区满了的话,也会导致阻塞。导致客户端负载过重,整个请求时间变长。所以在使用pipeline时需要注意发送指令的大小。

三、redis事务

事务:用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
事务提供了一种将多个命令打包,然后一次性有序(FIFO)执行的机制

事务相关指令

功能RedisMysql
开启事务MULTIbegin / start transaction
提交事务EXECcommit
取消事务DISCARDrollback
监听WATCH

MySQL中没有监听功能;watch是redis独有的其功能是检测 key 的变动;
若在事务执行中,key 变动则取消事务;需要在事务开启前调用,乐观锁实现(cas机制);若被取消则事务返回 nil;

乐观锁&悲观锁

悲观锁在执行时,会将其他处理数据库的请求拦截,使其他请求等待。 在mysql中增删改操作、select for update 语句都是悲观锁
乐观锁在执行时,不会将数据锁住,其他客户端可以修改数据,当数据被修改了,本地就不更新,返回失败。

在这里插入图片描述
可以从例子看出上述事务逻辑是乐观锁实现,失败需要重试,增加特务逻辑的复杂度。

监听机制原理

监控机制触发:所有对数据库进行修改的命令,如SET、LPUSH、SADD、ZREM、DEL、FLUSHDB等,在执行之后都会调用multi.c/touchWatchKey函数对watched_keys字典进行检查,查看是否有客户端正在监视刚刚被命令修改过的key,有的话touchWatchKey函数会将监视的客户端的REDIS_DIRTY_CAS标识打开,表示该客户端事物安全性已经被破坏。
判断事物是否安全 :当服务器接收到一个客户端发来的EXEC命令时,服务器将会根据这个客户端是否打开REDIS_DIRTY_CAS标识来决定是否执行事物。

在实际工程应用中一般不会用到上述的事务操作。更多的使用脚本执行,例如lua 脚本。在了解lua脚本之前先熟悉一下ACID特性。

ACID特性分析

A 原子性:事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败;redis 不支持回滚;即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。
C 一致性:事务的前后,所有的数据都保持一个一致的状态,不能违反数据的一致性检测;这里的一致性是指预期的一致性而不是异常后的一致性;所以 redis 也不满足;这个争议很大:redis 能确保事务执行前后的数据的完整约束;但是并不满足业务功能上的一致性;比如转账功能,一个扣钱一个加钱;可能出现扣钱执行错误,加钱执行正确,那么最终还是会加钱成功;系统凭空多了钱;
I 隔离性:各个事务之间互相影响的程度;redis 是单线程执行,天然具备隔离性;
D 持久性:redis 只有在 aof 持久化策略的时候,并且需要在 redis.conf 中 appendfsync=always 才具备持久性;实际项目中几乎不会使用 aof 持久化策略;

redis天然只满足一致性和隔离性。原子性和持久性不满足。

lua脚本

lua脚本具备原子性;不具备一致性,出现错误不会回滚。同样满足隔离性;持久性不满足。 lua 脚本实现原子性;
redis 中加载了一个 lua 虚拟机;用来执行 redis lua 脚本;
redis lua 脚本的执行是原子性的;当某个脚本正在执行的时候,不会有其他命令或者脚本被执行;
lua 脚本当中的命令会直接修改数据状态;

lua脚本指令

 测试使用
EVAL script numkeys key [key ...] arg [arg ...]
# 线上使用
EVALSHA sha1 numkeys key [key ...] arg [arg ...]

注意:如果项目中使用了 lua 脚本,可以不需要使用上面的事务命令;
例如:
在这里插入图片描述

异步机制

redis执行命令是在单线程上执行的,且命令结果需要立即返回,所以采用同步IO形式。

但是有些Redis命令不需要等待执行结果,就可以直接返回,例如键值对的删除、清楚数据库等,这类操作就可以采用异步机制。

Redis提供了异步线程机制:
Redis启动时会启动一些子线程,让后将一些任务交给子线程在后台完成,而不需要主线程去执行。这样就可以减轻主线程压力,避免一些阻塞任务降低redis性能。
在这里插入图片描述
主线程接收到操作 1 后,操作 1 并不用给客户端返回具体的数据,主线程可以把它交给后台子线程来完成,同时只要给客户端返回一个“OK”结果就行。
在子线程执行操作 1 的时候,客户端又向 Redis 实例发送了操作 2,客户端是需要使用操作 2 返回的数据结果的,如果操作 2 不返回结果,那么客户端将一直处于等待状态。

操作 1 就不算关键路径上的操作,因为它不用给客户端返回具体数据,所以可以由后台子线程异步执行。
操作 2 需要把结果返回给客户端,它就是关键路径上的操作,所以主线程必须立即把这个操作执行完。

  • Redis 主线程启动后,会使用操作系统提供的 pthread_create 函数创建 3 个子线程,负责AOF日志写操作、键值对删除、文件关闭的异步执行。

  • 主线程通过一个链表形式的任务队列和子线程进行交互。

详细内容参考Redis的异步机制是什么

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷2

第一题: 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 第二题: 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10…

mysql invalid conn排查

mysql invalid conn排查 问题背景 服务使用golang ,客户端库是go-mysql-driver ,系统测试环境频繁但是不总是报出invalid conn 错误,但实际拿sql执行时却是正常执行。 排查思路 原因分析 客户端使用了无效连接 由于连接无效,首先考虑客…

AI绘画StableDiffusion实操教程:冰霜旗袍美女

飞书原文链接,获取更多资源:AI绘画StableDiffusion实操教程:冰霜旗袍美女 前几天分享了StableDiffusion的入门到精通教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 但是还有人就问&#xff1a…

数学专题训练1 概率dp

数学专题训练1 1. RollingDiceDivOne 有 n n n​ 个骰子,第 i i i​ 个骰子拥有 d i c e [ i ] dice[i] dice[i] 面,每面包含 1 , 2 , . . . , d i c e [ i ] 1,2,...,dice[i] 1,2,...,dice[i] 的点数。同时掷这 n n n 个骰子,问掷出来…

JavaWeb——类的加载过程

目录 一、类加载的过程 1、加载 2、连接 (1)、验证 (2)、准备 (3)、解析 3、初始化 二、类加载的触发 三、双亲委派模型 1、定义 2、过程 3、优点 (1)、避免重复加载类 …

Redis持久化AOF和RDB,学习总结篇!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 前面笔者写了一篇关于Redis 数据结构和数据类型的博客总结,这篇博客总结一下关于 Redis 持久化。部分图片来自作者:小林哥,小林哥y…

JS debug跳过的几种方法

JS debug跳过的几种方法 第一种反调试解决方法: 禁用断点法 禁用所有断点,包括自己打的断点,无法调式。第二种反调试解决方法: 从来不执行法 在debug处 点击右键,选择 Nerver pause here,点击确定。第三种反调试解决方法: 条件…

常见的JS内置对象之数组

数组(Array) 1)定义数组 直接push的话,值放在了创建的大小之后,用下标进行操作值在创建大小里 创建两个空对象 2)数组的遍历: for in 循环 迭代数组:迭代出的是下标 拿到的不是值&am…

CnosDB x LangChain: 聊着天来查询时序数据库

本篇我们将主要介绍如何使用 LangChain 连接 CnosDB 数据库,实现使用自然语言和数据库的交流。 大模型等的相关话题已经霸榜半年有余,在讨论关注之余,CnosDB技术团队将大模型与人工智能相关技术与数据库开发与实践进行融合。继CnosDB全面整合…

实现最大子段和的计算,输入数据从文件读取。

1.设计思路   求解该题可以用分治法解题,总共有三种情况,最大子段在我们数组的左侧;最大子段在我们数组的右侧;最大子段跨过了左右两侧,在中间最大。第一种和第二种将两个子问题递归解出。分开的位置就是我们的中心位…

ios oc button 设置

Button调整内部的子控件的位置

图书借阅系统

系统描述 该图书借阅系统是一个用于图书馆或类似机构管理图书借阅流程的在线平台。系统主要包括管理员模块和读者模块,分别提供相应的功能和权限。 - 管理员模块: - 注册:允许管理员创建新的管理员账号。 - 登录:允许管理员使用账…

centos7 安装vmware17

vmware17 下载 官网 VMware Hong Kong - Delivering a Digital Foundation For Businesses | HK | HK 下载链接 Download VMware Workstation Pro 下载链接,直接点击下载即可 https://download3.vmware.com/software/WKST-1702-LX/VMware-Workstation-Full-17.0…

Unity自定义后处理——校色

Unity自定义校色后处理 大家好,我是阿赵。   之前介绍了一些后处理的做法,包括了PostProcessing和CommandBuffer。其实如果我们只是实现一些比较单一的全屏效果,也没必要搞那么复杂,直接在OnRenderImage里面写Graphics.Blit就可…

最近很火的 LangChain 你了解吗

最近 ChatGPT 很火,AIGC 很火,各类国产化 AI 很火。周边的 AI 工具集、框架也很火。各类新词也层出不穷。今天和大家学习和分享的是重量级新选手 LangChain。 一、什么是 LangChain LangChain 是一个 2023 年 1 月(v0.0.64)在 G…

网页聊天室测试

1.项目介绍: 该项目是一个基于网页的聊天室应用,具有用户注册、登录、会话列表、好友列表、发送消息等功能。下面是更详细的项目介绍: 用户注册和登录功能:用户可以通过输入用户名和设置密码来注册新账户,在注册过程中…

实施工程师需要了解的mysql知识

一、前言 做为实施工程师,在现场有时候是需要协助开发人员做一些简单的sql查询、更新动作的,不需要多复杂,下面就简单介绍下mysql的安装以及举一些最简单常用的sql用例。 二、安装mysql 2.1 下载安装包 第一步:在百度搜索"…

vue 通过多组复选框来过滤数据

1.通过if else 来筛选数据 <template> <div><div><label><input type"checkbox" v-model"checkedNames" value"北京"> 北京</label><label><input type"checkbox" v-model"chec…

使用python进行AI选股之同花顺问财

通过问财python库&#xff0c;可以输入中文就能获取AI选股结果&#xff0c;而不需要写很多代码来进行股票选取&#xff0c;如上图就是输入中文”均线多头排列的股票”获取的结果。本文主要介绍问财python库的选股功能和使用步骤。 什么是问财python库 同花顺i问财是同花顺旗下…

Echarts 定制化日历图

目录 改造一&#xff08;变化X轴、Y轴label&#xff09;&#xff1a; 改造二&#xff08;单元格、图例改造&#xff09;&#xff1a; 改造三&#xff08;tooltip、细节优化&#xff09;&#xff1a; 最近在做可视化&#xff0c;发现日历图挺有意思&#xff0c;分享一波吧&am…