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

怎样在微信公众号里做微网站/全能优化大师

怎样在微信公众号里做微网站,全能优化大师,手机自适应的网站怎么做,网站大气是什么意思文章目录 前言一、 字符串类型:1.1 字符串的编码格式:1.1.1 raw 编码格式:1.1.2 empstr编码格式:1.1.3 int 编码格式:1.1.4 字符串存储结构展示: 二、 list类型:2.1 List 底层数据支持:2.2 List 源码实现:2.3 List 结构…

文章目录

  • 前言
  • 一、 字符串类型:
    • 1.1 字符串的编码格式:
    • 1.1.1 raw 编码格式:
    • 1.1.2 empstr编码格式:
    • 1.1.3 int 编码格式:
    • 1.1.4 字符串存储结构展示:
  • 二、 list类型:
    • 2.1 List 底层数据支持:
    • 2.2 List 源码实现:
    • 2.3 List 结构展示:
  • 三、set类型:
    • 3.1 set 数据特点:
    • 3.2 set 底层源码实现:
  • 四、zset类型:
    • 4.1 zset类型特点:
    • 4.2 zset源码实现:
    • 4.3 zset结构展示:
  • 五、hash类型:
    • 5.1 hash 数据特点:
    • 5.2 hash 数据结构的实现:
    • 5.3 hash源码实现:
  • 六、Redis 数据中key和value 的对应:
    • 6.1 redisObject key 和value 的对应:
    • 6.2 不同数据的对应:
  • 总结


前言

在 源码篇–Redis 底层数据结构 章节中介绍了redis 底层的数据结构,而底层的数据结构又是为了数据存储而设计的,那么redis 中我们都可以存入哪些数据类型呢?


一、 字符串类型:

在redis 中我们可以直接将字符串,作为key 或者value 进行存储,它的底层 就是使用了 SDS 进行实现的;

1.1 字符串的编码格式:

1.1.1 raw 编码格式:

基于动态字符串(sds) 实现,存储数据的最大上限为512mb;
在这里插入图片描述

  • 此时 ptr 是指向 sds 数据对象的指针; sds 对象指向独立的内存空间,使用raw 存储时需要分别申请redisobject 和sds 的内存空间;

1.1.2 empstr编码格式:

当字符串的长度小于44 字节 总的redisobject 的长度占用是最多是64字节(redis 分配内存时不会产生内存碎片),会使用empstr 编码,此时object head 与sds 是连续的内存空间,申请内存时 可以一次性申请所需要内存,效率更高;如果超过 44 字节会转为 raw 编码格式;
在这里插入图片描述

可以看到存入的如果是字符串最终都是通过SDS 实现的,如果我们存储的虽然是字符串,但是它实际上是一个正数值,那么redis 底层会采用 int 的编码;

1.1.3 int 编码格式:

当存储的字符串是一个整数值,大小在LONG_MAX 范围内,使用 int 编码,将redisobject 的 ptr 指针位置(刚好8字节64 位)直接存储数据,不需要在使用sds 部分:

在这里插入图片描述

1.1.4 字符串存储结构展示:

在这里插入图片描述

所以我们在向redis存入字符串时,其底层使用的数据 结构并不是一成不变的,加入一开始存入 一个‘100’ 的整数字符串,其使用int 编码;
如果我们此时进行修改为 ‘name’ 因为其只有4个字符,所以此时编码是 empstr,如果我们存储的字符串超过 44个字节 又会变成raw 格式;我们在存储字符串尽量不要超过44个字节,如果可以使用整数,尽量使用整数;

二、 list类型:

2.1 List 底层数据支持:

list 集合,我们可以从首尾进行元素的插入和读取;
在这里插入图片描述
显然链表结构就可以完美支持:

  • LinkedList:普通链表,可以从双端访问,内存占用较高,内存碎片较多;
  • zipList: 压缩列表,可以从双端访问,内存占用低,存储上限低
  • QuickList: LinkedList + ZipList,可以从双端访问,内存占用较低,包含多个ZipList,存储上限高;

2.2 List 源码实现:

在这里插入图片描述
根据list 的key 找对应的链表 如果找到则直接插入,如果没有找到 在进行链表的创建,然后插入;在3.2版本之前,Redis采用ZioList和LinkedList来实现List,当元素数量小于512并且元素大小小于64字节时采用ZipList编码,超过则采用LinkedList编码。在3.2版本之后,Redis统一采用QuickList来实现List

2.3 List 结构展示:

在这里插入图片描述
可以看到 redisobjec 内部使用 quicklist 进行存储,而quicklist 链表内部又使用了zipList;

三、set类型:

3.1 set 数据特点:

set 数据类型,需要保证存入元素的唯一性,可以不要求其有序性:
在这里插入图片描述
怎么保证以上特点的前提下,实现高速的查询?

  • hash(dict) 通过key 定位数组下标,快速定位; 采用dict 编码,dict 的key 来存储元素,value 统一为null;

  • 当存储的所有数据都是整数,并且元素数量不超过 set-max-inset-entries (默认值512 )时 set 使用inset 编码,节省内存,当超过set-max-inset-entries 时 是用dict 编码;

3.2 set 底层源码实现:

在这里插入图片描述
可以看到每次在掺入是,如果发现插入的是数字类型则先使用 intset 编码,如果不是数字类型则使用dict;

inset 编码数据结构:
在这里插入图片描述

dict 编码数据结构:
在这里插入图片描述

因为set 底层使用了两种编码inset 和dict ,所以也是会存在 编码的转换的,当每次插入的都是整数,并且集合中的元素不超过 set-max-inset-entries(设置的最大值不能超过 2^30 如果超过则直接取2^30,默认值512 ) 则使用dict ,一旦不满足则会转换为dict;

四、zset类型:

4.1 zset类型特点:

zset数据类型需要保证 元素唯一性的前提下,还要保证其有序性;
在这里插入图片描述

可排序的集合,每个元素都要指定一个score 值和member 值;可以根据score 信息排序;member 必须唯一,重复插入后插入覆盖之前插入的元素;根据member 查询分数:

对于以上的特点现有的任何一种单独的数据类型都不支持,所以此时就需要考虑组合类型了,使用skiplist 和 dict 结合的方式,使用skiplist 来支持排序,使用dict 存k-v的存储;

4.2 zset源码实现:

在这里插入图片描述

  • skipList: 可以排序,并且可以同时存储score和ele值 (member);
  • HT(Dict):可以键值存储,并且可以根据kev找value;

4.3 zset结构展示:

在这里插入图片描述
此种结构功能强大,性能非常好技能支持排序又能支持根据key 找value 但是内存占用很大;所以redis 并不是一开始就直接使用这种组合结构,;当元素数量少时 使用zipList 来进行存储;

使用zipList 存储的条件:

  • 元素数量小于zset max ziplist entries,默认值128
  • 每个元素都小于zset max ziplist value字节,默认值64

zset 初始化:先判断元素数量和插入元素大小,如果不满足则适应 dict + skiplist 编码,否则使用ziplist:
在这里插入图片描述
这里就设计到了编码转换,如果最开始是ziplist 但是随着元素数量的增加 元素数量和插入元素大小 超过128 活元素大小超过64;则进行编码转换:
在这里插入图片描述
ziplist本身没有排序功能,而且没有键值对的概念 它是怎么做到,key 唯一,并且可以排序:答案是使用业务代码进行支持:
在这里插入图片描述

ZipList是连续内存,因此score和element是紧挨在一起的两个entry,element在前,score在后,score越小越接近队首,score越大越接近队尾,按照score值升序排列;在通过key 查找是因为元素较少直接进行遍历查找;

五、hash类型:

5.1 hash 数据特点:

hash 数据的 键值key 是 唯一的,可以根据key 获取到value 值;
在这里插入图片描述

5.2 hash 数据结构的实现:

当元素较少时 使用zipList 编码,节省内存,ziplist 相邻的entry 分别 保持field 和 value:
在这里插入图片描述
当超过一定的条件:当数据量较大时,Hash结构会转为HT编码,也就是Dict,触发条件有两个:

  • ZipList中的元素数量超过了hash-max-ziplist-entries (默认512)
  • ZipList中的任意entry大小超过了hash-max-ziplist-value(默认64字节)

在这里插入图片描述

5.3 hash源码实现:

  • 先根据key : user1 判断可以是否存在,不存在则创建一个新的与key 对应的ziplist :
    在这里插入图片描述

在这里插入图片描述

  • 判断ziplist 的元素个数,和每个元素的大小,来判断是否需要转换 dict;

在这里插入图片描述

  • for 循环 遍历将对应改key 的 filed 和value 进行设置;

在这里插入图片描述

六、Redis 数据中key和value 的对应:

6.1 redisObject key 和value 的对应:

我们知道 redis 内部 会将key 以及value 封装成为一个对应的 redisobject 对象,那么它们直接是怎么关联的,它怎么知道某一个key 对应到对应的value 值;

在这里插入图片描述

在Redis中,key和value是通过哈希表进行关联的。每个哈希表都有一个键值对,其中key是唯一的,并且与对应的value相关联

当我们执行例如SET命令来设置一个key和value时,Redis会将key和value都封装为RedisObject对象,并将它们插入到相应的哈希表中。通过哈希函数,Redis能够根据key计算出一个哈希值,然后将其映射到一个槽位上。

Redis内部会维护一个哈希表数组,每个槽位上都有一个链表,链表上存储了具有相同哈希值的键值对。当插入一个新的键值对时,Redis会根据哈希值找到对应的槽位,然后将该键值对插入到链表的头部。这样,通过哈希表的索引结构,Redis能够快速定位到指定key的value。

当我们执行例如GET命令来获取一个key对应的value时,Redis会根据key计算出哈希值,并在对应的槽位上的链表中顺序查找,找到匹配的键值对后返回对应的value。

通过哈希表的索引结构,Redis能够高效地关联和查找key和value的对应关系。这种设计使得Redis在大规模数据集情况下也能保持很好的性能表现。

6.2 不同数据的对应:

  • 对于key 和value 都是字符串来说,value 对应的redisobject 内部使用sds 来进行数据存储;
  • List和Set类型的数据结构都是通过哈希表进行关联的,类似于字符串类型的键值对关系。不同之处在于,List和Set的value是一个有序(List)或无序(Set)的集合。
  • 对于has 类型数据结构key 和value 也是通过哈希表进行关联的,只不过value 对应的redisobject 内部使用 zipList 或者dict 进行存储;在进行hash 存储时 hset user:1 name Jack age 21 ,它 的key filed 和value 对应如下
    Key: “user:1”
    Field 1: “name”
    Value 1: “Jack”
    Field 2: “age”
    Value 2: 21
  • 对于zset 类型数据结构key 和value 也是通过哈希表进行关联的,只不过value 对应的redisobject 内部使用 zipList / siplist + dict 实现;

总结

Redis 会根据不同数据类型底层采用不同的 数据结构进行保存,对于key 和value 来说,都会被封装成为一个redisobject 对象,key 是一个字符串的redisobject 对象其内部主要通过sds 实现,value 会根据存储的数据不同而在redisobject 对象内部 使用hash/ziplist/quicklist/sds/skiplist 进行实现;而 key 和value 的对应关系 可以通过哈希表进行关联的,每次都对key 做hash 计算从而得到 hash 槽位的下标进而找到 对应的value 链表

相关文章:

源码篇--Redis 五种数据类型

文章目录 前言一、 字符串类型:1.1 字符串的编码格式:1.1.1 raw 编码格式:1.1.2 empstr编码格式:1.1.3 int 编码格式:1.1.4 字符串存储结构展示: 二、 list类型:2.1 List 底层数据支持:2.2 List 源码实现:2.3 List 结构…...

Sulfo Cy2 Biotin,水溶性 Cy2 生物素,能够与各种氨基基团特异性结合

您好,欢迎来到新研之家 文章关键词:Sulfo Cyanine2 Biotin,Sulfo Cy2 Biotin,水溶性 Cy2 生物素,Sulfo-Cy2-Biotin,水溶性-Cy2-生物素 一、基本信息 产品简介:Sulfo Cyanine2 Biotin, also k…...

NineData支持制定安全、可靠的SQL开发规范

在和数据库打交道中,不管是数据库管理员(DBA)还是开发人员,经常会做一些CURD操作。因为每个人对数据库的了解程度不一样,所以在项目上线时,往往还需要专职人员对数据库的CURD操作进行审核,确保C…...

LSTM时间序列预测

本文借鉴了数学建模清风老师的课件与思路,可以点击查看链接查看清风老师视频讲解:【1】演示:基于LSTM深度学习网络预测时间序列(MATLAB工具箱)_哔哩哔哩_bilibili % Forecast of time series based on LSTM deep learn…...

Rocky8 顺利安装 Airflow 并解决数据库报错问题

rocky是替代centos的服务器系统,稳定可靠。rocky8会比centos7新,可以支持更多服务软件的安装,免去升级各种库的麻烦,本文运行airflow服务就用rocky8系统。airflow是一个定时任务管理系统,功能强大,目前是ap…...

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-3 线性二次型调节器(LQR)

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-3 线性二次型调节器(LQR) 1. 数学推导2. 案例反洗与代码详解 1. 数学推导 2. 案例反洗与代码详解...

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs

大开眼界?探索多模态模型种视觉编码器的缺陷。 论文中指出,上面这些VQA问题,人类可以瞬间给出正确的答案,但是多模态给出的结果却是错误的。是哪个环节出了问题呢?视觉编码器的问题?大语言模型出现了幻觉&…...

汤姆·齐格弗里德《纳什均衡与博弈论》笔记(4)博弈论与人性

第五章 弗洛伊德的梦——博弈和大脑 大脑和经济学 曾经有一段时间——就像在弗洛伊德的年代——心理学家们无法准确地回答人类行为背后的大脑机制。但随着现代神经科学的兴起,情形改变了。比如,人类的情绪不再像过去一样是个谜。科学家们可以观察当人们…...

MacOS平台翻译OCR软件,双管齐下,还可自定义插件,为其添砖加瓦!

小编昨天为大家分享了Windows系统下的一款功能强大且免费的 OCR 开源工具 Umi-OCR。 今天则为大家推荐一款 MacOS系统下的一款 翻译 OCR 多功能双管齐下的桌面应用软件 Bob。这款软件虽然也上线了GitHub,但它不是一款开源软件,仓库只是作者为了用户反馈…...

使用docker配置semantic slam

一.Docker环境配置 1.拉取Docker镜像 sudo docker pull ubuntu:16.04拉取的为ununtu16版本镜像&#xff0c;环境十分干净&#xff0c;可以通过以下命令查看容器列表 sudo docker images 如果想删除多余的docker image&#xff0c;可以使用指令 sudo docker rmi -f <id&g…...

面试常问的Spring AOP底层原理

AOP底层原理可以划分成四个阶段&#xff1a;创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段 第一阶段&#xff1a;创建代理对象阶段 通过getBean&#xff08;&#xff09;方法创建Bean实例根据AOP的配置匹配目标类的类名&#xff0c;判断是否满足切…...

C++拾遗(四)引用与指针

引用和指针是两种不同的概念&#xff0c;尽管它们在某些方面有一些相似之处&#xff0c;但它们在功能和用途上是有所区别 声明与定义 引用&#xff1a;引用是别名&#xff0c;是对已存在变量的另一个称呼&#xff0c;一旦一个变量被引用&#xff0c;就不能再被引用其他变 量…...

k8s架构、工作流程、集群组件详解

目录 k8s概述 特性 作用&#xff08;为什么使用&#xff09; k8s架构 k8s工作流程 k8s集群架构与组件 核心组件详解 Master节点 Kube-apiserver Kube-controller-manager Kube-scheduler 存储中心 etcd Node Kubelet Kube-Proxy 网络通信模型 容器引擎 k8s核…...

CF1362C Johnny and Another Rating Drop(二进制、复杂度考虑)

看完数据范围 n ∈ [ 1 , 1 e 18 ] n\in[1,1e18] n∈[1,1e18]就可以先猜一下要不是可以直接推公式&#xff0c;不能暴力去做&#xff0c;更不能遍历一遍&#xff0c;又看到这种2进制的题目&#xff0c;要猜是不是 l o g log log级别的复杂度。 可以依次考虑每一位 所有 i % 2 …...

1 - 搭建Redis数据库服务器|LNP+Redis

搭建Redis数据库服务器&#xff5c;LNPRedis 搭建Redis数据库服务器相关概念Redis介绍安装RedisRedis服务常用管理命令命令set 、 mset 、 get 、 mget命令keys 、 type 、 exists 、 del命令ttl 、 expire 、 move 、 flushdb 、flushall 、save、shutdown 配置文件解析 LNP …...

米贸搜|Facebook“精准营销”越来越难?或许是“受众定位”没彻底搞清!

一、为何要确定目标受众 对于每个广告主而言&#xff0c;面向最有可能成为其客户的用户营销非常重要&#xff0c;因此&#xff0c;确定目标受众&#xff0c;是Facebook广告投放中极其重要的一环。 二、什么是目标受众&#xff1f; 目标受众是您希望向其传达营销信息&#xf…...

【C++】内存分区模型

目录 1.程序运行前 2.程序运行后 3. new操作符 3.1 基本语法 3.2 开辟数组 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 全局区&#xff1a; 存放全局变量和静态变量以及常量栈区 …...

通过strings二进制文件分析工具排查 version ‘GLIBC_2.25‘ not found 报错

strings命令简介 strings命令用于打印文件中可打印字符串, 可以打印文本文件、可执行程序&#xff0c;库文件等。一般用于分析可执行程序和库文件。strings命令较为常用的功能有以下两种 查看系统的GLIBC版本和目标文件的依赖的GLIBC版本&#xff0c;当系统的GLIBC版本与目标文…...

基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151

Koenkk/zigbee2mqtt Stars: 10.5k License: GPL-3.0 Zigbee2MQTT 是一个 Zigbee &#x1f41d; 到 MQTT 桥接器 &#x1f309;&#xff0c;可以摆脱专有的 Zigbee 桥接器 &#x1f528; 允许您在不使用供应商桥接器或网关的情况下使用 Zigbee 设备通过 MQTT 桥接事件并控制 Z…...

【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libjpeg介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libjpeg介绍 libjpeg是一个广泛使用的jpeg图像压缩和解压的函数库,采用 C 语言开发。 2013年1月,Independent JPEG Group发布了版本9,对新引入的无损编码模式进行了改进。2022年1月,发布了版…...

VI / VIM的使用

vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容 vi 的所有指令&#xff0c;而且 还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于 x win…...

第十二站(20天):C++泛型编程

模板 C提供了模板(template)编程的概念。所谓模板&#xff0c;实际上是建立一个通用函数或类&#xff0c; 其 类内部的类型和函数的形参类型不具体指定 &#xff0c;用一个虚拟的类型来代表。这种通用的方式称 为模板。 模板是泛型编程的基础, 泛型编程即以一种独立于任何特定…...

【Docker】Dokcer学习① - 简介

【Docker】Docker学习① - 简介 一、Docker简介1. Docker是什么2. Docker组成3. Docker对比虚拟机4. Linux Namespace技术5. Linux control groups6. 容器管理工具 二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理六、网络部分七、Dock…...

PostgreSQL 100条命令

我会为您提供一些 PostgreSQL 中最常用的命令&#xff1a; 1. 创建数据库&#xff1a;CREATE DATABASE database_name; 2. 连接到数据库&#xff1a;\c database_name; 3. 创建表格&#xff1a;CREATE TABLE table_name (column1 datatype, column2 datatype, ...); 4. 插入数…...

HTTP动态代理的原理及其对网络性能的影响

HTTP动态代理是一种通过代理服务器来转发HTTP请求和响应数据的网络技术&#xff0c;它可以优化网络性能、提高网络安全性&#xff0c;并解决跨域请求的问题。本文将详细介绍HTTP动态代理的原理及其对网络性能的影响。 一、HTTP动态代理的原理 HTTP动态代理的基本原理是在客户…...

69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey

文章目录 一&#xff1a;简介二&#xff1a;Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三&#xff1a;代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址&#xff1a; https://gitee.com/lymgoforIT/golang-trick/t…...

JavaScript实现的一些小案例

小案例 灯开关案例 <body><img id"light" src"img/off.jpg"><script>var light document.getElementById("light");var flag false;if(flag){light.src "img/on.jpg";flag false;}else{light.src "img/…...

MVC模式

Model-View-Controller : 模型-视图-控制器模式&#xff0c;用于应用程序的分层开发。 Model(模型)&#xff1a;代表一个存取数据的对象。也可以带有逻辑&#xff0c;在数据变化时更新控制器。 View(视图)&#xff1a;代表模型包含的数据的可视化。 Controller(控制器)&#xf…...

Java中的代理模式(一)

大家好&#x1f44b;&#xff0c;我是极客涛&#x1f60e;&#xff0c;今天我们聊一聊java中的代理模式&#xff0c;话不多说&#xff0c;还是老思路&#xff0c;什么是代理模式&#xff0c;为什么要有代理模式&#xff0c;如何实现代理模式 代理模式 在说java中的代理模式之前…...

跳跃游戏-算法

题目 给定一个数组nums {1,2,3,4,5}&#xff0c;每个元素nums[i]表示从i这个位置最多可以向前跳跃nums[i]个台阶&#xff0c;求最小需要跳几次就可以调到末尾 思路 反向查找 从末尾开始逐个向前判断最远的起跳位置&#xff0c;接着再以该位置递归的判断 public int jumpT…...