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.hqwc.cn/news/442438.html

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

相关文章

蓝桥杯---牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后…

【Django自学】Django入门:如何使用django开发一个web项目(非常详细)

测试机器:windows11 x64 python版本:3.11 一、安装Django 安装步骤非常简单,使用pip安装就行 pip install django安装完成之后,python的 Scripts 文件夹下,会多一个 django-admin.exe (管理创建django项目的工具)。…

多图预警!?是时候汇总Python-R的颜色主题包了

今天这篇推文我们系统介绍下颜色主题,虽然之前也有介绍过一些优秀的配色网站,也有搭配好的颜色主题可以直接参考,但有没有直接供Python或者R绘图直接使用的关于颜色设置的第三方包呢?这边推文将较为详细的介绍关于Python的R的颜色主题包&…

k8s从私有库harbor中拉取镜像

一、前言 Docker镜像是构建应用程序的基础。然而,许多组织和开发团队希望保留他们的Docker镜像在私有仓库中,并从中拉取镜像,而不是从公共Docker Hub中下载。这样做的原因有很多,包括: 1. 安全性:私有仓库可…

哪种小型洗衣机好用?小型洗衣机十大排名

也许在我们的以往的印象中,家庭的洗衣机一般的体积都相对的大,而且占用的空间也比较大,在安装放置方面上也是非常的复杂。另外,对于小户型的用户而言,如果使用了普通的大型洗衣机,难免以后会出现很多不方便…

rust学习基于tokio_actor聊天服务器实战(一 )

前言 tokio是Rust中使用最广泛的异步Runtime,它性能高、功能丰富、便于使用,是使用Rust实现高并发不可不学的一个框架 Actor 背后的基本思想是产生一个独立的任务,该任务独立于程序的其他部分执行某些工作。 通常,这些参与者通过使…

EPSON RC 机器人-第一个程序

创建项目 有机械人且用USB线连接好。可以USB。没有真机的选择 C4 Sample 可以运行程序。 否刚会提示【不能连接到控制器,未安装USB驱动器】 代码 按F5打开运行窗口 再点【开始】 点 【是】,查看运行结果

2024新鲜出炉 Java集合常见面试题总结(上)

2024新鲜出炉 Java集合常见面试题总结(上) 文章目录 2024新鲜出炉 Java集合常见面试题总结(上)集合概述Java 集合概览说说 List, Set, Queue, Map 四者的区别?集合框架底层数据结构总结ListSetQueueMap 如何选用集合?为什么要使用集合? ListArrayList 和…

【CANoe使用大全】——Logging窗口

🙋‍♂️【CANoe使用大全】系列💁‍♂️点击跳转 文章目录 1.概述2.Logging窗口打开方式3.创建Logging4.配置4.1. 命名4.2.格式选择4.3. 路径选择与命名4.3.1.Logging文件命名_自定义4.3.2.Logging文件命名_系统内选择 5.Logging触发方式5.1 Logging模块…

c# Get方式调用WebAPI,WebService等接口

/// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类 /// </summary> public class WebServiceHelper {//<webServices>// <protocols>// <add name"HttpGet"/>// <add name"HttpPost"/>// …

软考(高级)在犹豫是否需要报班,不知大家有什么建议?

据我观察&#xff0c;软考是一门可以通过自学掌握的考试&#xff0c;并不争议。然而&#xff0c;尽管如此&#xff0c;我还是不建议大部分同学选择自学&#xff0c;因为相比报班而言&#xff0c;自学的成本反而较高。软考的难度并不低&#xff0c;往年的总体通过率仅为20%&…

【快刊录用】Springer 2区正刊,1个月29天录用!好投毕业快刊!

2024年1月20日-2024年1月26日 进展喜讯 经核实&#xff0c;由我处Unionpub学术推荐的论文中&#xff0c;新增1篇论文录用、7篇上线见刊、6篇数据库检索&#xff1a; 录用通知 FA20479 — — 见刊通知 FB20814 FA20107 FA21119 FA20827 FA20400 FA20923 FB20702 —…