【Redis】Redis内部编码 与 单线程架构

【Redis】Redis内部编码 与 单线程架构

目录

一、常用数据结构

Redis 对外说values 常用的数据结构是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合)等等,但是其实内部实现在不同情况下也与常见的数据结构有一定的不同。

二、 内部编码

  • String类型,有 raw ,int,embstr 三种实现。
    • raw : 最基本的字符串,底层就是字符数组
    • int :当value就是一个整数的时候,Redis直接使用int来保存
    • embstr:针对短字符串进行的特殊优化
  • hash类型,有hashtable,ziplist两种实现。
    • hashtable:最基本的hash表
    • ziplist:在hash表元素比较少的时候,使用压缩列表,节省空间
  • list类型,有linkedList 和 ziplist两种实现。
    • linkedlist:正常普通的链表
    • ziplist:list元素较少的时候,使用压缩列表。
    • 在Redis3.2之后,使用quicklist代替上面两种。quicklist就是一个元素是ziplist的链表。
  • set类型,有hashtable,intset两种实现。
    • hashtable:hash表
    • intset:集合中存的都是整数时使用
  • zset类型,有skiplist和ziplist两种实现。
    • skiplist:跳表,每个节点有多个指针域,巧妙使用可以做到查询元素时间复杂度为O(logN)
    • ziplist:元素较少的时候使用

可以使用 object encoding key查看key对应的value的内部编码。

三、单线程架构

Redis 使⽤了单线程架构来实现⾼性能的内存数据库服务。

宏观上我们多个客户端可能会同时请求Redis服务器,但是实际上由于Redis服务器处理请求的是单线程,就算真的命令同时到达,也得排队串行执行。

  1. 单线程还能这么快(与关系型数据库相比)的原因:因为Redis核心业务逻辑都是短平快的,不太吃CPU资源。
纯内存访问。Redis 将所有数据放在内存中,内存的响应时⻓⼤约为 100 纳秒,这是 Redis 达到每秒万级别访问的重要基础。⾮阻塞 IO。Redis 使⽤ epoll 作为 I/O 多路复⽤技术的实现,再加上 Redis ⾃⾝的事件处理模型将 epoll 中的连接、读写、关闭都转换为事件,不在⽹络 I/O 上浪费过多的时间.单线程避免了线程切换和竞态产⽣的消耗。单线程可以简化数据结构和算法的实现,让程序模型更简单;其次多线程避免了在线程竞争同⼀份共享数据时带来的切换和等待消耗。

Redis 使⽤ I/O 多路复⽤模型:

  1. Redis单线程的缺点:如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客⼾
    端的阻塞,对于 Redis 这种⾼性能的服务来说是⾮常严重的。

Read more

【PX4+ROS完全指南】从零实现无人机Offboard控制:模式解析与实战

【PX4+ROS完全指南】从零实现无人机Offboard控制:模式解析与实战

引言 无人机自主飞行是机器人领域的热门方向,而PX4作为功能强大的开源飞控,配合ROS(机器人操作系统)的灵活性与生态,成为实现高级自主飞行的黄金组合。然而,许多初学者对PX4的飞行模式理解不清,更不知道如何通过ROS编写可靠的Offboard控制程序。 本文将带你彻底搞懂PX4 6大核心飞行模式,实现无人机的自动起飞、悬停、轨迹跟踪(圆形/方形/螺旋)与降落。 亮点一览: * ✅ 深度解析PX4飞行模式(稳定/定高/位置/自动/Offboard) * ✅ 明确ROS可控制的模式与指令接口 * ✅ 完整的ROS功能包(C++实现,状态机设计) * ✅ 支持位置控制与速度控制双模式 * ✅ 内置圆形、方形、螺旋轨迹生成器 * ✅ 详细的安全机制与失效保护配置 无论你是准备参加比赛、做科研,还是想入门无人机开发,这篇文章都将是你宝贵的参考资料。 第一部分:PX4飞行模式深度剖析 PX4的飞行模式可以看作一个控制权逐级递增的层级结构。理解这些模式是编写控制程序的前提。 1. 稳定模式(STABILIZED / MANUAL / ACRO) * 核心特点:

By Ne0inhk
【CANN】Pi0机器人大模型 × 昇腾A2 测评

【CANN】Pi0机器人大模型 × 昇腾A2 测评

【CANN】Pi0机器人大模型 × 昇腾A2 测评 * 写在最前面 🌈你好呀!我是 是Yu欸🚀 感谢你的陪伴与支持~ 欢迎添加文末好友🌌 在所有感兴趣的领域扩展知识,不定期掉落福利资讯(*^▽^*) 写在最前面 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。 Pi0机器人VLA大模型测评 哈喽大家好呀!我是 是Yu欸。 最近人形机器人和具身智能真的太火了,大家都在聊 Pi0、聊 VLA 大模型。但是,兄弟们,不管是搞科研还是做落地,咱们始终绕不开一个问题——算力。 今天,我们一起把当下最火的 Pi0 机器人视觉-语言-动作大模型,完完整整地部署在国产算力平台上,也就是华为的昇腾 Atlas 800I A2 服务器上。 在跑通仓库模型的基础上,我们做一次性能测评。 我们要测三个最核心的指标:

By Ne0inhk
使用FPGA实现频率检测(频率鉴别)

使用FPGA实现频率检测(频率鉴别)

使用FPGA实现频率检测通常由两种方式,周期测量法和频率测量法。周期测量法是测量信号一个周期内基准时钟的个数,频率测量法是测量固定时间内有多少个信号周期。         虽然频率测量法测量高频信号时精度更高,但其需要一个闸门时间,响应速度不够快,另外我想是实现的是可以区分1khz、10khz、高电平和低电平的功能,可以说是一个鉴频器,而不是一个频率计,所以根据我的需求说说我的思路和实现方式。         我的基本思路是利用采样时钟对输入信号的周期和一个周期内的高电平进行计数,将测量值和不同频率的阈值范围进行比较,从而鉴别该输入信号的频率。这个过程不得不涉及到两个问题,一是信号频率识别范围,一是信号占空比的范围。信号传输过程中尤其是远距离传输必然会发生一些失真,所以需要对频率和占空比设计一个合理值,防止误识别。根据需求,我将频率识别范围设置为±10%,占空比设置为±5%,因为我设计的是频率区分,所以范围设计的稍宽,好处就是对不同的环境、温度漂移等容忍性更高。         在实际使用代码时,遇到一些问题,比如当信号出现高频干扰,代码有时会将1khz误识别为1

By Ne0inhk
[MySQL初阶]MySQL(9)事务机制

[MySQL初阶]MySQL(9)事务机制

标题:[MySQL初阶]MySQL(9)事物机制 @水墨不写bug 文章目录 * 一、认识事务 * 1、多线程访问数据库出现的问题 * 2、对CURD的限制是通过事务机制实现的 * 3、事务的四个属性 * 4、哪些引擎支持事务 * 二、事务的提交与autocommit设置 * 三、事务的隔离性和隔离级别 * (1) 查看当前隔离级别 * (2) 设置隔离级别 * (3) 事务隔离级别的作用 * (4)MySQL InnoDB 的四种隔离级别 * (1) 读未提交(Read Uncommitted) * (2) 读已提交(Read Committed) * (3) 可重复读(Repeatable Read) * (4) 串行化(Serializable) * (5)各隔离级别对比表 * 四、事务的一致性

By Ne0inhk