Redis的预备知识

1.Redis的基本全局命令

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

1.1 KEYS

返回所有满足样式(pattern)的key

假定当前具有以下value值:hllo,hello,hallo,hxllo,heeeello

h?llo匹配hello,hallo和hxllo

h*llo匹配hllo,hello,hallo,hxllo,heeeello

h[ae]llo匹配hallo,hello但不匹配hxllo

h[^a]llo匹配hello,hxllo但不匹配hallo

h[a-b]匹配hallo

匹配规则:

?匹配任意一个字符
*匹配0~任意个字符
[ae]只能匹配字符a和字符e
[^e]匹配不是e的一个字符
[a-e]匹配a,b,c,d,e这五种字符

语法:KEYS pattern

时间复杂度:O(N)

返回值:匹配pattern的所有key

示例:

注意:在实际生产环境中一般是禁止使用KEYS命令,因为Redis是单线程的服务器,如果key的数量很多 ,KEYS操作可能会消耗很长的时间,造成服务器产生阻塞,服务器无法给其他客户端提供服务。同时Redis作为缓存,挡在MySQL前,替MySQL负重前行,Redis倍KEYS命令阻塞,其他请求在Redis服务器超时,就会直接查MySQL,很容易把MySQL整挂了

1.2 EXISTS

判断某个key是否存在

语法:EXISTS key [key ...](多个key使用空格分隔)

时间复杂度:O(1)

返回值:key存在的个数

示例:

 exists hello,exists hallo和exists hello hallo之间的区别:

Redis是一个客户端服务器结构的程序,客户端和服务器之间通过网络来进行通信,分开写,产生更多次网络通信(分装和复用),效率非常低,成本高(与直接操作内存相比)

1.3 DEL

删除制定的key

语法:DEL key [key ...]

时间复杂度:O(1)

返回值:删除掉的key的个数

示例:

1.4 EXPIRE

为指定的key添加秒级的过期时间(Time To Live,简称TTL)

语法:EXPIRE key seconds

时间复杂度:O(1)

返回值:1表示设置成功,0表示设置失败

示例:

1.5 TTL

获取指定key的过期时间,秒级

语法:TTL key

时间复杂度:O(1)

返回值:剩余过期时间。-1表示没有设置过期时间,-2表示key不存在

示例:

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

经典面试题:Redis的key过期策略

1.定期删除

2.惰性删除

Redis的key过期策略采用惰性删除和定期删除相结合。惰性删除指key已经过期,但是暂时没有删除它,即key仍然存在,紧接着后续又一次访问正好用到了该key,于是Redis服务器触发删除key操作的命令,同时返回nil。这种惰性删除也要结合定期删除一起,定期删除的时间有明确的要求,这是因为Redis是单线程的程序,主要任务是处理每个命令的任务,扫描过期key等。如果扫描过期key消耗时间太多,导致正常处理其他请求命令阻塞(类似于KEYS *),所以定期删除一般都是每次只扫描一部分。

虽然Redis采用了这两种删除策略结合,但仍然有很多残留的key,没有及时删除,Redis对key过期还提供了一系列的内存淘汰策略(后续讲解)

1.6 TYPE

返回key对应的数据类型

语法:TYPE key

时间复杂度:O(1)

返回值:none,string,list,set,zset,hash和stream等

示例:

2.Redis中的数据结构和内部编码

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

数据结构内部编码(具体实现)
string

raw(最基本的字符串,相当于Java中的Byte数组)

int (redis存储键值对时,当value是整数时,redis可能会采用int)

embstr(针对短字符串进行的特殊优化)

hash

hashtable(redis内部哈希表的实现)

ziplist(压缩列表,当hash中元素比较少的时候,可能会优化为ziplist)

list

linkedlist(链表)

ziplist

quicklist(从Redis3.2开始,引入,结合了前两者的优点,是链表,每个节点又是一个ziplist,把空间和效率折衷顾虑到了)

set

hashtable

inset(集合中存放的都是整数)

zset

skiplist(跳表,也是链表,不同于普通的链表,每个节点有多个指针域,通过巧妙地搭配实现查询元素的时间复杂度为O(logN))

ziplist

可以看到,每种数据结构至少有两种以上的内部编码实现,那么我们如何去查询到这些数据结构的编码形式?通过object encoding命令查询内部编码

示例:

 Redis这样设计的好处:

1.可以改进内部编码,而对外的数据结构和命令没有任何影响,这样一旦开发出更优秀的内部代码,无需改动外部数据结构和命令,例如quicklist,结合ziplist和linkedlist两者的优点,为列表提供了一种新的内部编码实现,而对用户是无感知的

2.多种内部编码实现可以在不同场景下发挥各自的优势,例如ziplist可以节省内存,但在列表元素较多的情况下,性能会下降,这是Redis会根据配置选项将列表类型的内部实现转换为linkedlist,整个过程用户同样无感知

3.Redis的单线程架构

3.1单线程模型

Redis使用单线程架构来实现高性能的内存数据库服务,redis只使用一个主线程处理所有命令请求,并不是说redis服务器进程只有一个线程,其实也有多个线程,只不过在处理网络IO

上图三个客户端同时请求Redis服务,会不会产生线程不安全的情况呢?

不会,因为Redis是单线程的程序,多个请求在队列中排队,等待服务器一个一个取出命令并执行,从微观上讲Redis服务器串行/顺序执行命令的

经典面试题:Redis单线程为什么这么快

通常来讲单线程处理能力比多线程要差,但Redis单线程执行速度快,可以归结于以下几点:

1.Redis纯内存访问,Redis将所有数据存在的内存中,而读内存的速度要比读硬盘的速度要快得多

2.Redis核心功能比数据库的要简单

3.Redis采用单线程避免了多线程之间线程的切换和竞争所产生的开销,单线程也可以简化数据结构和算法的实现,让模型更加简单

4.Redis采用epoll作为I/O多路复用技术的实现,再加上Redis自身的时间处理模型将epoll中的连接读取,关闭都转换为时间,不在网络I/O上浪费过多的时间

Redis使用I/O多路复用模型

针对TCP来说,服务器这边每次要服务一个客户端,都需要给这个客户端安排一个Socket,一个服务器多个客户端,同时就有多个Socket 。这些Socket并不是无时无刻都在传输数据,很多情况下,每个客户端服务器之间的通信没有那么频繁,此时很多Socket都是静默状态的,上面没有要传输的数据,只有少数Socket活跃,于是采用一个线程来管理。

Java中使用NIO实现IO的多路复用(标准库中提供了一组类,底层封装了epoll)

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

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

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

相关文章

量子计算的威胁,以及企业可以采取的措施

当谷歌、IBM、Honeywell和微软等科技巨头纷纷投身量子计算领域时,一场技术军备竞赛已然拉开帷幕。 量子计算虽能为全球数字经济带来巨大价值,但也有可能对相互关联的系统、设备和数据造成损害。这一潜在影响在全球网络安全领域引起了强烈关注。也正因如…

nlp|微调大语言模型初探索(3),qlora微调deepseek记录

前言 上篇文章记录了使用lora微调llama-1b,微调成功,但是微调llama-8b显存爆炸,这次尝试使用qlora来尝试微调参数体量更大的大语言模型,看看64G显存的极限在哪里。 1.Why QLora? QLoRA 在模型加载阶段通过 4-bit 量化大幅减少了模型权重的显存占用。QLoRA 通过 反量化到 …

【设计模式】【创建型模式】工厂方法模式(Factory Methods)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言:在人工智能技术飞速发展的今天,深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型,凭借其高效的性能和灵活的部署方式,受到了广泛关注。无论是自然语言处理、图像识别,还是…

Deepseek 与 ChatGPT:AI 浪潮中的双子星较量

引言 在人工智能飞速发展的当下,AI 语言模型成为了人们关注的焦点。Deepseek 与 ChatGPT 作为其中的佼佼者,各自展现出独特的魅力,引领着 AI 技术的发展潮流。今天,就让我们深入探讨这两款模型,看看它们在 AI 领域中是…

QT事件循环

文章目录 主事件循环事件循环事件调度器事件处理投递事件发送事件 事件循环的嵌套线程的事件循环deleteLater与事件循环QEventLoop类QEventLoop应用等待一段时间同步操作模拟模态对话框 参考 本文主要对QT中的事件循环做简单介绍和使用 Qt作为一个跨平台的UI框架,其…

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…

进程等待和进程程序替换

进程控制 进程等待进程程序替换 进程等待 如果子进程没有退出 而父进程在进行执行waitpid进行等待&#xff0c;阻塞等待&#xff0c; 进程阻塞了 在等待某种条件发生&#xff08;子进程退出&#xff09; 进程程序替换 1 #include <stdio.h>2 #include <unistd.h>3…

UEFI Spec 学习笔记---6 - Block Translation Table (BTT) Layout

6.1 Block Translation Table (BTT) Background 定义个一个连续地址的非易失性的namespace&#xff0c;就是将一整个namespace 拆分成一个个block&#xff0c;其中的地址保存至BBT&#xff08;块转换表&#xff09;&#xff0c;这样可以防止扇区撕裂&#xff08;由于电源问题导…

SAP 代码扫描工具

描述&#xff1a; ZSCANNER是一个先进的代码分析工具&#xff0c;旨在提供对程序和功能模块内部工作的全面见解。它揭示了代码的技术细节&#xff0c;包括正在创建、读取、更新或删除的数据表&#xff08;CRUD操作&#xff09;&#xff0c;以及正在调用的类、功能模块和BAPI&a…

c语言基础第12节《函数的调用》

c语言基础10 函数 函数的调用 调用方式 ①函数语句&#xff1a; test(); // 对于无返回值的函数&#xff0c;直接调用 int res max(2,4); // 对于有返回值的函数&#xff0c;一般需要再主调函数中接收被调函数的返回值。②函数表达式&#xff1a; 4 max(2,4) scanf(&qu…

C++:iterator迭代器失效

说明&#xff1a;这里拿 vector 举例。 原因一&#xff1a;扩容导致迭代器失效 // 迭代器失效 void insert(iterator pos, const T& x) {assert(pos > _start);assert(pos < _finish);// 满了就扩容if (_finish _end_of_storage){reserve(capacity() 0 ? 4 : ca…

QT之改变鼠标样式

QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标&#xff0c…

用DeepSeek零基础预测《哪吒之魔童闹海》票房——从数据爬取到模型实战

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 **一、为什么要预测票房&#xff1f;****二、准备工作****三、实战步骤详解****Step 1&#xff1a;数据爬取与清洗&am…

高并发下秒杀系统的设计

文章目录 1 业界通用做法1.1 压力分摊1.2 RedisMySQL1.3 Inventory Hint1.4 压力分摊RedisMQ 2 Redis MQ 解决高并发下的秒杀场景2.1 Redis库存预扣减2.1.1 lua脚本执行流程&#xff1a;2.1.2 Lua脚本主要做了几件事&#xff1a; 2.2 MySQL库存扣减2.3 记录操作流水的原因 3 I…

双重差分学习笔记

双重差分适用的研究场景&#xff1a; 研究某项政策或者冲击造成的影响 例如&#xff0c;某某小学在2024.12.12日颁布了小红花激励措施&#xff0c;我们要研究这项措施对学生成绩的影响&#xff0c;此时&#xff0c;就可以使用双重差分模型。 双重差分适用的数据类型&#xf…

深入理解 C++17 中的 std::atomic<T>::is_always_lock_free

文章目录 原子操作与锁无关性&#xff08;Lock-Free&#xff09;锁无关性&#xff08;Lock-Free&#xff09;无锁&#xff08;Lock-Free&#xff09;与无阻塞&#xff08;Wait-Free&#xff09; std::atomic<T>::is_always_lock_free 是什么&#xff1f;truefalse与 is_l…

VSCode 中 Git 添加了多个远端,如何设置默认远端

VSCode 中 Git 添加了多个远端&#xff0c;如何设置默认远端 查看分支&#xff1a;设置默认远端手动指定远端 查看分支&#xff1a; * 表示当前默认远端 git branch -vv* master a1b2c3d [origin/main] Fix typo dev d4e5f6g [upstream/dev] Add feature设置默认远端 将本…

一文讲清 AIO BIO NIO的区别

引言 在 Java 编程中&#xff0c;BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;和 AIO&#xff08;Asynchronous I/O&#xff09;是三种不同的 I/O 模型&#xff0c;它们在处理输入输出操作时有着不同的机制和特点&#xff0c;但是市…

使用(xshell+xftp)将前端项目部署到服务器

一.以vue项目为例 将项目打包生成dist文件 二.下载载安装xshell和xftp 下载地址&#xff1a;家庭/学校免费 - NetSarang Website 三.连接服务器 在xshell新建会话&#xff08;需要用到服务器、用户名、密码、端口号&#xff09;正确输入后连接到服务器 使用命令连接&#x…