[Redis][预备知识]详细讲解

news2024/9/23 14:40:26

目录

  • 1.命令
    • 1.最核心的两个命令
      • 1.SET
      • 2.GET
      • 3.说明
    • 2.基本全局命令
      • 0.前言
      • 1.KEYS
      • 2.EXISTS
      • 3.DEL
      • 4.EXPIRE
      • 5.TTL
      • 6.TYPE
  • 2.数据结构和内部编码
  • 3.单线程架构
    • 1.单线程模型
    • 2.单线程还效率高?(重点)
    • 3.注意


1.命令

1.最核心的两个命令

1.SET

  • 语法SET key value
  • 功能:设置key以保存字符串value
    • 如果key已持有一个值,则无论其类型如何,它都会被覆盖
    • 在成功的SET操作中,将与密钥关联的任何先前生存时间都被丢弃

2.GET

  • 语法GET key
  • 功能:获取key的值
    • 如果键不存在,则返回特殊值nil -> 和NULL一个意思
    • 如果存储在key处的值不是字符串,则返回错误,因为GET仅处理字符串值

3.说明

  • Redis中,命令是不区分大小写的
  • 上述的KeyValue,不需要加上引号,就是字符串类型
    • 如果加上引号(单双引号都行),也没问题

2.基本全局命令

0.前言

  • Redis的命令有上百个,如果纯靠死记硬背⽐较困难,但是如果理解Redis的⼀些机制,会发现这 些命令有很强的通⽤性
  • Redis不是万⾦油,有些数据结构和命令必须在特定场景下使⽤,⼀旦使⽤不当可能对Redis本⾝ 或者应⽤本⾝造成致命伤害

1.KEYS

  • 语法KEYS pattern
  • 功能:返回满足所有样式(pattern)的key
  • 支持的通配符样式如下
    • ?:匹配一个字符
    • *:匹配任意多个字符
    • [ab]:只能匹配括号内的字符,此处为只能匹配a b
    • [^a]:排除括号内的字符,此处为只有a匹配不了,其他都能匹配
    • [a-b]:匹配a - b这个范围内的字符,包含两侧边界
  • 返回值:匹配pattern的所有key
  • 注意:时间复杂度 O ( N ) O(N) O(N),在生产环境上,一般都会禁用KEYS命令,尤其是KEYS *
    • 生产环境上的key可能会非常多,而Redis是一个单线程服务器,执行KEYS *的时间非常长,就会使Redis服务器被阻塞,无法给其他客户端提供服务
    • 此时其他的查询Redis操作超时了,就直接会去查数据库,突然一大波数据突然来了,MySQL可能措手不及,就直接挂了

2.EXISTS

  • 语法EXISTS key [key...]
  • 功能:判断某个key是否存在
  • 返回值key存在的个数
    • 针对多个key而言,是非常有用的
  • 时间复杂度 O ( 1 ) O(1) O(1)
  • EXISTS key1 key2和分开写EXISTS key1EXISTS key2有什么区别?
    • 分开的写法,会产生更多的轮次的网络通信
    • 此时跟直接操作内存相比,效率比较低,成本比较高

3.DEL

  • 语法DEL key [key...]
  • 功能:删除指定的key
  • 返回值:删除掉的key的个数
  • 时间复杂度 O ( 1 ) O(1) O(1)
  • Redis 的删除操作没有像MySQL那样危险,但依然要小心
    • Redis的主要应用场景是缓存,并且存的都是热点数据
      • 如果只是误删了几个数据,一般来说,问题不大
      • 但是如果一下误删了一大半,此时影响还是会很大,因为Redis本是帮MySQL负重前行,但此时Redis没数据了,大部分的请求就直接打给MySQL了,此时就很容器把MySQL搞挂
      • 相比之下,如果是MySQL这样的数据,哪怕误删一个,问题都可能很大
    • Redis如果作为数据库,那误删的数据影响就肯定很大了
    • Redis如果作为消息队列,此时的影响,就要具体分析了

4.EXPIRE

  • 语法EXPIRE key seconds
  • 功能:为指定的key添加秒级的过期时间(Time To Live TTL)
    • 毫秒单位版本PEXPIRE
  • 返回值:1表⽰设置成功,0表⽰设置失败
  • 时间复杂度 O ( 1 ) O(1) O(1)

5.TTL

  • 语法TTL key
  • 功能:获取指定key的过期时间,秒级
    • 毫秒单位版本PTTL
  • 返回值:剩余过期时间,-1表⽰没有关联过期时间,-2表⽰key不存在
  • 时间复杂度 O ( 1 ) O(1) O(1)
  • 键过期机制:定期删除 + 惰性删除 + 内存淘汰策略
    • 惰性删除:一个key已经过期,但是暂时还没删除,此时key还存在,后面来了一个访问,正好用到了这个key,此时该访问就会让Redis服务器触发删除key的操作
    • 定期删除:每次抽取一部分,进行验证过期时间,保证这个抽取检查的过程足够快
      • 因为Redis是单线程程序,如果扫描过期key消耗的时间太多了,会导致其他正常处理请求命令被阻塞
        请添加图片描述

6.TYPE

  • 语法TYPE key
  • 功能:返回key对应的value的数据类型
  • 返回值none, string, list, set, zset, hash, stream
  • 时间复杂度 O ( 1 ) O(1) O(1)

2.数据结构和内部编码

  • TYPE命令实际返回的就是当前键的数据结构类型,但这些只是Redis对外的数据结构

  • 实际上Redis针对每种数据结构都有⾃⼰的底层内部编码实现,⽽且是多种实现,这样Redis会在合适的场景选择合适的内部编码
    请添加图片描述

  • 可以通过object encoding key来查看对应的value的实际编码方式

  • Redis这样设计的好处

    • 可以改进内部编码,⽽对外的数据结构和命令没有任何影响,这样⼀旦开发出更优秀的内部编码, ⽆需改动外部数据结构和命令
      • 例如:Redis3.2提供了quicklist,结合了ziplistlinkedlist两者的优势,为列表类型提供了⼀种更为优秀的内部编码实现,⽽对⽤⼾来说基本⽆感知
    • 多种内部编码实现可以在不同场景下发挥各⾃的优势
      • 例如ziplist⽐较节省内存,但是在列表元素⽐较多的情况下,性能会下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist,整个过程⽤⼾同样⽆感知

3.单线程架构

1.单线程模型

  • Redis只使用一个线程处理所有的请求,但并不代表Redis服务器进程内部真的就只有一个线程

    • 事实上,Redis内部也有多个线程,多个线程都是在处理网络IO
  • Redis采⽤单线程模型执⾏命令的是指:虽然以下三个客⼾端看起来是同时要求Redis去执⾏命令的,但微观⻆度,这些命令还是采⽤线性⽅式去执⾏的,只是原则上命令的执⾏顺序是不确定的,但⼀定不会有两条命令被同步执⾏
    请添加图片描述

  • 感性理解

    • 虽然多个客户端是"并发"的发起了请求,但是Redis实际上处理请求时是单线程模型,保证了当前收到的多个请求,在Redis内部,依然是串行执行的
    • 多个请求同时到达Redis服务器,也要先在队列中排队,再等待Redis服务器一个一个地取出里面的命令再执行
  • Redis采用单线程模型地原因:Redis核心业务逻辑都是短平快的,不太消耗CPU资源,也就不太吃多核

  • 注意:正因为Redis是单线程模型,所以要特别小心,如果某个操作占用时间长,就会阻塞其他命令的执行


2.单线程还效率高?(重点)

  • 首先明确,说Redis快,是以数据库为参照的,没有参照,单纯说快,就是耍流氓 😛
  • Redis纯内存访问,数据库则是访问硬盘
  • Redis核心功能,比数据库的核心功能简单
  • 单线程模型,避免了一些不必要的线程竞争开销
    • Redis每个基本操作,都是短平快的,简单操作一下内存,并不是很消耗CPU,即使搞了多线程,提升也不大
    • 单线程可以简化数据结构和算法的实现,
  • 处理网络IO地时候,使用了epoll这样的IO多路复用机制 --> 非阻塞IO
    请添加图片描述

3.注意

  • Redis有⼀个致命的问题对于单个命令的执⾏时间都是有要求的
    • 如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客⼾端的阻塞,对于Redis这种⾼性能的服务来说是⾮常严重的
    • 所以Redis是⾯向快速执⾏场景的数据库

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

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

相关文章

jmeter发送邮件:详细步骤与功能配置指南?

jmeter发送邮件如何设置?怎么配置JMeter以发送邮件? Apache JMeter作为一款强大的性能测试工具,不仅可以用于测试Web应用的性能,还可以通过插件扩展其功能,实现诸如发送邮件等操作。AokSend将详细介绍如何使用JMeter发…

核心复现—计及需求响应的区域综合能源系统双层优化调度策略

目录 一、主要内容: 二、摘要介绍: 三、综合能源系统结构: 四、实际仿真运行结果: 五、代码数据下载: 一、主要内容: 在模型构建部分:建立了一个综合能源系统双层优化调度模型,…

openeuler22.03 LTS 源码编译安装fastdfs-6.06

openeuler22.03 LTS 源码编译安装fastdfs-6.06 1、环境 名称版本备注openeuler22.03 LTSfastdfs6.06libfastcommon1.0.43libfastcommon是一个开源的C语言库,用于实现高性能的分布式文件系统和分布式存储系统 2、准备安装包 fastdfs 官网: https://git…

《概率论与数理统计》学渣笔记

文章目录 1 随机事件和概率1.1 古典概型求概率随机分配问题简单随机抽样问题 1.2 几何概型求概率1.3 重要公式求概率 2 一维随机变量及其分布2.1 随机变量及其分布函数的定义离散型随机变量及其概率分布(概率分布)连续型随机变量及其概率分布&#xff08…

【machine learning-12-多元线性回归】

线性回归-多特征 多特征线性回归多特征表示更简单的多元线性回归表示方法 之前节的线性回归为简化都是用的单特征,但现实中我们的预测因素很复杂不可能只有一个特征,下面总结多特征线性回归 多特征 之前总是用房价举例,预测房价和房屋面积的…

个人量化成功之路-----从 Yahoo! Finance 下载交易策略数据

雅虎财经 是投资者最受欢迎的网站之一。它提供有关股票、债券、货币和加密货币的各种市场数据。它还提供市场新闻、报告和分析、期权和基本数据 官方的雅虎财经 API 于 2017 年被下架 Yfinance 是由 Ran Aroussi 开发的开源 Python 库,用于访问雅虎财经上可用的财…

基于微信小程序的宠物寄养平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 随着科技和网络的进步,微信小程序技术与网络、生活贴和的更加紧密。需要依靠客户端的单机系统逐渐被淘汰,利用互联网可以处理大量数据的新型系统如雨后春笋般迅速发展起来。这类系统和信息化时代的同步发展对传统的办公管理方式造成了很大的压力。…

C++进阶学习——模版进阶

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成…

如何基于scrcpy改造实现大厂一键连招/触摸宏功能(带java源码)-千里马安卓framework实战

背景: 前面公众号文章已经分享过如何实现这种大厂里面一键连招,触摸宏的功能,原理本身是对dev/input下面的节点进行读取保存文件,然后在读取文件进行写入dev/input下面的节点,从而实现了触摸事件的读取和写入&#xf…

OpenMVG试用

1 OpenMVG 简介 全称 Open Multiple View Geometry,是法国人 Pierre Moulon 读博期间开源的一个 C 库 最早版本 OpenMVG 0.1 是 2013年 2月 发布的,目前最新版本是 2021年 10月 发布的 OpenMVG 2.0 LinkedIn 显示,此前一直在…

docker存储

docker分层结构 如图所示,容器是由最上面可读可写的容器层,以及若干个只读镜像层组成,创建容器时,容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制: 1、容器中新生成的数据会直接存放在容器层&#xf…

8. 防火墙

8. 防火墙 (1) 防火墙的类型和结构 防火墙的类型和结构可以根据其在网络协议栈中的过滤层次和实现方式进行分类。常见的防火墙类型包括: 包过滤防火墙:工作在网络层(OSI模型的第3层),主要检查IP包头的信息,如源地址、目的地址、端口号等。电路级网关防火墙:工作在会话层…

初始MYSQL数据库(6)—— 事务

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 事务的概念 事务的ACID特性 使用事务 查看支持事务的存储引擎 事务的语法 保存点 自动/手动提交事务 事务的隔离性和…

NLP 文本分类任务核心梳理

解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据,核心解决方案: 自己构造训练样本 数据增强,如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…

MySQL --基本查询(下)

文章目录 3.Update3.1将孙悟空同学的数学成绩变更为 80 分3.2将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分3.3将总成绩倒数前三的 3 位同学的数学成绩加上 30 分3.4将所有同学的语文成绩更新为原来的 2 倍 4.Delete4.1删除数据4.1.1删除孙悟空同学的考…

learn C++ NO.19——二叉搜索树

简单介绍一下二叉搜索树 二叉搜索树也称为二叉排序树。它是一种具有特殊性质的二叉树。它有如下性质。 1、当前节点的左子树的值一定小于当前节点,当前节点的右子树的值一锭大于当前节点。这也就意味着,在接近完全二叉树的情况下(高度较为合…

开源实时多模态AI聊天机器人Moshi,语音对话延迟低至200毫秒!

开源实时多模态AI聊天机器人Moshi,语音对话延迟低至200毫秒! 最近AI圈真是热闹非凡,继Meta发布Llama 3之后,各种开源大模型也是层出不穷。这不,法国一个非盈利AI研究实验室Kyutai,又搞了个大新闻&#xff0…

从零到一:如何用Ollama和OpenUI构建强大的AI模型库

搭建开源大模型平台的步骤与模型介绍 在这篇文章中,我将分享如何在Windows上使用Ollama和OpenUI搭建开源大模型平台的步骤,并介绍我所部署的几个模型及其擅长的领域。 目录 搭建开源大模型平台的步骤与模型介绍一、搭建平台步骤1. 安装Ollama2. 安装Ope…

C++自动驾驶面试核心问题整理

应用开发 概述:比较基础,没啥壁垒,主要有linux开发经验即可 问题:基础八股,如计算机网络、操作系统、c11等基础三件套;中等难度算法题1-2道。 中间件开发(性能优化) 概述&am…

FutureTask源码分析

Thread类的run方法返回值类型是void,因此我们无法直接通过Thread类获取线程执行结果。如果要获取线程执行结果就需要使用FutureTask。用法如下: class CallableImpl implements Callable{Overridepublic Object call() throws Exception {//do somethin…