String类型

news2025/1/14 9:38:32

前言

之所以介绍是因为基本数据类型是系统中一切操作的基础,就像物理世界中的原子,高楼大厦中的砖瓦。当咱们整明白了这些基本数据类型,使用层面就是挑选和组合的问题了。本文小结下Redis中数据结构和使用场景,如果你有更骚气的挑选和组合方式,欢迎在评论区留下你的痕迹。

一、必要性

个人已知的存储系统,无论是磁盘,内存又或是CPU内部的缓存,在逻辑层面其实都是一种Key-Value的访问模式。也就是给定一个Key(可能是磁盘地址,内存地址,缓存地址),返回一个value(本质上是个字节数组)。所以,Redis作为一种缓存实现方式, 肯定要实现K-V存储。毕竟这玩意是最简单的缓存使用方式,写入和独读出。

二、怎么实现的

1. 基础结构

咱们想直接基于C的字符串实现就好了,实际却是一个叫SDS的字符串。这玩意儿长这个样子
请添加图片描述

字段名称字段内容
free字符串剩余空间大小,如果为0说明buf中没有空闲位置, 否则buf中还有free个字节剩余
len字符串长度
buf实际存储的字节数组,考虑到字符串的动态变化

2. 结构特点

a. 空间预分配

创建字符串时,buf的实际长度通常比存储的字符串长度要长。这样更新时候可以减少数组的扩容成本。

空间大小预分配数量(表中1M表示数量1024 * 1024)
len < 1M多分配len个字节,此时free=len,实际能支持的最大长度为 len * 2 + 1
len >= 1M多分配1M个字节,此时free=1M, 实际能支持的最大长度为 len + 1M + 1

b. 空间惰性回收

如果字符串长度被裁剪,Redis也不会马上对空间进行回收,毕竟以后还有可能会变长。这样经过一段之后,所有的字符串都达到了最大长度,基本不需要做额外的空间分配。

c. 二进制安全

首先,我们得知道字符串本身是一堆的字符组成的,而字符最后是由一个个字节标识的。由于一个字节只有8位,至多表示255个字符。然世界上又如此多的语言,仅中文有10万个字符,于是就出现了UTF-8/UTF-16等扩展编码。因此,一个可显示的字符串的信息包括字节和对应的编解码方式。

其次,Redis作为一个存储系统,不关心编解码方式,只关心实际的字节序列。此时如果严重依赖C语言中的’\0’结尾可能存在误判,比如字符串中就包含一个’\0’字符,有了len字段直接从buf[0]读取到buf[len-1]即可,也就是只关心数组序列不关心编码。这就是二进制安全。

d. C字符串兼容

个人认为有了len可以不要那个’\0’, 但毕竟通过C语言实现,兼容下减少些别扭。所以增加了’\0’, 以保持兼容,至少在直接基于C语言开发和调试的时候,体验会很爽。当然,实际情况确实兼容了,但作者没说他是否为了方便开发和调试。

三、Redis特色

到这里,你已经知道字符串在Redis内部除了metadata信息外就是一波字节序列,那能不能直接对字节做操作呢?显然是可以的。其实这算是一个颗粒度问题,字符级,字节级和位级。这里想强调的是字节级和位级。

级别操作
字节级将存储的字节内容当做一个整数, 比如incr 做+1操作, 当然此时会尝试做数据类型转换。如果长度特别长可能会失败。
位级将存储的字节作为一个bitmap,操作其中的某个位

更多的操作详情,还得参考Redis官方文档,这里只是探讨下Redis支持这些操作背后的事情。

四. 使用场景

场景说明
简单缓存将读多写少数据缓存其中, 比如一篇博客,降低数据源压力
存在性问题作为bitmap记录是否xx, 比如记录用户是否登录,如果记录了多天的登录统计数据还可做用户行为分析
不严格统计问题记录总数,比如一篇博客的点赞数,评论数,转发数

总结

以上就是今天要分享的全部内容,本文介绍了Redis中的String类型,以及由此延伸出的字节级和位级操作,最后总结了下常见的使用场景。鉴于本人水平有限,如有遗漏还请不吝赐教,感谢你的阅读。

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

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

相关文章

Python中文件的读取

在Python中可以通过内置函数open()、read()和readline()实现文件的读取。 1 打开文件函数 1.1 open()函数的基本用法 open()是Python的内置函数&#xff0c;用来打开指定文件。该函数使用代码如下所示&#xff1a; fin open(words.txt) 其中&#xff0c;参数指定了要打开…

【软件设计师暴击考点】计算机网络知识高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

NodeJS Request下载图片文件到本地⑩⑦

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言使用模块创建文件删除文件写入图片案例效果总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f…

网页前端制作需要哪些基础知识?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言HTML基础知识1 HTM…

存款进阶“10万元门槛”,年轻人为何遭遇困境?

文章目录 ❗❗ 前言&#x1f48c;目前的存款在哪一个区间&#xff1f;你觉得存款难吗&#xff1f;&#x1f622;存钱到底有多难&#xff1f;&#x1f90d;为存款做出过哪些努力&#xff1f;&#x1f9e7;没钱更要理财吗&#xff1f;&#x1f194;影响年轻人存款能力和存款意愿的…

C++多态 动态联编 静态联编 虚函数 抽象类 final override关键字

C多态 多态多态原理 动态联编和静态联编纯虚函数和抽象类C11的final override关键字重载 隐藏 重写的区别 多态 1.派生类中定义虚函数必须与基类中的虚函数同名外&#xff0c;还必须同参数表&#xff0c;同返回类型。 否则被认为是同名覆盖&#xff0c;不具有多态性。 如基类中…

NCI Architecture

2.1 组成部分 NCI 可分为以下逻辑组件&#xff1a;  NCI 核心 NCI 核心定义了设备主机 (DH) 和 NFC 控制器 (NFCC) 之间通信的基本功能。 这使得 NFCC 和 DH 之间能够进行控制消息&#xff08;命令、响应和通知&#xff09;和数据消息交换。  传输映射 传输映射定义 N…

Excel百万级别数据的导入和导出【详细代码】

代码层级结构 DurationAspect package com.zhouyu.aspect;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.A…

MFC 截图功能实现(2)

上篇文章里面所用的截图是点击按钮就截取当前打开的界面&#xff0c;链接&#xff1a; MFC 截图功能实现_春蕾夏荷_728297725的博客-CSDN博客 这里所用的截图是可以选中区域&#xff0c;另存为目录等的操作&#xff1a; 效果&#xff1a; 选中区域&#xff1a; 菜单&#xf…

javaee 任务调度,定时任务 多个任务同时执行

错误的写法 如果按照下图的写法&#xff0c;两个任务不会同时执行&#xff0c;因为是一个线程&#xff0c;两个任务是串行的关系。 可以看到第二个任务是等第一个任务执行完以后&#xff0c;才执行的。 正确的写法 使用线程池&#xff0c;为每一个任务创建一个线程 可以看…

Markdown中使用 LaTeX 编辑数学公式

Markdown中使用 LaTeX 编辑数学公式 1 介绍TeX&#xff08;计算机排版系统&#xff09;LaTeX&#xff08;TeX宏集&#xff09;KaTeX 和 MathJax 2 注意点单双美元符号包裹问题KaTeX 有些不支持 3 语法保留字符希腊字母希伯来字母二元运算符二元关系符几何符号逻辑符号集合符号箭…

Linux下一切皆文件的理解

目录 一. 回顾上文 Linux底层进程和被打开文件的映射关系图&#xff1a; Linux部分源代码示意图如下&#xff1a; ​编辑 二.Linux下一切皆文件的核心理解 一. 回顾上文 在前两篇文章中&#xff0c;我论述了Linux系统中关于文件基础IO的一些内容&#xff1a; 1.有关于文件…

RT-Thread-05-空闲线程和两个常用的钩子函数

空闲线程和两个钩子函数 空闲线程是一个比较特殊的系统线程&#xff0c;它具备最低优先级&#xff0c;当系统中无其他就绪线程可运行时&#xff0c;调度器将调度到空闲线程&#xff1b;空闲线程还负责一些系统资源回收以及将一些处于关闭状态的线程从线程调度列表中移除&#x…

Nautilus Chain:模块化Layer3架构为RWA赛道构建基础设施

DeFi Summer后&#xff0c;加密行业经历了新一轮的爆发、增长后&#xff0c;整体的发展逐渐陷入滞缓。传统金融是一个经过了上百年发展的成熟市场&#xff0c;将800万亿美元体量的传统金融不断引入到链上有望推动加密行业迎来新一轮的质变。将传统资产以加密代币化的形式引入到…

【从零开始学习JAVA | 第十七篇】抽象类与抽象方法

目录 前言&#xff1a; 抽象类与抽象方法&#xff1a; 抽象类&#xff1a; 抽象方法&#xff1a; 特点&#xff1a; 抽象类 抽象方法 注意事项 抽象类 与 抽象方法的意义 抽象类 抽象方法 前言&#xff1a; 在之前&#xff0c;如果我们要构建两个相同类型的类的时候&…

【C++】泛型编程——模板进阶

文章目录 前言1. 模板参数的分类2. 非类型模板参数2.1 非类型模板参数的概念2.2 铺垫2.2 非类型模板参数的使用2.4 注意2.5 array的了解 3. 模板的特化3.1 概念3.2 函数模板特化3.3 类模板特化3.3.1 全特化3.3.2 偏特化部分特化参数更进一步的限制 4. 模板分离编译4.1 什么是分…

基于TF-IDF算法个人文件管理系统——机器学习+人工智能+神经网络(附Python工程全部源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 词频计算与数据处理3. 数据计算与对比验证 系统测试工程源代码下载其它资料下载 前言 本项目旨在通过应用TF-IDF算法&#xff0c;将新下载的课件进行自动分类整理。我们的方法是通过比较新文件中的…

Matlab统计分析-相关系数

统计分析-相关系数 相关系数 (pearson与spearman) 皮尔逊 person相关系数和斯皮尔曼spearman等级相关系数&#xff0c;它们可用来衡量两个变量之间的**(线性)**相关性的大小&#xff0c;根据数据满足的不同条件&#xff0c;我们要选择不同的相关系数进行计算和分析。 基础概…

C生万物 | 常见的六种动态内存错误

学习过C语言中的动态内存函数&#xff0c;例如【malloc】、【calloc】、【realloc】、【free】&#xff0c;那它们在使用的过程中会碰到哪些问题呢&#xff0c;本本文我们一起来探讨下~ 1、对NULL指针的解引用操作 代码&#xff1a; void test() {int *p (int *)malloc(INT_…

Sui链上事务处理概述

Sui通过其混合式交易处理方法&#xff0c;实现比其他区块链更快速和高效的性能。这种方法使得Sui的交易测试吞吐率达到每秒297,000次。从实际应用的角度来看&#xff0c;使用Sui的用户在apps和游戏中几乎能够获得实时响应。 在区块链世界中&#xff0c;交易是apps运作的基础&a…