Redis常见数据类型[上]

目录

前言:

基本全局命令

KEYS  

EXISTS 

DEL 

EXPIRE

 TTL

 TYPE

 数据结构和内部编码

 内部编码:

单线程架构 

引出单线程模型:

 为什么单线程还这么快?

String字符串

字符串数据类型:

常见命令:

 SET

 GET

 MGET

MSET 

SETNX

计数命令:

INCR

 INCRBY

INCRBYFLOAT

 其他命令:

APPEND

GETRANGE 

SETRANGE

STRLEN 

内部编码:


前言:

 Redis提供了5种数据结构,理解每种数据结构的特点对于Redis开发运维⾮常重要

  • 预备知识:几个全局命令,数据结构,内部编码,单线程模式机制分析
  • 5种数据结构的特点、命令使用、应用场景示例
  • 键遍历、数据库管理

基本全局命令

KEYS  

  • h?llo 匹配 hello , hallo和hxllo等
  • h*llo 匹配 hllo,heeeello
  • h[ae]llo 只匹配hallo,hello
  • h[^e]llo 匹配hallo,hbllo...不匹配hello
  • h[a-b]llo 匹配hallo到hbllo

语法:

KEYS pattern

返回值:

匹配pattern的所有key

从上面可以看出

? 只能匹配单个字符,且不能为空

*   可以匹配0到多个字符

[xyz] 可以单独匹配x与y与z,能够匹配[]中的单个字符

^ 就代表非的意思

[a-b] 中间有 ' - '就是a到b的意思即字符在a-b之间的都能匹配   

EXISTS 

判断某个key是否存在

语法:

EXISTS key [key ...]

返回值:key存在的个数 

示例:

DEL 

 删除指定的key

语法:

DEL key [key ...]

返回值:删除掉的key的个数

EXPIRE

为指定的key添加秒级的过期时间(Time To Live TTL)

语法:

EXPIRE key seconds

返回值:1表示设置成功,0表示设置失败

 TTL

获取指定key的过期时间,秒级

语法:

TTL key

返回值:

剩余过期时间,-1表示没有关联过期时间,-2表示key不存在

 TYPE

返回key对应的数据类型

语法:

TYPE key

返回值:none、string、list、set、zset、hash、stream

示例:

 


 数据结构和内部编码

type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构

 内部编码:

可以看到每种数据结构都有⾄少两种以上的内部编码实现,例如list数据结构包含了linkedlistziplist两种内部编码。同时有些内部编码,例如ziplist,可以作为多种数据结构的内部实现,可以通
过object encoding命令查询内部编码

这样设计有两个好处:

  1. 可以改进内部编码的同时,对外的数据结构和命令使用毫无影响,对用户来说基本无感知
  2. 多种编码可以实现在不同场景发挥各自的优势,例如ziplist节省内存,但是在列表元素比较多的情况下性能会下降,这时候Redis就会根据配置选项将列表类型的内部转化成linkedlist,整个过程用户感受不到 

单线程架构 

Redis使⽤了单线程架构来实现⾼性能的内存数据库服务
 

引出单线程模型:

现在开启三个redis-cli客户端同时在一个redis-server下同时执行命令

客户端1:set hello world

客户端2:incr counter

客户端3:incr counter

虽然这三个命令时同时发送的,但是从微观上看,这些命令还是线性的方式执行的,只是原则上的执行顺序不定,但是一定不会有两条命令同时执行,这就可以想象redis内部只有一个服务窗口,多个客户端按照 他们达到的先后顺序排队在串口前,依次接受Redis的服务,所以客户端2和客户端3同时对counter自增,并不会产生并发问题。 

 为什么单线程还这么快?

通常来讲,单线程处理能⼒要⽐多线程差,那为什么Redis使用单线程模型会达到万级的处理能力呢?

可以归结为一下三点

1.纯内存访问。内存响应时间大约为100纳秒

2.非阻塞IO。Redis使用epoll作为I/O多路复用技术的实现,不在网络I/O上浪费过多时间

3.单线程避免了线程切换和线程竞争产生的小号,简化了模型。

虽然单线程给Redis带来很多好处,但还是有⼀个致命的问题:对于单个命令的执⾏时间都是有
要求的。如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成⼾
端的阻塞,对于Redis这种⾼性能的服务来说是⾮常严重的,所以Redis是⾯向快速执⾏场景的数据库。
 


String字符串

⾸先Redis中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他4种数据结构的学习奠定基础

TIPS:由于Redis内部存储字符串完全是按照⼆进制流的形式保存的,所以Redis是不处理字符集编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码
 

字符串数据类型:

常见命令:

 SET

将string类型的value设置到key中。如果key之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此key的TTL也全部失效。


语法:

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

选项:

  • EX seconds : 使用秒级作为单位设置key的过期时间
  • PX milliseconds : 使用毫秒作为单位设置key的过期时间
  • NX : 只在key不存在时才进行设置,如果之前key已经存在就不设置了
  • XX : 只在key存在的时候再进行设置,如果之前key不存在,就不设置 

返回值:

  • 成功返回OK
  • 如果由于SET指定NX或者XX不满足条件,SET不会执行并返回nil 

 GET

获取key对应的value。如果不存在就返回nil,如果key的类型不是string就会报错

语法:

GET key

返回值:key对应的value,或者nil当key不存在 

 MGET

⼀次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil。

语法:

MGET key [key ...]

返回值:对应value的列表 

示例:

MSET 

 ⼀次性设置多个key的值

 语法:

MSET key value [key value ...]

返回值:永远是OK 

 示例:

SETNX

 设置key-value但只允许在key之前不存在的情况下

语法:

SETNX key value

返回值:1表示设置成功,0表示设置失败

示例:

 SETXX也是同理~~

计数命令:

INCR

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

语法:

INCR key

返回值:integer类型的加完后的值

示例:

DECR同理,但DECR是减一 

 INCRBY

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

语法: 

INCRBY key decrement

返回值:integer类型加完后的数值

示例:

DECRBY同理,不过是减去对应的值 

INCRBYFLOAT

将key对应的string表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果
key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是⼀个浮点数,则报
错。允许采⽤科学计数法表⽰浮点数。


语法:

INCRBYFLOAT key increment

返回值:加/减完之后的值 

 其他命令:

APPEND

如果key已经存在并且是⼀个string,命令会将value追加到原有string的后边。如果key不存在,
则效果等同于SET命令。

语法:

APPEND key value

GETRANGE 

返回key对应的string的⼦串,由start和end确定(左闭右闭)(start,end)。可以使⽤负数表⽰倒数。-1代表
倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据string的⻓度调整成正确的值

语法:

GETRANGE key start end

返回值:string类型的字符串

 示例:

SETRANGE

覆盖字符串的一部分,从指定的偏移开始

语法:

SETRANGE key offset value

返回值:替换后的string长度

示例:

STRLEN 

获取key对应的string的⻓度。当key存放的类似不是string时,报错

语法:

STRLEN key

返回值:

string的长度,或当key不存在的时候,返回0

示例:

 

内部编码:

字符串的内部编码有三种:

  • int:8个字节长整型
  • embstr:小于等于39个字节的字符串
  • raw:大于39个字节的字符串 

 Redis会根据当前值的类型和⻓度动态决定使⽤哪种内部编码实现。

示例:

 


 

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

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

相关文章

计算机网络-编制与调制(基带信号 基带传输 宽度信号 宽度传输 编码 调制 )

文章目录 基带信号与宽带信号编码与调制数字数据编码为数字信号数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号小结 基带信号与宽带信号 信道上传输的信号除了可以分为数字信号和模拟信号,也可以分为基带信号和宽带信号,只是分类…

文心一言 VS 讯飞星火 VS chatgpt (188)-- 算法导论14.1 5题

五、用go语言,给定 n 个元素的顺序统计树中的一个元素 x 和一个自然数 i ,如何在O(lgn)的时间内确定工在该树线性序中的第 i 个后继? 文心一言,代码正常运行: 在顺序统计树(也称为平衡二叉搜索树&#xf…

2. HarmonyOS 应用开发 DevEco Studio 准备-2

2. HarmonyOS 应用开发 DevEco Studio 准备-2 首选项设置 中文设置 主题 字体 插件安装和使用 保存时操作 编辑器 工程树管理 代码树管理 标记 字符串可视化编辑 参考文档 常用快捷键 编辑 查找或替换 编译与运行 调试 其他 预览 页面预览 自定义组件预览 预览…

[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

linux中配置文件目录为什么用etc来命名

在早期的 Unix 系统中,/etc 目录的名称确实来源于单词 “etcetera” 的缩写,最初意味着 “其他”,用来存放杂项或者不属于其他特定目录的文件。然而,随着时间的推移,/etc 目录的用途逐渐演变并专门化。 在现代的 Linux…

数据监控-Prometheus/Grafana

一、数据监控Prometheus 1、什么是Prometheus Prometheus是由SoundCloud开源监控告警解决方案,从2012年开始编写代码,到2015年github上开源以来,吸引不少用户以及公司的使用。Prometheus作为新一代的开源解决方案,很多理念与Google SRE的运维之道不谋而合。 2、Promet…

Chrome单独配置代理的方法

Windows Windows上单独对Chrome设置代理,需要在启动时传递参数,具体步骤如下。 在Chrome浏览器的快捷方式上右击,进入属性。在 快捷方式 标签下找到 目标 项目,在最后添加 –proxy-server“socks5://xxx.xxx.xx.xx:xxxx” 如果要…

微信小程序之页面导航、生命周期和WXS脚本

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

架构篇21:高性能负载均衡-算法

文章目录 轮询加权轮询负载最低优先性能最优类Hash 类源地址 HashID Hash小结负载均衡算法数量较多,而且可以根据一些业务特性进行定制开发,抛开细节上的差异,根据算法期望达到的目的,大体上可以分为下面几类。 任务平分类:负载均衡系统将收到的任务平均分配给服务器进行处…

新建一个基于标准库的工程(STM32)

目录 1.新建存放工程的文件夹 2.打开KEIL5软件 3.新建一个本次工程的文件夹 4.添加工程的必要文件 4.1打开STM32的启动文件 ​编辑 4.2: 4.3添加内核寄存器文件 ​编辑 5.回到keil5软件,将刚才复制的那些文件添加到工程中 5.1添加一个启动文件&am…

使用Spring Boot和Tess4J实现本地与远程图片的文字识别

概要: 在本文中,我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR(光学字符识别),以识别出本地和远程图片中的文字。我们将从添加依赖说起,然后创建服务类以实现OCR,最后展示如何处理…

【笔试常见编程题01】删除公共字符串、组队竞赛、倒置字符串、排序子序列

1. 删除公共字符串 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” 输入描述 每个测试输入包含2个字符串 输出描述 输出删除后的…

OpenCV 0 - VS2019配置OpenCV

1 配置好环境变量 根据自己的opencv的安装目录配置 2 新建一个空项目 3 打开 视图->工具栏->属性管理器 4 添加新项目属性表 右键项目名(我这是opencvdemo)添加新项目属性表,如果有配置好了的属性表选添加现有属性表 5 双击选中Debug|x64的刚添加的属性表 6 (重点)添…

Vue3 Teleport 将组件传送到外层DOM位置

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

nginx反向代理负载均衡

一,kali作为负载服务器 打开kali nginx服务,访问页面如下 使用docker拉取nginx,并做出端口映射 ┌──(root?kali)-[/etc/nginx] └─# docker pull nginx ┌──(root㉿kali)-[/etc/nginx] └─# docker run -p 11111:80 --name Jdr -d ng…

Type-C平板接口协议芯片介绍,实现单C口充放电功能

在现代平板电脑中,Type-C接口已经成为了一个非常常见的接口类型。相比于传统的USB接口,Type-C接口具有更小的体积、更快的传输速度和更方便的插拔体验。但是,在使用Type-C接口的平板电脑上,如何实现单C口充电、放电和USB2.0数据传…

首发:2024全球DAO组织发展研究

作者,张群(专注DAO及区块链应用研究,赛联区块链教育首席讲师,工信部赛迪特邀资深专家,CSDN认证业界专家,微软认证专家,多家企业区块链产品顾问) DAO(去中心化自治组织&am…

HCS 华为云Stack产品组件

HCS 华为云Stack产品组件 Cloud Provisioning Service(CPS) 负责laas的云平台层的部署和升级是laas层中真正面向硬件设备,并将其池化软件化的部件。 Service OM 资源池(计算/存储/网络)以及基础云服务(ECS/EVS/PC)的管理工具。 ManageOne ManageOne包括服务中心…

【MySQL】学习如何通过DML更新数据库的数据

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-QIqURn9fNFMjLD9l {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【MIdjourney】五个特殊物体关键词

1.碳酸(Carbonate) 这一词语的本意是指包含碳(C)、氧(O)和氢(H)元素的化合物。而在MIdjourney中添加该词汇会使得生成的图片具有水滴效果且富有动态感。 2.灯丝(Filament) Filament效果可能包括更逼真的…