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是面向快速执行场景的数据库

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

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

相关文章

找到字符串中所有字母异位词--滑动窗口

个人主页:Lei宝啊 愿所有美好如期而遇 本体题目链接https://leetcode.cn/problems/VabMRr/description/ 算法原理 滑动窗口其实就是种双指针,只是这种双指针只向后移动,不会回退,具有单调性,也就是说,…

BWS2000倾角传感器c++测试代码【1】

使用瑞芬的倾角传感器配置的时候,数据手册一下就配置好了,但是BWS2000倾角传感器总是出错,这里进行一下记录出现的问题与解决方式。 1.初步测试 在配置BWS2000倾角传感器读取帧数据的时候,总是出现一个问题,就是进行…

「Vue3面试系列」Vue3.0性能提升主要是通过哪几方面体现的?

文章目录 一、编译阶段diff算法优化静态提升事件监听缓存SSR优化 二、源码体积三、响应式系统参考文献 一、编译阶段 回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发…

Windows漏洞利用开发——利用SEH绕过GS保护

实验6 Windows漏洞利用开发 6.1实验名称 Windows漏洞利用开发 6.2实验目的 学习windows漏洞利用开发,使用kali linux相关工具对windows内目标程序进行漏洞利用 6.3实验步骤及内容 第二阶段:利用SEH绕过GS保护 了解GS编译选项,SHE异常处…

【数据结构入门精讲 | 第二篇】考研408、企业面试基础概念习题

在上一篇文章中我们学习了数据结构的概念、算法复杂度的概念及其相关计算,这篇文章侧重考研408、企业面试数据结构的导论、算法复杂度等练习。 目录 判断题选择题编程题R7-1 最大子列和问题 判断题 1.时间复杂度是根据算法写成的程序在执行时耗费时间的长度&#xf…

C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 结构、类与属性

C# 入门基础知识 - C# 结构、类与属性 第9节 结构、类与属性9.1 结构的使用9.2 枚举9.3 面向对象概述9.4 类与对象的关系9.5 类的声明9.6 属性的使用9.6.1 属性9.6.2 属性使用 9.7 构造函数和析构函数9.7.1 构造函数9.7.2 析构函数 9.8 类的继承9.9 类的封装9.10 类的多态 更多…

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 (一)” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…

使用web_video_server进行网页段的视频传输

引言:在项目中,需要实现无人机摄像头采集到的图像回传到window下进行查看,为此,选择使用web_video_server功能包实现局域网下的图像传输 硬件环境: 硬件:Jetson orin nano 8G D435摄像头 环境&#xff…

Go后端开发 -- Golang的语言特性

Go后端开发 – Golang的语言特性 文章目录 Go后端开发 -- Golang的语言特性一、Golang的优势1.部署极其简单:2.静态语言3.语言层面的并发4.强大的标准库5.简单易学6.运行效率对比 二、Golang的适用领域1.应用领域2.明星产品 三、Golang的不足 一、Golang的优势 1.部…

[管理者与领导者-129]:很多人对高情商的误解,工程师要扩展自己的情商吗?工程师如何扩展自己的情商?

目录 前言: 一、什么是高情商? 1.1 什么是高情商 1.2 情商的五大能力 1.3 高情商的层次 1.4 对高情商的误解? 二、工程师需要发展自己的高情商吗? 三、工程师如何扩展自己的情商? 四、什么样的“高情商”的管理者令人讨…

基于Springboot的留守儿童爱心网站(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的留守儿童爱心网站(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

凸优化 2:如何判定凸函数?

凸优化 2:如何判定凸函数? 如何判断一个目标函数是凸函数?如果是凸函数,那ta的定义域是凸集合 一个函数求俩次梯度,大于等于0,那这个函数就是一个凸函数在同样条件下,怎么设计为凸函数模型&…