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

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

相关文章

Linux系统基础知识3

现在主要有以下几种Linux系统: Debian Gentoo Ubuntu Damn Vulnerable Linux 红帽企业级Linux CentOS Fedora Kali Linux Arch Linux 以下是以上Linux系统的特点: Debian:稳定性和安全性高,适用于生产环境和服务器等关键应用场景…

基于SpringBoot实现的前后端分离书店项目,功能:注册登录、浏览商品、热门商品、购物车、购买、地址管理、密码管理等

一、项目简介 本项目主要基于SpringBoot、Mybatis-plus、MySQL、Redis实现的书店管理系统。 本系统是前后端分离的,分别由三个子项目构成:java服务端、用户浏览与购买的前端、管理员管理商品的前端 环境 java 1.8mysql8.0redisvue2.x 管理员子系统功…

Ubuntu 常用命令之 ps 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 ps命令是Linux下的一个非常重要的命令,它用于查看系统中的进程状态。ps是Process Status的缩写,可以显示系统中当前运行的进程的状态。 以下是一些常用的参数 a:显示所有进程(包括…

textile 语法

1、文字修饰 修饰行内文字 字体样式textile 语法对应的 XHTML 语法实际显示效果加强*strong*<strong>strong</strong>strong强调_emphasis_<em>emphasis</em>emphasis加粗**bold**<b>bold</b>bold斜体__italics__<i>italics</i…

string的库函数reserve、resize

系列文章 http://t.csdnimg.cn/u80hL 目录 系列文章[TOC](目录) 一、reserve——请求容量的变化二、resize——操作对象使用的空间 一、reserve——请求容量的变化 改变对象的capacity——他会请求开辟和缩小对象所占的空间&#xff0c;reserve只能操作对象未使用的空间&…

通过bbeat播放器控制吉他效果器

在这个视频中&#xff0c;我们学习如何使用bbeat播放器来控制Fractal FXIII/FM3吉他效果器切换 有了bbeat&#xff0c;我们就可以播放伴奏和视频&#xff0c;控制 midi 设备&#xff0c;而无需在舞台上携带电脑和声卡。bbeat 可播放音频、midi、视频、图像和多轨文件。 它可读…

单例模式实现

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 单例模式 1. 什么是单例模式2. 饿汉模式3.…

C语言实现对数组去重算法详解

介绍 在编程中&#xff0c;经常会遇到需要对数组进行去重的情况&#xff0c;即去除数组中重复的元素&#xff0c;使得每个元素都是唯一的。本文将详细解释一个用于去重的C语言函数&#xff0c;并逐步解释其中的每一部分。 代码解析 下面是用于去重的C语言函数&#xff1a; …

C语言易错知识点九(指针(part three))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 许久不见&#xff0c;甚是想念&#xff0c;本大忙人已经很久没有更新博客了&#xff0c;我想大概我的粉丝们早…

Linux的/proc/self/学习

文章目录 /proc目录/proc/self的使用 在做SSTI模板注入的CTF题中&#xff0c;发现有师傅提到可以用/proc/self这个目录获取flag&#xff0c;所以也来学习一波主要参考. (我才知道&#x1f601;&#x1f601;&#x1f601;)可以通过/proc/$pid/来获取指定进程的信息&#xff0c…

Kioptrix-3

靶场下载地址 https://download.vulnhub.com/kioptrix/KVM3.rar 信息收集 # Nmap 7.94 scan initiated Thu Dec 21 21:52:25 2023 as: nmap -sn -oN live.nmap 192.168.1.0/24 Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00048s latency). MAC Address:…

[了解]DOS命令相对路径绝对路径

DOS: 磁盘操作系统 操作原理&#xff1a;在cmd控制台输入指令后--->交给DOS系统(接收\解析\执行)--->操作windows系统文件夹目录 dos指令: md d:\\temp md test100 test200 在d盘创建了一个文件夹目录叫temp。 在当前文件夹目录下创建了两个目录test100 test200。 r…

AI绘画中VAE压缩图像

介绍 在Stable Diffusion中,所有的去噪和加噪过程并非在图像空间直接进行,而是通过VAE模块将图像编码到一个低维空间。 这个低维空间的“分辨率”低于原始图像空间,有利于快速地完成加噪和去噪过程。 最后再将编码空间中的噪声表示解码恢复为图像空间,完成去噪或加噪操作。 …

【Element】el-table 使用 el-table-infinite-scroll 插件实现滚动加载

虽然 el 官方提供了 Infinite Scroll 无限滚动 组件 但是却不支持 el-table 组件&#xff0c;这就很难受了&#xff0c;还好已经有大佬写好了插件&#xff0c;并且支持 element-plus/infinite-scroll 组件的所有选项。 el-table-infinite-scroll el-table-infinite-scroll 看…

【数据结构入门精讲 | 第十二篇】考研408、公司面试树专项练习(一)

在上一篇文章中我们介绍了树的知识点&#xff0c;在这一篇中我们将进行树的专项练习。 目录 判断题选择题填空题二叉树的宽度R6-1 是否二叉搜索树 方法介绍&#xff1a; 已知中序及后序&#xff0c;求前序 如后序为DABEC,中序为DEBAC&#xff0c;求前序 则后序倒着写&#xff…

北京Modbus转Profinet网关的作用

背景&#xff1a;随着工业自动化的快速发展&#xff0c;各种仪器设备迅速崛起&#xff0c;但是在仪器出厂前需要很多的零部件来构建出需要的设备及功能&#xff0c;由于自动化设备的零部件不是统一生产商供应的&#xff0c;这样很容易出现某个零部件的通讯协议不匹配&#xff0…

搜索二叉树(超详解)

文章目录 前言查找搜索二叉树的结构insertfinderase递归版本Findinserterase 二叉树的拷贝问题搜索二叉树的应用Key模型Key/Value的模型 前言 普通二叉树其实意义不大&#xff0c; 如果用二叉树存储数据的话&#xff0c;还不如顺序表&#xff0c;链表这些。 搜索二叉树它的意义…

7.5组合总和②(LC40-M)

算法&#xff1a; 相比于上一题&#xff0c;数组candidates有重复元素&#xff0c;而要求不能有重复的组合&#xff0c;所以相对于39.组合总和 (opens new window)难度提升了不少。 如何去重&#xff1f; 先把candidates排序&#xff0c;让重复的元素都在一起 单层递归时&a…

TCP的poll多路复用实现群聊

服务器 #include <myhead.h> #define SERIP "192.168.125.99" #define SERPORT 9999 int main(int argc, const char *argv[]) {int sfd-1;if((sfdsocket(AF_INET,SOCK_STREAM,0))-1){perror("socket error");return -1;}printf("sfd%d\n"…

MyBatis的关联查询!!!(一对一、一对多、多对多)

准备工作&#xff1a; 1.创建Maven工程&#xff0c;还没有配置Maven的和还不会的去看这里啦&#xff1a;maven的下载安装与配置环境变量&#xff01;&#xff01;&#xff01;&#xff08;全网最详细&#xff09;-CSDN博客 Account.java : (pojo类) &#xff08;这里我…