2023.12.22 关于 Redis 数据类型 String 常用命令

目录

引言

String 类型基本概念

SET & GET

SET 命令

GET 命令

MSET & MGET

MSET 命令

MGET 命令

SETNX & SETEX & PSETEX

SETNX 命令

SETEX 命令

PSETEX 命令

计数命令

INCR 命令

INCRBY 命令

DECR 命令

DECRBY 命令

INCRBYFLOAT 命令

总结

字符串操作命令

APPEND 命令

GETRANGE 命令

SETRANGE 命令

STRLEN 命令


引言

  • redis 中所有的 key 均为字符串,但 value 的类型却存在差异

redis 文档给出的语法格式说明:

  • [ ] 相当于一个独立的单元表示可选项,即 可有可无
  •  |  表示 或者 的意思,多个之间仅能选择一个
  • [ ] 和 [ ] 之间是可以同时存在的

快速清除 redis 中的所有键值对 :

  • 该命令能够把 redis 上所有的键值对都带走
语法:
FLUSHALL
  • 在公司中,尤其是生产环境的数据库,千万不要敲该命令!!

注意:

  • 在操作 linux 的时候 千万不要乱按 ctrl + s
  • ctrl + s 在 xshell 中的作用是 "冻结当前页面"
  • 按 ctrl + q 即可解除冻结 

String 类型基本概念

  • Redis 中的字符串是以二进制数据的方式存储的,且它不会进行任何编码转换
  • 这意味着你存的是什么,取出来就是什么
  • 相比之下 MySQL 默认的字符集是拉丁文,如果你试图插入中文 而没有更改字符集,那么便会失败
  • 所以 Redis 一般来说不会遇到乱码问题,因为 Redis 中没有字符集

  • Redis 中可以存储各种类型的数据
  • 包括 文本数据、整数、普通文本字符串、JSON、XML甚至二进制数据(如图片、视频、音频等)
  • 但 Redis 对于 String 类型的大小限制为 512 M

注意:

  • 由于 Redis 是单线程模型,且其设计目标是使得所有的操作都能快速完成
  • 因此 存储大文件,如音频、视频,可能会影响 Redis 的性能

原因:

  • 处理这些大文件需要更多的时间,这可能会阻塞其他操作,从而降低整体的性能

总结:

  • 虽然 Redis 技术上可以存储 音频 和 视频文件,但由于其单线程的特性和对 String 类型的大小限制通常不建议这样做

SET & GET

SET 命令

不设置 NX 和 XX 参数时:

  • 如果 key 不存在则创建新的键值对
  • 如果 key 存在 则让新 value 覆盖旧 value ,可能改变原 value 的数据类型,且原 key 的 ttl (生存时间)也将失效

语法:

set key value [expiration EX seconds|PX milliseconds] [NX|XX]

时间复杂度:

  • O(1)

实例理解一

  • set key value ex 5
  • 相当于 set key value  +  expire key 5

实例理解二

  • NX :如果 key 存在则不设置 并返回 nil,如果 key 不存在才设置
  • XX :如果 key 不存在则不设置(返回 nil),如果 key 存在才设置(相当于更新 key 的 value)


GET 命令

  • Redis 的 get 命令只能用于获取去存储为 字符串类型的值

语法:

get key

时间复杂度:

  • O(1)

实例理解

  • 此处我们尝试使用 get 命令获取一个列表值

  • Redis 报错!

MSET & MGET

MSET 命令

  • 用于一次设置多个键的值
  • MSET 命令会用新值替换旧值
  • 这是一个原子操作,所有键的值都会同时设置

语法:

mset key value [key value ...]

时间复杂度:

  • O(N)
  • 其中 N 为设置 key value 键值对的个数,一般不会很大,也可认为是 O(1)

实例理解

  • 此处我们一次性设置三个键值对

注意:

  • 当一次性设置 10W 个键值对时,Redis 很有会被阻塞

MGET 命令

  • 用于获取多个键的值

语法:

mget key [key ...]

时间复杂度:

  • O(N)
  • 其中 N 为获取 key  的个数,一般不会很大,也可认为是 O(1)

实例理解

  • 此处我们一次性获取三个 key 所对应的 value 值 


一次操作多组键值对 相较于 一次操作一组键值对

优势:

  • 一次操作多组键值对可以减少网络延迟
  • MSET 命令是原子的,要么所有键值对设置成功,要么所有键值对设置失败,确保了数据的一致性
  • MSET 和 MGET 可以使代码更简洁,更易于理解和维护

SETNX & SETEX & PSETEX

SETNX 命令

  • 等价于 set key value nx
  • 即 key 不存在才能设置,key 存在则不设置 且返回 nil

语法:

setnx key value

实例理解


SETEX 命令

  • 设置 key 的过期时间,时间单位为 秒

语法:

setex key seconds value

实例理解


PSETEX 命令

  • 设置 key 的过期时间,时间单位为 毫秒

语法:

psetex key milliseconds value

实例理解


总结:

  • 上述命令是针对 set 一些常见用法的缩写
  • 之所以这样,是为了让操作更符合人的直觉,即使用者的门槛就越低,要背的东西就越少

注意:

  • 在编程语言中 很多关键词 都是和自然语言相关的
  • 所以后续我们去设置一些库、一些工具、一段代码给别人使用的时候,也要尽量符合直觉
  • 不要设计的 反人类、反直觉

计数命令

INCR 命令

  • 针对 key 对应的 value 进行一个 +1 操作

语法:

incr key
  • key 对应的 value 必须为整数
  • 此处为 64位 ——> 8字节的整数,相当于 Java 中的 long,表示的范围还是比较大的

时间复杂度:

  • O(1)

返回值:

  • 此操作的返回值,为 value +1 后的值

实例理解

注意:

  • incr 操作的 key 如果不存在,就会把这个 key 的 value 当作 0 来使用


INCRBY 命令

  • 针对 key 对应的 value 进行一个 +n 操作

语法:

incrby key increment
  • key 对应的 value 必须为整数

时间复杂度:

  • O(1)

返回值:

  • 此操作的返回值,为 value +n 后的值

实例理解

  • 此处我们针对 key 的 value 加 10

注意:

  • incrby 操作的 key 如果不存在,就会把这个 key 的 value 当作 0 来使用

  • incrby 命令也可针对 value 进行减法操作


DECR 命令

  • 针对 key 对应的 value 进行一个 -1 操作

语法:

decr key
  • key 对应的 value 必须为整数

时间复杂度:

  • O(1)

返回值:

  • 此操作的返回值,为 value -1 后的值

实例理解

注意:

  • decr 操作的 key 如果不存在,就会把这个 key 的 value 当作 0 来使用


DECRBY 命令

  • 针对 key 对应的 value 进行一个 -n 操作

语法:

decrby key decrement
  • key 对应的 value 必须为整数

时间复杂度:

  • O(1)

返回值:

  • 此操作的返回值,为 value -n 后的值

实例理解

  • 此处我们针对 key 的 value 减 10

注意:

  • decrby 命令也可针对 value 进行加法操作


INCRBYFLOAT 命令

  • 针对 key 对应的 value 进行 ± n 操作

语法:

incrbyfloat key increment
  • key 对应的 value 可为 整型 或 浮点型

时间复杂度:

  • O(1)

返回值:

  • 此操作的返回值,为 value ± n 后的值

实例理解

  • 此处我们针对 key 的 value 加 0.5

  • 此处我们针对 key 的 value 减 0.5

  • 只能用 加上负数的形式来实现减法

注意:

  • 此处没有给 浮点型 提供减法版本的命令
  • 因为使用 redis  进行的计数操作时,一般都是针对整数来进行的

总结

  • 由于 redis 处理命令的时候为单线程模型
  • 所以多个客户端同一时刻针对同一个 key 进行 incr 操作时,不会引起 线程安全问题 

字符串操作命令

APPEND 命令

  • 用于给将 给定值 追加到指定 key 的 value 的末尾
  • 如果 key 存在并且是一个字符串,该命令会将 给定值 追加到原有的字符串后面
  • 如果 key 不存在,则效果等同于 set 命令

语法:

append key value

时间复杂度:

  • O(1)

返回值:

  • 追加后的字符串长度,单位为字节

实例理解

  • redis 不认字符,只认字节
  • redis 不会对字符串的字符编码做任何处理
  • 当前咱们 xshell 终端默认的编码方式为 UTF-8
  • 所以当我们在终端中输入汉字后,将会以 UTF-8 进行汉字编码
  • 一个汉字在 UTF-8 字符集中通常为 3 个字节

  •  此处返回结果为 "你好" 这两个汉字的 UTF-8 编码
  • 其中 '\x' 表示十六进制,"\xe4\xbd\xa0\xe5\xa5\xbd" 为转义字符  


点击下方连接可进入 查询字符编码的网址

查看字符编码(UTF-8)


  • 在启动 redis 客户端的时候,加上 --raw 这样的选项
  • 便可使 redis 客户端 能自主翻译二进制数据


GETRANGE 命令

  • 相当于 Java 中的 substring
  • 超过范围的偏移量会根据 Sting 的长度调整成正确的值

语法:

getrange key start end

时间复杂度:

  • O(N),这里的 N 为 start  到 end 之间的长度,一般不会很大,也可认为是 O(1)

返回值:

  • 返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭)

注意点一:

  • 在 Redis 中指定的区间为闭区间
  • 但 Java 中一般谈到区间 却大多为 左闭右开
  • 且在整个编程大圈子中,区间也大多为左闭右开,但确实也有特殊情况,就比如此处的 Redis 

注意点二:

  • 正常下标都是从 0 开始的整数
  • 但 Redis 支持负数下标-1 代表倒数第一个元素,即下标为 len -1 的元素

实例理解

  • 如果字符串中保存的是汉字,此时进行子串切分时很可能切出来的就不是完整的汉字了
  • 如上图所示,强行切出 中间的四个字节
  • 随便这么一切,切出的结果在 UTF-8 码表上便不知道查出的是什么字符了

注意:

  • 在 Java 中不会存在上述情况

原因:

  • Redis 中字符串的基本单位为 字节
  • 但在 Java 中 字符串长度以 字符(char) 为单位,且 char 类型的数据占 2 字节
  • Java 中字符(char)用的是 Unicode 编码,一个字符可以表示包括中文在内的各种符号

实例理解

基本概念

  • 当编码方式为 UTF-8 时,一个汉字通常为 3 个字节
  • 当编码方式为 Unicode 时,一个汉字通常为 2 个字节
重点理解
  • Java 中字符串(String) 用的是 UTF-8 编码
  • Java 标准库进行编码转换时,如从 Unicode 到 UTF-8,通常会抽象掉底层的细节,使得程序员一般感知不到编码方式的变换

补充:

  • 在 MySQL 中 varchar(N) 类型数据中的 N 为字符数,这意味着无论字符是 英文 还是 中文 都只算一个字符

SETRANGE 命令

  • 根据偏移量(offset),从指定的字节开始进行 value 替换

语法:

setrange key offset value

时间复杂度:

  • O(N),这里的 N 为 value 的长度,一般不会很大,也可认为是 O(1)

返回值:

  • 替换之后新字符串的长度

实例理解

  • setrange 针对不存在的 key 也是可以操作的,不过会把 offset 之前的内容填充为 0x00

  • 如上图所示,凭空生产了一个字节,且该字节里面中内容为 0x00
  • 此时的 value 值 aaa 便被追加到 0x00 后面了

注意:

  • 如果当前的 value 为中文字符串,并进行 setrange 命令的时候,是存在问题的

STRLEN 命令

  • 用于获取 key 对应 value 的字符串长度
  • 如果当前 key 对应的 value 不是字符串时,将会报错 

语法:

strlen key

时间复杂度:

  • O(1)

返回值:

  • 获取到字符串的长度,单位是字节,当key 不存在时 返回 0

实例理解

 

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

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

相关文章

NeurIPS已成为了AI人才招聘的最大盛会,连Hinton都“应聘”过

在一周前美国举行的年度最热门的人工智能大会NeurIPS 2023上,有超过1万名世界顶尖AI研究人员聚集在此。 而除了研究员之外,中国科技公司和华尔街公司是其中最突出的参会者,他们都背负着抢夺AI人才的任务。 大模型人才最受欢迎 随着今年Cha…

深度学习中的Dropout

1 Dropout概述 1.1 什么是Dropout 在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合&#xff…

最新ChatGPT商业运营网站程序源码,支持Midjourney绘画,GPT语音对话+DALL-E3文生图+文档对话总结

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

mac传输文件到windows

前言 由于mac系统与windows系统文件格式不同,通过U盘进行文件拷贝时,导致无法拷贝。 几种文件格式说明: NTFS 文件格式:只适用于 windows 系统,不适用于 mac 系统; APFS 文件格式:mac 系统格式…

性能测试之Mysql数据库调优

一、前言 性能调优前提:无监控不调优,对于mysql性能的监控前几天有文章提到过,有兴趣的朋友可以去看一下 二、Mysql性能指标及问题分析和定位 1、我们在监控图表中关注的性能指标大概有这么几个:CPU、内存、连接数、io读写时间…

Certum的EV增强型证书

EV增强型https证书是一种特别的数字证书,只有这一款域名数字证书可以直接在地址栏显示企业名称(支持中文名称)。因此,很多企业为了提升企业的品牌形象,向客户展示企业的专业性和可靠性,往往会选择这种类型的数字证书。今天就随SSL…

【React Native】第一个Android应用

第一个Android应用 环境TIP开发工具环境及版本要求建议官方建议 安装 Android Studio首次安装模板选择安装 Android SDK配置 ANDROID_HOME 环境变量把一些工具目录添加到环境变量 Path[可选参数] 指定版本或项目模板 运行使用 Android 模拟器编译并运行 React Native 应用修改项…

阶段七-GitEE

Git:版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…

猫头虎分享2023年12月17日博客之星候选--领域赛道博主文章数据

猫头虎分享2023年12月17日博客之星候选–领域赛道博主文章数据 博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开…

单位圆内接三角形的角是外接三角

证明 ∠ A P C 2 ∠ A B C ∠APC2∠ABC ∠APC2∠ABC ∴ ∴ ∴ 三角形内角和为180 $∵ \begin{cases} ∠ABP∠BAP∠APB180 \∠ABC∠BAC∠ACB180 \∠PAC∠PCA∠APC180 \end{cases} $ ∴ A P B P P C r ∴APBPPCr ∴APBPPCr ∵ ∵ ∵△PAB和△PAC为等腰三角形 ∴ ∴ ∴等腰三…

IntelliJ IDEA 2023.3 安装教程

引言 IntelliJ IDEA,通常简称为 IDEA,是由 JetBrains 开发的一款强大的集成开发环境,专为提升开发者的生产力而设计。它支持多种编程语言,包括 Java、Kotlin、Scala 和其他 JVM 语言,同时也为前端开发和移动应用开发提…

这款APP,在离线环境下也能查看倾斜模型、点云等数据

《四维轻云-离线版》APP是基于移动端开发的轻量化地理空间数据应用平台,实现了用户对空间数据场景的制作和应用。 目前,已涵盖的数据类型包括倾斜模型(.osgb)、激光点云(.las)、正射影像(dom)、数字高程模型(dem)、矢量数据(shp)、人工模型(…

【开源】基于Vue+SpringBoot的贫困地区人口信息管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…

利用 OpenAI API 进行文本聚类和标记

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号 原文标题:Text Clustering and Labeling Utilizing OpenAI API 原文地址:https://medium.com/kbd…

使用 OpenTelemetry 和 Loki 实现高效的应用日志采集和分析

在之前的文章陆续介绍了 如何在 Kubernetes 中使用 Otel 的自动插桩 以及 Otel 与 服务网格协同实现分布式跟踪,这两篇的文章都将目标聚焦在分布式跟踪中,而作为可观测性三大支柱之一的日志也是我们经常使用的系统观测手段,今天这篇文章就来体…

【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库

书接上文,由于家境贫寒的原因,导致我本地的GPU资源无法满足搭建Langchain-Chatchat本地知识库的需求,具体可以看一下这篇文章,于是我只能另辟蹊径,考虑一下能不能白嫖一下云服务器资源,于是去找网上找&…

docker笔记2-docker 容器

docker 容器的运行 docker run 镜像名:版本标签: 创建 启动容器 docker run 镜像名 ,如果镜像不存在,则会在线下载镜像。 注意事项: 容器内的进程必须处于前台运行状态,不能后台(守护进程运行…

财务数据智能化:用AI工具高效制作财务分析PPT报告

Step1: 文章内容提取 WPS AI 直接打开文件,在AI对话框里输入下面指令: 假设你是财务总监,公司考虑与茅台进行业务合作、投资或收购,请整合下面茅台2021年和2022年的财务报告信息。整理有关茅台财务状况和潜在投资回报的信息&…

【PostGIS】在Java中操作postgis——使用springboot+Maven+mybatis框架

前言: PostgreSQL15对应PostGIS安装教程及空间数据可视化 空间数据库-常用空间函数 完成PostGIS的安装与配置后,让我们来写一个Java操作postgis数据库的demo吧~ 使用工具: NavicatIDEA 一、PostGIS数据库准备 在Navicat中新建一个postgr…

Ubuntu系统如何安装SVN服务端并通过客户端无公网ip实现远程访问?

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…