【Redis_Day5】String类型
【Redis_Day5】String类型
- String
- 操作String的命令
- set和get:设置、获取键值对
- mset和mget:批量设置、获取键值对
- setnx/setex/psetex
- incr和incrby:对字符串进行加操作
- decr/decrby:对字符串进行减操作
- incrbyfloat:浮点数加/减
- 一个汉字究竟占几个字节?
- append:字符串拼接
- redis中字符串也有下标
- getrange:返回key对应的string的子串
- setrange:替换字符串指定部分
- strlen:获取字符串的长度
- 字符串相关命令小结
- flushall:删库
- String内部编码
- String的应用场景
- 缓存
- 计数功能
- 共享会话(Session)
String
redis中的所有key都是字符串类型,value也可能是字符串类型。
String类型的值可以是字符串,包含⼀般格式的字符串或者类似JSON、XML格式的字符串;可以是数字,可以是整型或者浮点型;甚⾄可以是⼆进制流数据,例如图⽚、⾳频、视频等。但是⼀个字符串的最⼤值不能超过512MB。
redis内部存储字符串的时候,完全是按照⼆进制流的形式保存的,所以Redis是不会做任何编码转换的,客户端传⼊的命令中使用的是什么字符集编码,就存储什么字符集编码。
比如mysql8采用utf8mb4编码,mysql存数据的时候会默认对数据按照ytf8mb4进行编码。redis存数据时不会这样,redis内部没有设计字符集,所以使用redis时遇到乱码的概率很小。
操作String的命令
在redis中,操作不同类型的数据需要用不同的命令,下面总结一些操作String类型数据的命令:
set和get:设置、获取键值对
通过set和get可以操作字符串String。
set和get的基础操作不再赘述。
总结set的用法:
参考redis文档
:SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
其中:
[]相当于一个独立单元,表示可选项(可有可无)
|是或者意思
[]和[]之间可以同时存在
set后可以跟选项:
set key1 value1 ex xxx
(相当于set key1 value1和expire key xxx的结合,优化后减少了网络通信的次数且保证了命令原子性):把键值对存到redis中并为该键值对设置过期时间为xxx。如果key1不存在,创建新的键值对,如果key存在,让value1覆盖旧的value,覆盖过程中可能会改变原来的数据类型,此时原来key的ttl(生存时间)也会失效。- 同理,
set key1 value1 px xxx
(相当于set key1 value1和pexpire key xxx的结合) set key1 value1 nx/xx
:如果这条命令后加了nx或者xx,
nx表示如果key1已经存在,返回nil本次设置无效,如果key1不存在,设置key1的值为value1并返回OK。
xx表示如果key1不存在,返回nil本次设置无效,如果key1存在,用本次设置的value1覆盖之前设置的并返回OK。
nx是默认项。
总结get的用法:
get只支持字符串类型的value。如果value是其他类型,使用get获取就会出错。
比如用get获取list类型的value:
mset和mget:批量设置、获取键值对
相比于get和set,mset和mget可以一次操作多组键值对。优点很明显:减少网络通信的次数,提高效率。
学会使⽤批量操作,可以有效提⾼业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是无节制的,否则可能造成单⼀命令执⾏时间过⻓,导致Redis阻塞。
总结mset的用法:
mset key value [key value ...]
:一次性设置多个key的值。返回值永远是OK。
总结mget的用法:
mget key [key ...]
:一次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil。
mset和mget的时间复杂度都是O(N),N是当前命令中key的数量。所以时间复杂度也就是O(1)。
setnx/setex/psetex
setnx key value
:setnx即加了nx选项的set命令。key存在,设置失败,key不存在,设置成功。
setex 键 值 过期时间
:setex即加了ex选项的set命令。把键值对存到redis中并且设置过期时间,过期时间的单位是秒。
psetex 键 值 过期时间
:psetex即加了px选项的set命令。过期时间的单位是ms。
incr和incrby:对字符串进行加操作
incr:针对value+1
incrby:针对value+n
总结incr的用法:
incr key
:key对应的value必须是整数(8byte整数)。返回值是value+1之后的值。如果key对应的value不是⼀个整型或者范围超过了64位有符号整型,则报错。
incr key(key不存在)
:incr操作的key如果不存在,则视为key对应的value是0。
总结incrby的用法:
incrby key n
:将key对应的string表⽰的数字加上n。
如果key不存在,则视为key对应的value是0。如果key对应的string不是⼀个整型或者范围超过了64位有符号整型,则报错。
- incrby可以加负数。相当于decrby。
decr/decrby:对字符串进行减操作
decr:针对value-1
decrby:针对value-n
decr,decrby和incr,incrby的用法完全一样。
key5不存在:
incrbyfloat:浮点数加/减
decr、decrby、incr、incrby都只能算整数。
incrbyfloat:针对String类型的value进行加一个小数或减一个小数操作。减一个小数相当于加上一个负的小数。vlalue可以是小数。
没有decrbyfloat这个命令!!!
如果key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表示浮点数。
decr、decrby、incr、incrby、incrbyfloat的时间复杂度都是O(1)。
一个汉字究竟占几个字节?
如果编码方式是utf8,一个汉字占3个字节。如果编码方式是unicode,一个汉字占2个字节。
最典型的就是在java中,char类型的单位是字符,一个汉字是一个字符,此时一个字符等于2个字节,因为char用的是Unicode;String类型的单位也是字符,一个汉字是一个字符,此时一个字符等于三个字节,因为String背后的编码方式utf8。在Java标准库中,char和String之间的变化方式非常丝滑,程序员感受不到。
mysql中的数据类型varchar(N),单位也是字符,一个汉字是一个字符,所以一个字符可能是多个字节。至于一个字符具体相当于多少个字节,要看varchar(N)采用的编码方式。
C++中字符串的单位是字节。
redis中字符串的单位是字节。但是redis内部没有设计任何字符集,一个汉字占3个字节是怎么回事?这是因为xshell终端默认的字符编码是utf8,在xshell终端输入汉字后,汉字先按照utf8编码的,而一个汉字在utf8字符集中通常是3个字节,所以在redis中一个汉字占三个字节。
每中编码方式的码表都不一样。同一个汉字,使用的编码方式不同,得到的对应值也不同。
append:字符串拼接
字符串也支持一些常用的操作,比如拼接,获取/修改字符串的内容,获取字符串的长度,redis中支持这样的命令。
总结append的用法:
-
append key value
:如果key已经存在并且是⼀个string,命令会将value追加到原有string的后边。如果key不存在,则效果等同于SET命令(创建一个新的键值对)。时间复杂度是O(1)。
-
返回值是追加完成之后String的长度。String长度的单位是字节。
get keys后,显示的是用utf8编码后的“你好”。(客户端传⼊的命令中使用的是什么字符集编码,就存储什么字符集编码。)
其中\x是转义字符,不属于数据内容。 -
在启动redis客户端时,加上
--raw
选项,可以使redis客户端自动把二进制数据尝试翻译。
redis中字符串也有下标
redis中字符串也有下标,第一个字符处于0下标。最后一个字符可以用-1下标表示。
getrange:返回key对应的string的子串
总结getrange的用法:
getrange key start end
:返回key对应的string的子串,由start和end确定(左闭右闭)。start为0,表示的是字符串第一个字符。使⽤负数表示倒数。-1代表倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据string的长度调整成正确的值。
- 如果字符串中保存的是汉字,此时进行子串切分,很可能切出来的就不是完整的汉字了。
setrange:替换字符串指定部分
总结setrange的用法:
setrange key offset value
:从下标offset开始,用value覆盖字符串。返回值是替换后的新的字符串的长度。0,表示的是字符串第一个字符。
- 如果当前key的value是一个中文字符串,进行setrange,容易出问题。就比如说一个汉字占三个字节,但是只覆盖了这个汉字的前两个字节。
- 如果key不存在,
如下面例子:key1不存在:
\x是转义字符,表示这是一个十六进制数据。\x00表示凭空生成一个字节,这个字节里面的内容是0x00(0x00是16进制)。
strlen:获取字符串的长度
总结strlen的用法:
strlen key
:获取key对应的string的⻓度。当key存放的值不是string类型时,报错。返回值是字符串的长度。如果key不存在,返回0。
字符串相关命令小结
flushall:删库
flushall
:清楚redis上的所有数据 ,也就是删库。
String内部编码
字符串类型的内部编码有3种:
• int:8个字节(64bit)的长整型。
• embstr:小于等于39个字节的字符串。(短字符串)
• raw:大于39个字节的字符串。(长字符串)
Redis会根据当前值的类型和⻓度动态决定使用哪种内部编码实现。
redis存储小数,本质上是把小数当做字符串来存储。这意味这每次进行算术运算,都需要把字符串转换成小数,运算结束后再把结果转回字符串保存。
String的应用场景
缓存
redis作缓存的时候,常被用来存储“热点”数据。热点数据就是被高频使用的数据。不同场景下对高频的定义也不同。由于Redis具有⽀撑⾼并发的特性,所以缓存通常能起到加速读写和降低后端压⼒的作⽤。
redis+mysql组成的缓存存储架构:
假设把最近使用到的数据作为热点数据存储在redis中,解释上面的场景:
redis做缓存的时候,应用服务器访问数据,先查询Redis,如果redis上数据存在,就直接从redis上取数据交给应用服务器,不继续访问mysql了。如果redis上数据不存在,再读取mysql,把读到的结果返回给应用服务器的同时,把这个数据也写入到redis中。
但在上述场景中存在一个问题:随着时间的推移,有越来越多的key在redis上访问不到,从而从mysql读取并写入redis,redis中的数据会越来越多。
解决办法:
- 把数据写到redis中的同时,给这个key设置一个过期时间。
- redis在内存不足的时候,提供了淘汰策略。
用伪代码模拟上述场景,进一步理解String在其中的应用:
redis用key-value存储用户信息,
key:user:info:uid
,value是String类型。
例如:
key=user:info:student01,value=经过序列化后的01用户对象字符串;
key=user:info:student02,value=经过序列化后的02用户对象字符串;
value是json格式的String,Json格式的String类型也能存储机构化数据。
mysql用表user_info保存用户信息:
//当用户发来请求时,假设业务根据用户uid获取用户信息:
//业务层
UserInfo getUserInfo(long uid) {//先查询redis,假设用户信息保存在"user:info:<uid>"对应的键中:String key = "user:info:" + uid;//从redis中获取对应的值String value = 这里执行redis中的get key命令;
//如果缓存命中(hit),即如果redis上存在这个信息if (value != null) {// 假设我们的⽤⼾信息是按照 JSON 格式存储的UserInfo userInfo = JSON反序列化(value);return userInfo;}
//如果redis上数据不存在,再读取mysql,把读到的结果返回给应用服务器的同时,把这个数据也写入到redis中(miss)if (value == null) {// 从mysql数据库中,根据 uid 获取⽤⼾信息UserInfo userInfo = MySQL执⾏SQL语句:select * from user_info where uid = <uid>// 如果mysql表中没有 uid 对应的⽤⼾信息if (userInfo == null) {响应 404return null;}// 如果mysql表中有 uid 对应的⽤⼾信息//1. 将⽤⼾信息序列化成 JSON 格式String value = JSON序列化(userInfo);//写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600 秒)Redis 执⾏命令:set key value ex 3600//2. 返回⽤⼾信息return userInfo;}
}
关于key的命名:
与MySQL等关系型数据库不同的是,Redis没有表、字段这种命名空间,而且也没有对键名有强制要求(除了不能使用⼀些特殊字符)。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的⽅式是使用**"业务名:对象名:唯⼀标识:属性"**作为键名。
例如:
MySQL的数据库名为vs,用户表名为user_info,
那么对应的键名可以使用"vs:user_info:6379"、“vs:user_info:6379:name"来表示,如果当前Redis只会被⼀个业务使用,可以省略业务名"vs:”。
如果键名太长,则可以使用团队内部都认同的缩写替代,例如:
"user_info:6379:name"可以被"ui:6379:na
"代替。毕竟键名过长,会导致Redis的性能明显下降的。
从redis中取出来的用户信息是String格式(JSON格式),通过JSON反序列化可以把它变成对象。
从mysql中取出来的用户信息是对象,通过JSON序列化可以把转成字符串然后再存到redis中。
计数功能
许多应⽤都会使⽤Redis作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。
例如使用Redis来记录视频网站的视频播放次数:用户每播放⼀次视频,相应的视频播放数就会⾃增1。
redis并擅长数据统计,比如再上述场景中,统计播放量前100的视频有哪些,基于redis完成这个任务很麻烦。相比之下,如果是mysql存储上述数据,一个sql命令就完成了。但是用mysql记录,遇上高并发场景又容易挂。
解决办法:把redis上统计相关的数据通过异步的方式同步到统计数据仓库上,统计数据仓库可能是mysql,hdfs等。
异步方式不是redis收到xxx个播放请求就立即把它也写到仓库中,而是根据仓库的接收能力把数据持续地写入到仓库中,只要保证最终能把数据都正确写入到仓库中即可。
实际中要开发⼀个成熟、稳定的真实计数系统,要面临的挑战远不止如此简单:防作弊、按照不同维度计数(完播率等)、避免单点问题(数据备份)、数据持久化到底层数据源等。
共享会话(Session)
会话是客户端和服务器再交互过程中产生的一些专属于该客户端的中间状态的数据。
cookie是浏览器的会话存储机制,session是服务器的会话存储机制。
cookie和session中都是用键值对存储数据的。
为了更好的理解共享会话(Session),先来看看**服务器之间不共享会话(session)**的情况:
session分散存储:
上面是一个分布式Web服务,在这个服务中,用户的Session信息(例如用户登录信息)保存在各自的服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同⼀台服务器上,这样当用户刷新⼀次访问是可能会发现需要重新登录,这个问题是用户⽆法容忍的。
如何解决上述问题:
用redis集中管理session,即服务器之间通过redis共享会话session。
以上是Redis的字符串数据类型可以使⽤的三个典型场景,其适⽤场景远不止于此。
总结两个xshell热键:
ctrl+s:冻结当前画面。
ctrl+q:解除冻结。
下次见~
相关文章:

【Redis_Day5】String类型
【Redis_Day5】String类型 String操作String的命令set和get:设置、获取键值对mset和mget:批量设置、获取键值对setnx/setex/psetexincr和incrby:对字符串进行加操作decr/decrby:对字符串进行减操作incrbyfloat:浮点数加…...

Python MySQL SQLServer操作
Python MySQL SQLServer操作 Python 可以通过 pymysql 连接 MySQL,通过 pymssql 连接 SQL Server。以下是基础操作和代码实战示例: 一、操作 MySQL:使用 pymysql python 操作数据库流程 1. 安装库 pip install pymysql2. 连接 MySQL 示例 …...

Java技术分享
剖析equals方法 1、对于Object来说,其equals()方法底层实现就是"",都是比较对象的引用是否相等,下为JDK源码。 Object c 1; Object d 1; boolean equals c.equals(d);public boolean equals(Object obj) {return (this obj);…...

CentOS7卸载node
CentOS7卸载node 在 CentOS 7 上卸载 Node.js 可以通过以下步骤进行。具体步骤取决于你是如何安装 Node.js 的。常见的安装方法包括使用包管理器(如 yum 或 nvm)和手动安装。 方法 1:使用 yum 卸载 Node.js 如果你是通过 yum安装的 Node.j…...

LeetCode 2257. Count Unguarded Cells in the Grid
🔗 https://leetcode.com/problems/count-unguarded-cells-in-the-grid 题目 给出一个 m x n 的二维表格,格子上有士兵 guard,有墙 wall士兵可以盯上他上下左右所有的格子,碰到墙的格子就停止返回没有被士兵盯到的格子的数量 思…...

即时通讯服务器被ddos攻击了怎么办?
攻击即时通讯系统的主要手段 击键记录 目前盗取即时通讯工具帐号信息的最主要方法是通过特洛伊木马等恶意软件,例如QQ木马,这类程序能够盗取QQ密码信息,常见的能够盗取最新版本QQ密码的木马程序有十几种之多。几乎所有主要的QQ木马程序都采…...

【大数据学习 | Spark-Core】Spark中的join原理
join是两个结果集之间的链接,需要进行数据的匹配。 演示一下join是否存在shuffle。 1. 如果两个rdd没有分区器,分区个数一致 ,会发生shuffle。但分区数量不变。 scala> val arr Array(("zhangsan",300),("lisi",…...

【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法
课程链接 线性回归的从零开始实现 import random import torch from d2l import torch as d2l# 人造数据集 def synthetic_data(w,b,num_examples):Xtorch.normal(0,1,(num_examples,len(w)))ytorch.matmul(X,w)bytorch.normal(0,0.01,y.shape) # 加入噪声return X,y.reshape…...

李宏毅机器学习课程知识点摘要(1-5集)
前5集 过拟合: 参数太多,导致把数据集刻画的太完整。而一旦测试集和数据集的关联不大,那么预测效果还不如模糊一点的模型 所以找的数据集的量以及准确性也会影响 由于线性函数的拟合一般般,所以用一组函数去分段来拟合 sigmoi…...

React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo
文章目录 项目地址十六、useContecxt十七、useReducer十八、React.memo以及产生的问题18.1组件嵌套的渲染规律18.2 React.memo18.3 引出问题 十九、useCallback和useMemo19.1 useCallback对函数进行缓存19.2 useMemo19.2.1 基本的使用19.2.2 缓存属性数据 19.2.3 对于更新的理解…...

UE5时间轴节点及其设置
在 Unreal Engine 5 (UE5) 中,时间轴节点 (Timeline) 是一个非常有用的工具,可以在蓝图中实现时间驱动的动画和行为。它允许你在给定的时间范围内执行逐帧的动画或数值变化,广泛应用于动态动画、物体移动、颜色变化、材质变换等场景中。 1. …...

git 命令之只提交文件的部分更改
git 命令之只提交文件的部分更改 有时,我们在一个文件中进行了多个更改,但只想提交其中的一部分更改。这时可以使用 使用 git add -p 命令 Git add -p命令允许我们选择并添加文件中的特定更改。它将会显示一个交互式界面,显示出文件中的每个更…...

算法 差分修改 极简
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a < b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过…...

pcb元器件选型与焊接测试时的一些个人经验
元件选型 在嘉立创生成bom表,对照bom表买 1、买电容时有50V或者100V是它的耐压值,注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出,有那种可调降压比如如下,别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…...

OSG开发笔记(三十三):同时观察物体不同角度的多视图从相机技术
若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/143932273 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 长沙红胖子Qt…...

模糊逻辑学习 | 模糊推理 | 模糊逻辑控制
注:本文为几位功夫博主关于 “模糊逻辑学习 / 推理 / 控制” 的相关几篇文章合辑。 初学模糊逻辑控制(Fuzzy Logic Control) ziqian__ 已于 2022-08-19 20:30:25 修改 一、前言 模糊逻辑控制(Fuzzy Logic Control)是…...

【JavaEE】Servlet:表白墙
文章目录 一、前端二、前置知识三、代码1、后端2、前端3、总结 四、存入数据库1、引入 mysql 的依赖,mysql 驱动包2、创建数据库数据表3、调整上述后端代码3.1 封装数据库操作,和数据库建立连接3.2 调整后端代码 一、前端 <!DOCTYPE html> <ht…...

C++特殊类设计(不能被拷贝的类、只能在堆上创建对象的类、不能被继承的类、单例模式)
C特殊类设计 在实际应用中,可能需要设计一些特殊的类对象,如不能被拷贝的类、只能在堆上创建对象的类、只能在栈上创建对象的类、不能被继承的类、只能创建一个对象的类(单例模式)。 1. 不能被拷贝的类 拷贝只会发生在两个场景…...

【小白学机器学习34】用python进行基础的数据统计 mean,var,std,median,mode ,四分位数等
目录 1 用 numpy 快速求数组的各种统计量:mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容,显示效果 2 为了验证公式的后背,下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差var的…...

安装 Docker(使用国内源)
一、安装Docker-ce 1、下载阿里云的repo源 [rootlocalhost ~]# yum install yum-utils -y && yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum makecache # 尝试列出 docker-ce 的版本 [rootlocalh…...

Ajax学习笔记,第一节:语法基础
Ajax学习笔记,第一节:语法基础 一、概念 1、什么是Ajax 使用浏览器的 XMLHttpRequest 对象 与服务器通信2、什么是axios Axios是一个基于Promise的JavaScript库,支持在浏览器和Node.js环境中使用。相较于Ajax,Axios提供了更多…...

《用Python画蔡徐坤:艺术与编程的结合》
简介 大家好!今天带来一篇有趣的Python编程项目,用代码画出知名偶像蔡徐坤的形象。这个项目使用了Python的turtle库,通过简单的几何图形和精心设计的代码来展示艺术与编程的结合。 以下是完整的代码和效果介绍,快来试试看吧&…...

Unity中动态生成贴图并保存成png图片实现
实现原理: 要生成长x宽y的贴图,就是生成x*y个像素填充到贴图中,如下图: 如果要改变局部颜色,就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理, 或者要想做圆形就是计算距某个点(x1,y1&…...

Mac配置maven环境及在IDEA中配置Maven
Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具,它以项目对象模型(POM)为基础进行项目管理,通过POM文件来定义项目信息和依赖关系。同时,它也是构建自动化工具࿰…...

Reactor 模式的理论与实践
1. 引言 1.1 什么是 Reactor 模式? Reactor 模式是一种用于处理高性能 I/O 的设计模式,专注于通过非阻塞 I/O 和事件驱动机制实现高并发性能。它的核心思想是将 I/O 操作的事件分离出来,通过事件分发器(Reactor)将事…...

vim 一次注释多行 的几种方法
在 Vim 中一次注释多行是一个常见操作。可以使用以下方法根据你的具体需求选择合适的方式: 方法 1:手动插入注释符 进入正常模式: 按 Esc 确保进入正常模式。 选择需要注释的多行: 移动到第一行,按下 Ctrlv 进入可视块…...

问题记录-Java后端
问题记录 目录 问题记录1.多数据源使用事务注意事项?2.mybatis执行MySQL的存储过程?3.springBoot加载不到nacos配置中心的配置问题4.服务器产生大量close_wait情况 1.多数据源使用事务注意事项? 问题:在springBoot项目中多表处理数…...

李春葆《数据结构》-课后习题代码题
一:假设不带权有向图采用邻接矩阵 g 存储,设计实现以下功能的算法: (1)求出图中每个顶点的入度。 代码: void indegree(MatGraph g){int i,j,n;printf("各个顶点的入度:\n");for(i…...

51c~C语言~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12652943 一、嵌入式开发中的C语言编译器 如果你和一个优秀的程序员共事,你会发现他对他使用的工具非常熟悉,就像一个画家了解他的画具一样。----比尔.盖茨1 不能简单的认为是个工具 嵌入式程序开发…...

【Python】构建事件驱动架构:用Python实现实时应用的高效系统
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…...