String【Redis对象篇】

🏆 作者简介:席万里
⚡ 个人网站:

文章目录

  • String
    • 1.String是什么?
    • 2.String怎么用?
    • 3.常用操作
    • 4.底层实现?
    • 5.总结(重点)

String

1.String是什么?

String就是字符串,最大为512MB。

2.String怎么用?

适用存储字节数据、文本数据、序列化后的对象数据等。
缓存场景,Value存Json字符串等信息。
计数场景,因为Redis处理命令是单线程,所以执行命令的过程时原子的。因此String数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等。

3.常用操作

创建、查询、更新、删除。

  1. SET 写操作(创建、更新)
    SET key value [EX seconds] [PX milliseconds] [NX|XX]
    参数:
  • EX second:设置键的过期时间为多少秒。
  • PX millisecond:设置键的过期时间为多少毫秒。
  • NX:只在键不存在时,才对键进行设置操作。SET key value NX等同于SETNX key value。
  • XX:只在键存在时,才对键操作。
    示例:
    SET user:1 “Alice” EX 60 # 设置并在 60 秒后过期
    SET counter 100 NX # 仅在 counter 不存在时设置值
    在这里插入图片描述
  1. GET 读操作
    GET key
    示例:
    GET user:1 # 获取 user:1 的值
  2. MGET 读操作
    MGET key1 key2 … keyN
    示例:
    MGET user:1 user:2 user:3 # 获取多个键的值
  3. SETNX 写操作
    SETNX key value
    示例:
    SETNX user:1 “Alice” # 只有在 user:1 不存在时设置其值
  4. SETEX 写操作
    SETEX key seconds value
  • 设置 key 的值并设置过期时间(秒)。
    示例:
    SETEX session:12345 3600 “user_token” # 设置并在 3600 秒后过期

4.底层实现?

String有三种编码方式:

  • INT编码:就是存一个整型,可以用long表示的整数就以这种编码存储。
  • EMBSTR编码:如果字符串小于等于阈值字节,使用EMBSTR编码。
  • RAW编码:如果字符串大于阈值字节,则用RAW编码。
    redis3.0-4.0阈值是39字节,redis5.0是44字节。

EMBSTR和RAW都是由redisObject和SDS两个结构组成,它们的差异在于,EMBSTR下redisObject和SDS是连续的内存,RAW编码下redisObject和SDS内存是分开的。

EMBSTR优点是redisObject和SDS两个结构可以一次性分配空间,缺点在于如果重新分配空间,整体都需要再分配,所以EMBSTR设计为只读,任何写操作之后EMBSTR都会变成RAW,理念是发生过修改的字符串通常会认为是易变的。

我们注意到,EMBSTR和RAW里都有一个叫SDS的结构,那么它是什么呢?
[图片]

1.增加长度字段len,快速返回长度;
2.增加空余空间alloc-len,为后续追加数据留余地;
3.不再以’\0’作为判断标准,二进制安全。

5.总结(重点)

String可以存储字符数据、文本数据、二进制数据。
1、Redis字符串是怎么实现的?

对于Redis字符串对象的创建,有三种编码方式,分别是INT、EMBSTR、RAW,当创建字符串的文本为整数的时候,就是INT编码,如果当创建的字符串大小 小于等于44字节的时候,会使用EMBSTR编码,大于44字节则是RAW编码,但是44字节这个阈值只适用于Redis3.2以及以后的版本,在3.2之前是3.9版本。

2、为什么阈值是44字节?

在Redis中是采用jemalloc作为内存分配器的,Redis以64字节为阈值区分大小字符串。Redis对象占用的内存大小由RedisObject和SDS组成,RedisObject16字节,SDS中已分配、已申请、标记三个字段固定占3个字节’\0’占一个,所以能存放的数据就是44字节。

3、你知道为什么曾经是阈值是39吗?

3.2之后的版本,SDS结构进行了拆分,EMBSTR用的是sdshdr8,总容量和已使用容量字段减少了6个字节,但由于增加了一个flags字段,所以最终节约了5个字节。

4、你知道EMBSTR和RAWEMBSTR的区别吗?

  1. EMBSTR只需要一次malloc,而RAWStr需要两次,分配RedsiObject和SDS,同样前者需要一次free后者两次free。
  2. EMBSTR读取性能更好,内存碎片率更低。
  3. 如果修改EMBSTR(append操作),那么会将EMBSTR转换成RAWString(重新分配内存)。

5、SDS有什么用?

  1. 相比于普通C字符串,SDS的数据结构增加了占用大小、分配大小的元数据,提升了基于字符串进行追加,比较、复制操作的效率。
  2. 不再通过’\0’字符来判断字符串的结束,保证二进制安全,可以保存图片等二进制数据。
  3. 设计不同的SDS类型和预留空间的元数据来节省内存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

乘上 SpringBoot 东风,广场舞团掀起律动热潮

2 系统开发环境 2.1 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点,而且Java是开源的,拥有全世界最大的开发者专业社群,所以Java的发展迅速。…

组件开发的环境准备

目录​​​​​​​ node.js的安装 npm镜像源的修改 pnpm包管理器的安装(全局安装) 基于pnpm创建脚手架项目 node.js的安装 Node.js 是一个开源的、跨平台的 JavaScript 运行环境,能够在服务器端执行 JavaScript 代码。 a.下载与安装 …

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法,我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响,因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…

gitee常见命令

目录 1.本地分支重命名 2.更新远程仓库分支 3.为当前分支设置远程跟踪分支 4.撤销已经push远程的代码 5.idea->gitee的‘还原提交’ 需要和本地当前的代码解决冲突 解决冲突 本地工作区的差异代码显示 本地commit和push远程 6.idea->gitee的‘将当前分支重置到此…

Ultra-Fast-Lane-Detection复现、部署及训练

Ultra-Fast-Lane-Detection复现、训练及部署 一、复现二、训练三、部署 一、复现 Github下载源码:https://github.com/cfzd/Ultra-Fast-Lane-Detection (1)将GPU运算改为CPU运算:.cuda() -> .to(‘cpu’) test.py中33行&…

【Java计算机毕业设计】基于SSM+VUE宠物领养管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文:https://arxiv.org/pdf/2311.14897v3.pdf 项目:https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位,这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

Linux-ubuntu环境配置

一,安装VWware,里面导入镜像文件 这些都是文件夹里面有的,然后对着正点原子视频安装就行,虚拟机的破解码,去百度搜一个能用就行,中间遇见俩问题。①乌班图里面不能上网,②插入U盘后,…

Python Selenium 各浏览器驱动下载与配置使用(详细流程)

大家好啊!我是NiJiMingCheng 这是我的博客:NiJiMingCheng 这节课我们来学习安装selenium和对应的各个浏览器驱动,个人比较喜欢使用谷歌浏览器驱动,所以接下来以谷歌浏览器来为大家做示例!!! Sel…

工具学习_Buildroot

0. 工具概述 Buildroot 是一个简单、高效且易于使用的工具,旨在通过交叉编译生成嵌入式 Linux 系统。它支持生成交叉编译工具链、根文件系统、内核镜像以及引导加载器。通过类似于内核配置的菜单界面(menuconfig、gconfig、xconfig)&#xf…

【机器人】系统辨识之激励轨迹设计(傅里叶级数)

在机器人参数辨识中使用傅里叶级数,主要是为了生成一种激励轨迹,具有良好的数学特性,同时符合物理要求。傅里叶级数的特性使其在机器人动力学辨识的激励轨迹设计中非常常用。 1. 为什么需要激励轨迹? 激励轨迹的作用是通过驱动机…

Unity简单操作及使用教程

Unity 是一款强大的跨平台游戏引擎,它不仅支持 2D 和 3D 游戏的开发,还可以用于虚拟现实 (VR)、增强现实 (AR)、动画、建筑可视化等多个领域。Unity 提供了完整的开发环境,具有丰富的功能、工具和资源,可以帮助开发者快速实现创意…

前端node环境安装:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

需求:在做前端开发的时候,有的时候 这个项目需要 node 14 那个项目需要 node 16,我们也不能卸载 安装 。这岂不是很麻烦。这个时候 就需要 一个工具 来管理我们的 node 版本和 npm 版本。 下面就分享一个 nvm 工具 用来管理 node 版本。 这个…

为什么数据平台需要敏捷版|直播回顾

11月28日,我们邀请到StartDT合伙人、CTO地雷和StartDT资深战略咨询专家何夕,围绕“为什么数据平台需要敏捷版”这个话题,向大家汇报了DataSimba敏捷版这半年来的最新进展,并带来了详细的产品解读。 敏捷版支持StarRocks、ClickHo…

HarmonyOS-中级(四)

文章目录 Native适配开发三方库的基本使用 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

在现代应用中,实时协作已经成为了非常重要的功能,尤其是在文档编辑、聊天系统和在线编程等场景中。通过实时共享文档,多个用户可以同时对同一份文档进行编辑,并能看到其他人的编辑内容。这种功能广泛应用于 Google Docs、Notion 等…

统信桌面专业版部署postgresql-14.2+postgis-3.2方法介绍

文章来源:统信桌面专业版部署postgresql-14.2postgis-3.2方法介绍 | 统信软件-知识分享平台 应用场景 CPU架构:X86(海光C86-3G 3350) OS版本信息:1070桌面专业版 软件信息:postgresql-14.2postgis-3.2 …

jmeter 提取数据写入文件

BeanShell PostProcessor FileWriter file new FileWriter("E:\\IOT\\cui家庭中心\\v3.8.0\\123.txt",true); BufferedWriter out new BufferedWriter(file); out.write(vars.get("localKey")"\n"); log.info("到这里了吗"); out.c…

在ensp中ACL路由控制实验

一、实验目的 掌握ACL路由控制管理 二、实验要求 要求: 配置路由策略,左右两边不公开区域对方不可达,其他区域可以互相ping通 设备: 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…

MySQL 实现分库分表详解

MySQL 实现分库分表详解 为什么要分库分表什么是分库分表分库分表的几种方式垂直拆分数据库垂直拆分表垂直拆分垂直拆分特点垂直拆分优缺点优点缺点 水平拆分数据库水平拆分表水平拆分水平拆分的其他方式水平拆分特点水平拆分优缺点优点缺点 分库分表带来的问题分库分表技术如何…