6.Redis之String命令

news2024/12/29 9:23:02

1.String类型基本介绍

redis 所有的 key 都是字符串,

value 的类型是存在差异的~~

一般来说,redis 遇到乱码问题的概率更小~~

Redis 中的字符串,直接就是按照二进制数据的方式存储的.

(不会做任何的编码转换【讲 mysql 的时候,知道 mysql 默认的字符集, 是拉丁文,插入中文,就会失败~~】,存的是啥,取出来就还是啥)

【不仅仅可以存储文本数据~~整数~~普通的文本字符串~~JSON~~xml~~二进制数据(图片,视频,音频....)(音频视频 体积可能会比较大~~Redis 对于 string 类型,限制了大小最大是 512M
Redis 单线程模型,希望进行的操作都能比较快速)】

2.set&get

2.1 set

  • redis 文档给出的语法格式说明:
  • []相当于一个独立的单元.
  • 表示可选项 (可有可无的)
  • 其中|表示"或者"的意思,多个只能出现一个,
  • []和[]之间,是可以同时存在的.
  • 如果 key 不存在,创建新的键值对,
  • 如果 key 存在, 则是让新的 value 覆盖旧的 value.
  • 可能会改变原来的数据类型,原来这个 key 的 ttl(生存时间) 也会失效
  • flash all清除所有的数据库-对应MySQL的drop database

2.2 get

get key

对于 GET 来说, 只是支持,字符串类型的 value.
如果 value 是其他类型, 使用 GET 获取就会出错!!

3.mset&mget

一次操作多组键值对。

可以提高效率 但也不要一次添加太多 会导致阻塞

4.SETNX&SETEX&PSETEX

  • SETNX不存在才能设置.存在则设置失败~
  • 返回值:1 表⽰设置成功。0 表⽰没有设置。
  • SETEX设置 key 的过期时间,单位是秒
  • PSETEX设置 key 的过期时间,单位是毫秒
     

5.incr&incrby&decr&decrby

incr

针对 value + 1

INCR将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

  • 命令有效版本:1.0.0 之后
  • 时间复杂度:O(1)
  • 返回值:integer 类型的加完后的数值。

incrby

针对 value + n

decr

针对 value -1

key 对应的 value 必须是整数,在 64位的范围内,如果这个 key 对应的value不存在则当做 0 来处理
decr 的运算结果,也是计算之后的值

decrby

针对 value -n    

incrbyfloat

  • 把 key 对应的 value 进行 +-运算,运算的操作数可以是浮点数。
  • 只能用加上负数的形式来实现减法~~
  • 虽然此处没有提供减法版本的命令,但是使用 redis 进行的计数操作,一般都是针对整数来进行的
  • 上述操作的时间复杂度,都是 O(1)
  • 由于 redis 处理命令的时候,是单线程模型,多个客户端同时针对同一个 key 进行 incr 操作,不会引起"线程安全”问题 

6.APPEND

  • 字符串,也支持一些常用的操作.
  • 拼接, 获取/修改 字符串的部分内容,获取字符串长度

append

 

  • append 返回值, 长度的单位是 字节!!
  • redis 的字符串,不会对字符编码做任何处理,(redis 不认识字符,只认识字节)
  • 当前咱们的 xshell 终端,默认的字符编码是 utf8
  • 在终端中输入汉字之后,也就是按照 utf8 编码的~~
  • 1个汉字在 utf8 字符集中, 通常是 3 个字节的~
  • 在启动 redis 客户端的时候,加上一个 --raw 这样的选项就可以使 redis 客户端能够自动的把二进制数据尝试翻译
  • 操作 linux 的时候, 千万注意,不要乱按 ctrl +s
    ctrl +s在 xshell 中的作用是"冻结当前画面"
    ctrl + q 解除冻结~~

7.GETRANGE

返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表 倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的⻓度调整成正确的值。
  • 由 start 和 end 确定(左闭右闭)
  • redis 中指定的区间, 是闭区间!!!
  • C++ 和 Java 中,谈到一个区间,大多都是 前闭后开(左闭右开)编程这个大圈子中,区间大多是前闭后开~~ 但是确实有特殊情况~~
  • 正常下标都是 从 0 开始的整数,
  • redis 的下标是可以支持负数的~~
  • -1 倒数第一个元素.(Python 也是允许下标为 负数 的,此处的 规则 和 python 的设定是一致的)
  • 下标为 len-1 的元素
  • 如果字符串中保存的是汉字,此时进行子串切分,很可能切出来的就不是完整的汉字了~~
  • 上述的代码,是强行切出了中间的四个字节.
  • 随便这么一切,切出的结果在 utf8 码表上不知道能査出啥了~~
  • 上述问题,在 C++ 中同样存在
    Java 中就没事~
    Java 中字符串的基本单位,是字符(ava 的字符, 占2 个字节的字符),帮我们把汉字的编码转换C++中字符串的基本单位是字节~~
  • Java 中相当于 String 帮我们把汉字的编码转换C++中字符串的基本单位是字节~~都处理好了~~
  • C++这里头对于汉字的处理,是没那么完善的就需要程序猿手动处理了~~

8.SETRANGE  

覆盖字符串的⼀部分,从指定的偏移开始。
语法:
SETRANGE key offset value
  • 时间复杂度:O(N), N 为 value 的⻓度. 由于⼀般给的 value ⽐较短, 通常视为 O(1).
  • 返回值:替换后的 string 的⻓度。
  • 如果当前咱们 value 是一个中文字符串.进行 setrange 的时候, 是可能会搞出问题的!
  • \x转义字符,16进制
  • 凭空生成了一个字节,这个字节里的内容就是 0x00
  • aaa 就被追加到 0x00 的后面了
    setrange 针对 不存在的 key 也是可以操作的.不过会把 offset 之前的内容填充成0x00

9.STRLEN

  • 获取 key 对应的 string 的⻓度。单位是字节。
  • 当 key 存放的类似不是 string 时,报错。
  • C++中,字符串的长度本身就是用字节为单位,
    Java 中,字符串的长度则是以字符为单位的.
  • Java 中的一个 char ==2 字节~~
    Java 中的 char 基于 unicode 这样的编码方式
    就能够表示中文等符号~~
  • MySQL 的时候.
    varchar(N)
    此处 N 的单位就是字符. mysq! 中的字符,也是完整的汉字
    这样的一个字符,也可能是多个字节~~ 
  • 一个汉字通常是 3 个字节呀~~(编码方式是 utf8)Java 里头咋一个 2 字节的 char 就能表示汉字呢??【1个汉字几个字节是针对编码方式而言的】
  • Java 中的 char 是用的 unicode.一个汉字使用两个字节的Java 中的 String, 则是用的 utf8.一个汉字就是3 个字节了Java 的标准库内部, 在进行上述的操作过程中,程序猿一般是感知不到编码方式的变换的~~

 10.小节

命令执⾏效果时间复杂度
set key value [key value...]设置 key 的值是 valueO(k), k 是键个数
get key获取 key 的值O(1)
del key [key ...]删除指定的 keyO(k), k 是键个数
mset key value [key value
...]
批量设置指定的 key 和 valueO(k), k 是键个数
mget key [key ...]批量获取 key 的值O(k), k 是键个数
incr key指定的 key 的值 +1

O(1)

decr key指定的 key 的值 -1O(1)
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +nO(1)
append key value指定的 key 的值追加 valueO(1)
strlen key获取指定 key 的值的⻓度O(1)
setrange key offset value覆盖指定 key 的从 offset 开始的部分值
O(n),n是字符 串⻓度, 通常视 为O(1)
getrange key start end获取指定 key 的从 start 到 end 的部分值
O(n),n 是字符串⻓度, 通常视为 O(1)

 

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

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

相关文章

ChatGLM2-6B 模型基于 [P-Tuning v2]的微调

ChatGLM2-6B-PT 一、介绍 1、本文实现对于 ChatGLM2-6B 模型基于 [P-Tuning v2](https://github.com/THUDM/P-tuning-v2) 的微调 2、运行至少需要 7GB 显存 3、以 [ADGEN](https://aclanthology.org/D19-1321.pdf) (广告生成) 数据集为例介绍代码的使用方法。 模型部署参考…

OC笔记之foundation框架

OC学习笔记(三) 文章目录 OC学习笔记(三)常用Foundation框架结构体NSRangeNSRange结构体的定义定义 NSRange 的方法打印Range的相关信息NSRange的实际运用查找子字符串返回NSRange结构体 NSPointNSRect NSStringNSString的创建NSS…

Python文件操作(Excel、PDF、XML、Word)

大家好,在现代数据驱动的世界中,对于数据的处理和管理是至关重要的。Python作为一种强大而灵活的编程语言,提供了丰富的工具和库来处理各种文件格式。本文将探讨Python中的文件操作,重点介绍如何使用Python处理Excel、PDF、XML和W…

【python】python tkinter 计算器GUI版本(模仿windows计算器 源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

每日一题《leetcode--2816.翻倍以链表形式表示的数字》

https://leetcode.cn/problems/double-a-number-represented-as-a-linked-list/ 这里我们直接模拟翻倍后链表的数字,首先我们得先考虑链表的头结点的值是否大于4(*2后是否需要进位)。 处理完头结点后,就需要考虑其余结点。因为求的是链表中每个结点翻倍后…

这个开源的多模态模型无敌。。。

InternVL 由 OpenGVLab 开发,是一个开源的多模态对话模型,其性能接近商业化的 GPT-4V 模型。 GPT-4V 是 OpenAI 去年推出的多模态模型,使用它你可以分析所需的任何类型的图像并获取有关该图像的信息。 1. InternVL 开源模型 而今天的主角研究…

基于python实现的深度学习web多格式纠错系统

基于python实现的深度学习web多格式纠错系统 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat、Maven 系统功能实现 用户登录 登录功能是本系统一个非常重要的功能,这极大的保护了系统的安全。登录…

跨平台之用VisualStudio开发APK嵌入OpenCV(一)

序 本篇是杂谈以及准备工作(此处应无掌声) 暂时不管iOS(因为开发hello world都要年费) 软件: Visual Studio 2019(含Android SDK和NDK编译器等) OpenCV 这是一个女仆级的系列文章&#xf…

php之sql代码审计

1 SQL注入代码审计流程 1.1 反向查找流程 通过可控变量(输入点)回溯危险函数 查找危险函数确定可控变量 传递的过程中触发漏洞 1.2 反向查找流程特点 暴力:全局搜索危险函数 简单:无需过多理解目标网站功能与架构 快速:适用于自动化代码审…

vue实现可拖拽移动悬浮球

封装悬浮球组件&#xff0c;文件名s-icons.vue <template><div ref"icons" class"icons-container" :style"{ left: left px, top: top px }"><slot></slot></div> </template> <script> export …

阿里云ubuntu 24 deb安装mysql5.7问题解决

阿里云最近有了ubuntu24&#xff0c;手欠直接选了24系统来试水&#xff0c;安装mysql这里遇到麻烦了 其它问题参考ubuntu22的即可&#xff0c;以下是3个新问题&#xff1a; 阿里云ubuntu 24 deb安装mysql5.7遇到的3个问题&#xff1a; 1&#xff09;libssl1.1 (&#xff1e; …

深度神经网络——什么是决策树?

决策树 决策树是一种强大的机器学习算法&#xff0c;它通过模拟人类决策过程来解决分类和回归问题。这种算法的核心在于它如何将数据集细分&#xff0c;直至每个子集足够“纯净”&#xff0c;即包含的实例都属于同一类别或具有相似的数值范围。 开始于根节点&#xff1a;决策…

分布式事务——9种解决方案的原理与分类

目录 一、概要1. 分布式事务的概念2. 分布式事务解决方案分类 二、常见的分布式事务解决方案1. 基础的 2PC&#xff08;二阶段提交&#xff09;1.1 核心思想1.2 简介1.3 主要特点1.3.1 优点1.3.2 缺点 2. 基础的 3PC&#xff08;三阶段提交&#xff09;2.1 核心思想2.2 简介2.3…

【MySQL索引】(重点)

文章目录 一、见见索引二、认识磁盘三、索引的学习1.建立共识2.重谈page3.单page和多page同样存在效率低下的问题单page的缺陷多page的缺陷 页目录单page多page B树为什么行&#xff01;详谈细节 其他数据结构为什么不行?聚簇索引和非聚簇索引 回表查询 四、索引的操作1.创建主…

简单好用的文本识别方法--付费的好用,免费的更有性价比

文章目录 先说付费的进入真题&#xff0c;免费的来喏&#xff01;PixPin微信 先说付费的 直达网址!!! 进入真题&#xff0c;免费的来喏&#xff01; PixPin 商店里就有 使用示例&#xff1a; 可以看到&#xff1a;贴在桌面上的图片可以复制图片中的文字&#xff0c;真的很…

详细分析ping的基本知识以及常见网络故障的诊断(图文解析)

目录 前言1. 基本知识2. 常见故障分析2.1 请求超时2.2 域名无法解析 前言 由于全栈开发&#xff0c;在运维过程中难免会出现无法ping通等故障 针对多种情况进行详细分析 1. 基本知识 为了更好的加深ping的基本命令以及拓展更多知识点&#xff0c;详细科普其基本知识 ping&…

算法与数据结构汇总

刷题建议步骤 求职硬通货&#xff1a;一&#xff0c;好的学历&#xff0c;这个要下血本。本科&#xff0c;可以考研&#xff0c;读研。专科&#xff0c;可以专升本&#xff0c;再考研&#xff0c;读研&#xff0c;二&#xff0c;软考&#xff0c;一年考两次&#xff0c;有些科…

【Flutter】AppBar、TabBar和TabBarView

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月26日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

到底该用英文括号还是中文括号?

这篇博客写的还挺详细的&#xff0c;不错。