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.mzph.cn/news/658989.shtml

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

相关文章

嵌入式学习第十五天!(内存管理、链表)

1. 内存管理: 1. malloc void *malloc(size_t size); 功能:申请堆区空间 参数:size:申请堆区空间的大小 返回值:返回获得的空间的首地址,失败返回NULL 2. free void free(void *ptr); 功能:释…

信效度检验2(SPSS

目录 1.效度介绍:2.效度检验:小结: 1.效度介绍: 用于研究题项设计是否合适 2.效度检验: 点击 降维->因子 把涉及到因变量的问题放入即可: 勾选: 得到输出结果: KMO值 0.7…

如何使用wireshark解析二进制文件

目录 目录 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP packet b. Ethernet packet 2.用wiershark导入hex文件 3.设置对应的packet类型 a. Raw IP packet b. Ethernet packet 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP pac…

汽车燃油泵数据分析:全球市场的年复合增长率将达到10%左右

燃油泵是汽车配件行业的专业术语。是电喷汽车燃油喷射系统的基本组成之一,位于车辆油箱内部,燃油泵在启动和发动机运转时工作,如果发动机停止而点火开关仍处于ON时,HFM-SFI控制模块关闭燃油泵的电源,以避免意外点火。 …

OpenCV与机器学习:使用opencv实现KNN

使用opencv实现KNN 前言OpenCV实现KNN生成随机数据使用matplotlib绘制数据OpenCV用于KNN训练生成新数据并观察预测 前言 KNN算法,即K-Nearest Neighbor,是一种简单的机器学习算法。它的基本思想是:如果一个样本在特征空间中的K个最相似&…

标注数据集 --labelimg

前言:我们想要训练自己的数据集时,通常需要自己标注数据集。无论是标注成yolo可识别的txt格式还是voc数据集的xml格式。使用labelimg标注都是一个不错的选择。 下面我们就从创建环境,使用labelimg进行标注两个方面来说明。 1.创建labelimg环境…

ADI 配合 USRP 使用的相控阵天线 cn0566

相控阵天线 在这里插入图片描述

Python实战:爬取微博,获取南京地铁每日客流数据

在这篇文章中,我们将使用 Python 进行网络爬虫,爬取微博上的南京地铁每日客流数据。 一、分析网页 在“南京地铁”微博主页搜索“昨日客流”关键词,搜索到每天发布的昨日客流数据。 “南京地铁”微博主页地址https://weibo.com/u/26382762…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

京东采销急眼,隔空喊话“针对”拼多多,焦虑之下为哪般?

农历新年将至,无论是线下各大商超还是线上电商平台,皆为年终大促而“忙的不亦乐乎”,尤其是近期发生的京东采销人员在直播间向拼多多喊话,“恳请拼多多停止屏蔽,恳请拼多多直接比价”,更是将年底这场朴实无…

flink cdc,standalone模式下,任务运行一段时间taskmanager挂掉

在使用flink cdc,配置任务运行,过了几天后,任务无故取消,超时,导致taskmanager挂掉,相关异常如下: 异常1: did not react to cancelling signal interrupting; it is stuck for 30 s…

ElasticSearch基础用法

什么是ElasticSearch? Elasticsearch是一个开源的、分布式的、实时的搜索和分析引擎。它允许用户近乎实时地存储、检索大量数据,并能够高效地对其进行全文搜索、聚合和分析。 部署ES和Kibana 通常采用docker-compose部署ES(ElasticSearch)服…

寒假思维训练day17 C. Equal Frequencies

不知不觉已经过了差不多一个月了,坚持一件事情还是有点收获的,今天更新一道1600的构造。 寒假训练计划day17 摘要: Part1 题意 Part2 题解 (有数学推导,latex形式) Part3 代码 (C版本,有详细注释) Part4 我对构造题…

基于YOLOv7算法的高精度实时安全帽和背心目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要:基于YOLOv7算法的高精度实时安全帽和背心目标检测系统可用于日常生活中检测与定位安全帽和安全背心,此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别,同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

【电子科技大学】计算机高级图形学总复习

第一章:绪论 图形学和图像学 走样的原因和反走样 走样指的是:用离散量表示连续量引起的失真 反走样:为了提高图形的显示质量,需要减少或消除因走样带来的阶梯形或闪烁的效果,用于减少或消除这种效果的方法称为反走样…

【51单片机Keil+Proteus8.9】门锁控制电路

门锁控制电路 二、设计思路 电路设计 1.电源部分:使用BATTERY为整个电路提供电源,可以在电路中加入一个电 源开关,以便控制电源的开启和关闭。 2.处理器部分:使用AT89C51芯片作为主处理器,通过编写程序实现门锁的 …

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器(iterator)是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中,通常使用函数表示迭代器:每一次调用函数时,函数会返回集合中的“下一个”元素。 一个闭包就是一个…

SD-WAN有哪些组网方式?

随着企业网络需求的不断增长和变化,SD-WAN作为一种先进的网络架构技术,提供了多种灵活的组网方式,以适应不同企业的需求。本文将介绍SD-WAN常见的几种组网方式,帮助企业更好地理解如何利用SD-WAN构建高效的网络。 1、点对点&#…

离线使用Element UI和Vue

需要依赖如下: 1.vue.js; 2.index.js(Element UI) 3.index.css(Element UI) 4.element-icons.ttf(Element UI字体) 5.element-icons.woff(Element UI图标) 下载链接如下: 链接:https://pan.baidu.com/s/1nGOi0Vm_xExRGmVp6oVLoA 提取…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程:https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…