当前位置: 首页 > news >正文

【Redis_Day4】内部编码和单线程模型

【Redis_Day4】内部编码和单线程模型

  • 五大数据类型
  • 内部编码
    • object encoding key1:查询key1对应值的内部编码
  • redis中的单线程模型

redis中的数据都是以键值对的方式存的,redis内部用哈希表组织这些键值对。

五大数据类型

站在用户角度,
在一个键值对内部,键的数据类型都是String,值的数据类型有很多选择,最常用的数据类型有五个,分别是字符串(String),哈希表(hash),列表(list),集合(set),有序集合(zset)。操作不同的数据结构需要使用不同的命令。

在这里插入图片描述

内部编码

站在redis角度,
Redis底层在实现用户使用的五大数据结构的时候,Redis针对每种数据结构的实现都有自己的底层内部编码,而且针对一种数据结构往往有多种实现,即一种数据结构对应多个内部编码。Redis内部会在合适的场景选择合适的内部编码存储管理数据。

每种数据结构都至少有两种以上的内部编码。
在这里插入图片描述
在这里插入图片描述
用户存储数据的时候,redis会自动选择具体用什么内部编码来保存数据,用户感知不到redis行为。比如用户存储字符串,redis中保存这个字符串的时候可能是通过raw,也可能是int,也可能是embstr。

  1. raw,int,embstr都是String的内部编码。

    • raw是最基本的字符串,一般保存较大字符串。
    • 当value是一个整数的时候,redis可能就会直接用int保存value。一个int是64bit。
    • embstr一般保存较短的字符串。
  2. hashtable和ziplist都是哈希表的内部编码。

    • hashtable实现了一个最基本的哈希表;
    • ziplist是压缩列表,当哈希表中元素比较少的时候,redis就会把哈希表的内部实现转换成ziplist。ziplist可以节省空间,对于redis来说,如果key特别多,hash类型的value也特别多,但是每个hash类型的value又不大的情况下,通过压缩这些hash类型的value,就可以让整体键值对占用的内存更小。
  3. redis3.2之前,linkedlist和ziplist都是列表的内部编码。

    • 从redis3.2开始,引入quicklist取代了linkedlist和ziplist,quicklist同时兼顾了linkedlist和ziplist的优点,quicklist本身就是链表,每个元素又是一个ziplist。通过quicklist能节省空间和提高管理数据的效率。
  4. hashtable和inset都是集合的内部编码。

    • 如果集合中存的都是整数,集合就会被优化成inset。
  5. skiplist和ziplist都是有序集合的内部编码

    • skiplist也属于链表,但和普通链表相比,skiplist的每个结点上有多个指针域,通过巧妙搭配这些指针域的指向,可以做到在skiplist上查询元素的时间复杂度为O(logN)。

redis底层这样设计的好处:

  1. 可以改进内部编码,且对外的数据结构和命令没有任何影响,这样⼀旦开发出更优秀的内部编码,无需改动外部数据结构和命令,例如Redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了⼀种更为优秀的内部编码实现,且对用户来说基本无感知

  2. 多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist⽐较节省内存,但是在列表元素比较多的情况下,性能会下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist,整个过程用户同样无感知

object encoding key1:查询key1对应值的内部编码

在这里插入图片描述

redis中的单线程模型

redis单线程模型不是说一个redis服务器进程内部只有一个线程。
redis单线程模型指的是redis只使用一个线程处理所有的命令请求!!!

假设多个客户端同时操作一个redis服务器,此时服务器端并不会存在类似于线程不安全的问题。redis服务器实际上是单线程模型,当多个请求同时到达redis服务器,需要在队列中排队,等待redia服务器一个一个的取出里面的命令再执行,微观上说,redis服务器是串行执行/顺序执行多个命令的。

redis能使用单线程模型很好工作,原因主要在于redis的核心业务逻辑都是短平快的,不太消耗cpu资源,假设使用多线程模型处理业务,也提升不大。所以它的弊端也很明显,如果某个操作占用redis时间太长,就会阻塞redis执行其他命令。

和关系型数据库(mysql,oracle,sqlServer)相比,redis效率高速度快的原因:

  1. redis访问内存,关系型数据库访问硬盘。
  2. redis的核心功能,比关系型数据库的核心功能更简单。关系型数据库对于数据库的增删改查都有更复杂的功能支持,这样的功能势必要花费更多的开销。
  3. redis采用单线程模型,避免了一些不必要的线程竞争开销。
  4. redis处理网络IO的时候,使用了epoll这样的IO多路复用机制。C++可以直接使用Linux原生的epoll API,java可以使用NIO(NIO是java标准库提供的一组类,该类底层封装了epoll)。

相关文章:

【Redis_Day4】内部编码和单线程模型

【Redis_Day4】内部编码和单线程模型 五大数据类型内部编码object encoding key1:查询key1对应值的内部编码 redis中的单线程模型 redis中的数据都是以键值对的方式存的,redis内部用哈希表组织这些键值对。 五大数据类型 站在用户角度, 在一…...

Vue模块化开发的理解

Vue模块化是指在Vue.js开发中,将代码按功能拆分成多个独立的模块,以提高代码的可维护性、可读性和复用性。以下是对Vue模块化的详细理解: 一、Vue模块化的实现方式 组件化开发: Vue组件是模块化的基本单元,每个组件封…...

在Ubuntu22.04上源码构建ROS noetic环境

Ubuntu22.04上源码构建ROS noetic 起因准备环境创建工作目录并下载源码安装编译依赖包安装ros_comm和rosconsole包的两个补丁并修改pluginlib包的CMakeLists的编译器版本编译安装ROS noetic和ros_test验证 起因 最近在研究VINS-Mono从ROS移植到ROS2,发现在编写feat…...

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数,初始化节点对象,包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点,默认为None self.rig…...

[刷题]入门1.矩阵转置

博客主页:算法歌者本篇专栏:[刷题]您的支持,是我的创作动力。 文章目录 1、题目2、基础3、思路4、结果 1、题目 链接:洛谷-B2106-矩阵转置 2、基础 此题目主要考察二维数组的掌控能力。 3、思路 观察,可知&#…...

Flutter开发之flutter_local_notifications

flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时,默认调用此方法,将实例对象返回出去static NotificationHelper? _instance null;sta…...

Gradle和maven

大家好,我是风筝 作为Java 开发者,你平时用 Maven 还是 Gradle? 我一直用的都是 Maven,但是前几天做了一个小项目,用的是 Gradle,因为项目创建出来默认就是用的 Gradle,而且功能足够简单&#x…...

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机(Exchanges)4.2 临时队列(Temporary Queues&am…...

服务器被挂马怎么办?——解决服务器被挂马的方法和步骤

服务器被挂马(即被植入恶意软件)是一个常见的网络安全问题,可能导致数据泄露、服务中断和经济损失。本文将详细介绍如何检测和清除服务器上的恶意软件,并提供实用的代码示例,帮助读者解决服务器被挂马的问题。 一、什…...

Qt 项目架构设计

在开发一个 Qt 项目时,合理的文件夹结构和清晰的构建流程是非常重要的。Qt 项目通常需要管理源代码、UI 文件、资源文件、构建脚本等。下面我会给出一个详细的文件夹结构示例,并解释每个部分的作用及如何设计 Makefile 或使用 Qt 的 qmake 来自动化构建过…...

Elasticsearch:管理和排除 Elasticsearch 内存故障

作者:来自 Elastic Stef Nestor 随着 Elastic Cloud 提供可观察性、安全性和搜索等解决方案,我们将使用 Elastic Cloud 的用户范围从完整的运营团队扩大到包括数据工程师、安全团队和顾问。作为 Elastic 支持代表,我很乐意与各种各样的用户和…...

高级java每日一道面试题-2024年11月07日-Redis篇-Redis有哪些功能?

如果有遗漏,评论区告诉我进行补充 面试官: Redis有哪些功能? 我回答: Redis 是一个开源的、基于键值对的 NoSQL 数据库,以其高性能、丰富的数据结构和多种功能而闻名。在高级 Java 面试中,了解 Redis 的核心功能和高级特性是非常重要的。以下是 Redi…...

实用且免费的 IP 地域查询 API 接口推荐

实用且免费的 IP 地域查询 API 接口推荐 在日常开发中,IP 地域查询是一个常见需求。最近无意间发现一个实用的 IP 地域查询 API,目前是免费的,未来是否收费尚不可知,但在当前情况下非常值得推荐。 API 地址示例: ht…...

STM32学习笔记----SPI协议

STM32的SPI(串行外设接口,Serial Peripheral Interface)是一种常见的同步串行通信协议,广泛应用于与传感器、显示屏、存储设备等外设的通信。SPI通过主从模式(Master/Slave)来实现数据交换,其中…...

Ceph的pool有两种类型

Replicated Pool(拷贝型Pool,默认) 概述: 这是Ceph的默认存储池类型。它通过生成对象的多份拷贝来确保数据的冗余和高可用性。 工作原理: 每个存入的对象(Object)都会被存储为多个副本&#xf…...

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中,以建立自己的绘图方法。WizFlow附带了完整的流程图模板,以帮助您入门。…...

设计模式之插件模式

插件模式是一种设计模式,可以让您在不修改现有系统代码的情况下扩展功能,非常适合实现监控软件和交换机配置的解耦。在嵌入式Linux系统中,您可以使用C++实现插件机制,使监控软件能够动态加载交换机型号的配置模块。这种方式允许您通过插件形式快速适配新型号的交换机。 插…...

深度学习基础—Beam search集束搜索

引言 深度学习基础—Seq2Seq模型https://blog.csdn.net/sniper_fandc/article/details/143781223?fromshareblogdetail&sharetypeblogdetail&sharerId143781223&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上篇博客讲到,贪心算…...

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种: TTL232485 串口的相关知识: 01-【HAL库】STM32实现串口打印(printf方式) , 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…...

任务调度中心-XXL-JOB使用详解

目录 详解 调度中心 执行器 原理 快速入门 源码仓库地址 1.初始化数据库 2.配置调度中心 1.解压源码 2.需改配置文件 3.启动调度中心 3.配置执行器 1.引入pom依赖 2.修改配置文件 3.执行器组件配置 4.部署执行器项目 4.开发第一个任务 BEAN模式(类…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

爬虫基础学习day2

# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦&#xff0…...

若依登录用户名和密码加密

/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...