redis常见数据类型

目录

1.基本全局命令

2.数据结构和内部编码

3.单线程架构


1.基本全局命令

Redis有5种数据结构,但它们都是键值对种的值,对于键来说有一些通用的命令。

KEYS
返回所有满足样式(pattern) 的key。支持如下统配样式。
h?llo 匹配 hello,  hallo和hxllo
h*llo匹配hllo和heeeello
h[ae]llo 匹配hello和hallo但不匹配hillo
h[^e]llo匹配hallo, hb1lo ....但不匹配heLlo
h[a-b]llo 匹配hallo和hbllo
语法:

KEYS pattern 

命令有效版本:1.0.0之后
时间复杂度:O(N)
返回值:匹配pattern的所有key。

实例:

redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "firstname"
2) "lastname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"

EXISTS
判断某个key是否存在。
语法:

EXISTS key [key ...]

命令有效版本: 1.0.0 之后.
时间复杂度: 0(1)
返回值: key 存在的个数。
示例:

redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2

DEL
删除指定的key。
语法:

DEL key [key ...] 

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
返回值:删除掉的key的个数。
示例:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> DEL key1 key2 key3
(integer) 2

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

EXPIRE key seconds 

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
返回值:1表示设置成功。0表示设置失败。
示例:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10

TTL
获取指定key的过期时间,秒级。
语法:

TTL key

命令有效版本: 1.0.0 之后
时间复杂度: 0(1)
返回值:剩余过期时间。-1 表示没有关联过期时间,-2 表示key不存在。
示例:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10

EXPIRE和TTL命令都有对应的支持毫秒为单位的版本: PEXPIRE和 PTTL

键的过期机制:

TYPE
返回key对应的数据类型。
语法:

TYPE key 

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
返回值:none , string,list, set, zset, hash and stream 。
示例:

redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

2.数据结构和内部编码

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

Redis的5种数据类型

实际上Redis针对每种数据结构都有自己的底层内部编码实现,而且是多种实现,这样Redis会
在合适的场景选择合适的内部编码,如表2-1所示。

表2-1Redis数据结构和内部编码

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

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist"

可以看到hello对应值的内部编码是embstr,键mylist对应值的内部编码是quicklist。
Redis这样设计有两个好处:
1) 可以改进内部编码,而对外的数据结构和命令没有任何影响,这样一 旦开发出更优秀的内部编码,无需改动外部数据结构和命令,例如Redis 3.2提供了quicklist,结合了ziplist 和linkedlist两者的优势,为列表类型提供了-种更为优秀的内部编码实现,而对用户来说基本无感知。
2)多种内部编码实现可以在不同场景下发挥各自的优势,例如ziplist比较节省内存,但是在列表元素
比较多的情况下,性能会下降,这时候Redis会根据配置选项将列表类型的内部实现转换为
linkedlist,整个过程用户同样无感知。

3.单线程架构

Redis使用了单线程架构来实现高性能的内存数据库服务,本节首先通过多个客户端命令调用的例
子说明Redis单线程命令处理机制,接着分析Redis单线程模型为什么性能如此之高,最终给出为什
么理解单线程模型是使用和运维Redis的关键。

1.引出单线程模型
现在开启了三个redis-cli客户端同时执行命令。
客户端1设置一个字符串键值对:

127.0.0.1:6379> set hello world 

客户端2对counter做自增操作:

127.0.0.1:6379> incr counter 


客户端3对counter做自增操作:

127.0.0.1:6379> incr counter 

我们已经知道从客户端发送的命令经历了:发送命令、执行命令、返回结果三个阶段,其中我们重点关注第2步。我们所谓的Redis是采用单线程模型执行命令的是指:虽然三个客户端看起来是同时要求Redis去执行命令的,但微观角度,这些命令还是采用线性方式去执行的,只是原则上命令的执行顺序是不确定的,但- -定不会有两条命令被同步执行,如图2-3、2-4、 2-5 所示,可以想象Redis内部只有一个服务窗口,多个客户端按照它们达到的先后顺序被排队在窗口前,依次接受Redis的服务,所以两条incr命令无论执行顺序,结果一定是2,不会发生并发问题,这个就是Redis的单线程执行模型。

宏观上同时要求服务的客户端:

微观上客户端发送命令的时间有先后次序的:

Redis的单线程模型

2.为什么单线程还能这么快
通常来讲,单线程处理能力要比多线程差,例如有10 000公斤货物,每辆车的运载能力是每次
200公斤,那么要50次才能完成;但是如果有50辆车,只要安排合理,只需要依次就可以完成任
务。那么为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?可以将其归结为三点:
a.纯内存访问。Redis 将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达
到每秒万级别访问的重要基础。
b.非阻塞I0。Redis 使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型,
将epoll中的连接、读写、关闭都转换为事件,不在网络I/O.上浪费过多的时间,如图2-6所示。
c.单线程避免了线程切换和竞态产生的消耗。单线程可以简化数据结构和算法的实现,让程序模
型更简单;其次多线程避免了在线程竞争同一份共享数据时带来的切换和等待消耗。

redis使用IO多路复用模型:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机场信息集成系统系列介绍(6):机场协同决策支持系统ACDM

目录 一、背景介绍 1、机场协同决策支持系统是什么? 2、发展历程 3、机场协同决策参与方 4、相关定义 二、机场协同决策ACDM的建设目标 (一)机场协同决策支持系统的宏观目标 1、实现运行数据共享和前序航班信息透明化 2、实现地面资源…

Linux常用基本命令(三)

一、显示命令 1. cat 通式:cat 选项 文件名 只能看普通的文本文件 缺点:如果内容过多会显示不全 选项效果-n显示行号包括空行-b跳过空白行编号-s讲所有的连续的多个空行替换为一个空行(压缩成一个空行)-A显示隐藏字符 三个标准文件…

十四、W5100S/W5500+RP2040之MicroPython开发<MQTTThingSpeak示例>

文章目录 1. 前言2. 平台操作流程3. WIZnet以太网芯片4. 示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发…

使用PE信息查看工具和Dependency Walker工具排查因为库版本不对导致程序启动报错问题

目录 1、问题说明 2、问题分析思路 3、问题分析过程 3.1、使用Dependency Walker打开软件主程序,查看库与库的依赖关系,查看出问题的库 3.2、使用PE工具查看dll库的时间戳 3.3、解决办法 4、最后 VC常用功能开发汇总(专栏文章列表&…

【数据结构】线性表

一.线性表 1.定义: n个同类型数据元素的有限序列,记为 L为表名,i为数据元素在线性表中的位序,n为线性表的表长,n0时称为空表。 2.数据元素之间的关系: 直接前驱和直接后继 3.抽象数据类型线性表的定义…

PADS Layout安全间距检查报错

问题: 在Pads Layout完成layout后,进行工具-验证设计安全间距检查时,差分对BAK_FIXCLK_100M_P / BAK_FIXCLK_100M_N的安全间距检查报错,最小为3.94mil,但是应该大于等于5mil;如下两张图: 检查&…

SpringBoot的配置高级

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…

【JMeter】使用内网负载机(Linux)执行JMeter性能测试

一、背景 ​ 在我们工作中有时候会需要使用客户提供的内网负载机进行性能测试,一般在什么情况下我们需要要求客户提供内网负载机进行性能测试呢? 遇到公网环境下性能测试达到了带宽瓶颈。那么这时,我们就需要考虑在内网环境负载机下来执行我们…

使用C语言将ASCII明文编码为GSM短信体格式

一、背景介绍 GSM(Global System for Mobile Communications)是全球移动通信系统的简称,而GSM 03.38是GSM系统中用于短信编码的标准。GSM 03.38字符集采用7-bit编码,与ASCII的8-bit编码有所不同。为了将ASCII编码的文本转换为GSM…

【JavaWeb学习笔记】13 - JSP浏览器渲染技术

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/jsp JSP 一、JSP引入 1.JSP现状 1.目前主流的技术是前后端分离(比如: Spring Boot Vue/React),我们会讲的.[看一下] 2. JSP技术使用在逐渐减少,但使用少和没有使用是两个意思&#xff…

DB207S-ASEMI迷你贴片整流桥DB207S

编辑:ll DB207S-ASEMI迷你贴片整流桥DB207S 型号:DB207S 品牌:ASEMI 封装:DBS-4 最大平均正向电流:2A 最大重复峰值反向电压:1000V 产品引线数量:4 产品内部芯片个数:4 产品…

Spring security之授权

前言 本篇为大家带来Spring security的授权,首先要理解一些概念,有关于:权限、角色、安全上下文、访问控制表达式、方法级安全性、访问决策管理器 一.授权的基本介绍 Spring Security 中的授权分为两种类型: 基于角色的授权&…

2024最新苹果手机APP软件下架了,怎么安装?

如果你是一个iPhone用户,你可能会遇到这样的情况:你想下载或更新一个软件,但发现它已经从APP Store上消失了。这可能是因为软件违反了苹果的规则,或者开发者主动撤下了软件。那么,这种情况下,你还能安装或使…

OpenCV | 霍夫变换:以车道线检测为例

霍夫变换 霍夫变换只能灰度图,彩色图会报错 lines cv2.HoughLinesP(edge_img,1,np.pi/180,15,minLineLength40,maxLineGap20) 参数1:要检测的图片矩阵参数2:距离r的精度,值越大,考虑越多的线参数3:距离…

Unreal5.3 PCG 笔记

目录 ElectricDreams场景功能移动中间山体向周围随机生成倒下的树干树干上随机生成的植被 ElectricDreams场景功能 移动中间山体向周围随机生成倒下的树干 配置内容 中心山体Spline周围沟渠Spline(土堆)PCG规则 主要功能节点 SplineSample(…

基于Java web的住院管理系统论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

Linux 操作系统(用户注册、删除、权限修改等)

添加用户 格式:useradd 用户名 ( 添加用户 ) passwd 用户名 (给用户设置密码) Linux 用户切换原则: 高权限向低权限切换无需输入密码 低权限向高权限或同级用户切换需要输入密码 用户切换:su su – 用户名 (用户切换&#x…

【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…

蓝牙技术在物联网中的应用

随着蓝牙技术的不断演进和发展,蓝牙已经从单一的传统蓝牙技术发展成集传统蓝牙。高速蓝牙和低耗能蓝牙于一体的综合技术,不同的应用标准更是超过40个越来越广的技术领域和越来越多的应用场景,使得目前的蓝牙技术成为包含传感器技术、识别技术…

DRF从入门到精通三(反序列化数据校验源码分析、断言Assert、DRF之请求、响应)

文章目录 一、反序列化数据校验源码分析二、断言Assert三、DRF之请求、响应Request类和Response类请求中的Request 能够解析前端传入的编码格式响应中的Response能够响应的编码格式 一、反序列化数据校验源码分析 反序列化数据校验,校验顺序为:先校验字段…