redis核心命令全局命令 + redis 常见的数据结构 + redis单线程模型

文章目录

  • 一. 核心命令
    • 1. set
    • 2. get
  • 二. 全局命令
    • 1. keys
    • 2. exists
    • 3. del
    • 4. expire
    • 5. ttl
    • 6. type
  • 三. redis 常见的数据结构及内部编码
  • 四. redis单线程模型

一. 核心命令

1. set

set key value
key 和 value 都是string类型的
在这里插入图片描述
对于key value, 不需要加上引号, 就是表示字符串类型, 加上也可以
redis中, 不区分大小写

2. get

get key
在这里插入图片描述
如果key不存在, 返回nil, 就是null的意思
在这里插入图片描述

二. 全局命令

全局命令, 就是能够搭配任意一个数据结构来使用的命令

1. keys

keys pattern
pattern就是通过一些特殊符号(通配符), 来描述key的模样, 匹配上的key就能被查询出来
在这里插入图片描述
keys的时间复杂度是O(N)
在生产环境上, 一般会禁止使用keys命令, 尤其是keys *

  1. 办公环境
  2. 开发环境 后端程序开发的环境, 硬件配置高
  3. 测试环境 测试工程师使用的
    4.线上环境/生产环境 外界用户可以访问到的

2. exists

在这里插入图片描述

判断key是否存在, 返回key存在的个数(针对多个key是有用的)
时间复杂度: O(1)
redis组织这些key就是按照哈希表的方式来组织的

redis自身的这些键值对, 是通过哈希表的方式来组织的, redis具体的某个值, 又可以是多种数据结构
在这里插入图片描述

3. del

删除指定的key, 可以一次删除一个或多个
在这里插入图片描述
返回删除key的个数(针对多个key是有用的)
时间复杂度: O(1)
在这里插入图片描述
如果redis作为缓存, redis中存的是热点数据, 全量数据是在mysql中存着, 那么redis使用del, 删除几个key, 一般来说问题不大, 相比之下, 如果是mysql数据, 哪怕误删了一个数据, 都可能是影响很大的
如果redis作为数据库, 此时误删数据影响就大了

4. expire

给指定的key设置过期时间, 单位是秒, key存活超出这个指定的值, 就会被自动删除
必须是针对已经存在的key设置过期时间

在这里插入图片描述
(pexpire key 毫秒)

返回0设置失败, 返回1设置成功
时间复杂度: O(1)
在这里插入图片描述

5. ttl

time to live 查看当前key的过期时间还剩多少
在这里插入图片描述
(pttl key )
返回值: 剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在
时间复杂度: O(1)
在这里插入图片描述

redis 的 key 的过期策略是怎么实现的?
redis的整体策略是: 定期删除惰性删除 相结合
惰性删除: 假设key已经过期, 但暂时还没有删除, 后面如果有一次访问, 正好用好这个key, 于是这个访问就会让redis服务器触发删除key的操作, 同时再返回一个nil
定期删除: 每次抽取一部分, 进行验证过期时间, 保证验证的过程足够快
(因为redis是单线程的程序, 如果扫描过期key消耗的时间太多了, 就可能导致正常处理请求命令就阻塞了)
上述过期策略, 任然可能有很多过期的key被残留, redis又提供了一系列的内存淘汰策略

6. type

返回key对应value的数据类型
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三. redis 常见的数据结构及内部编码

在这里插入图片描述
redis在底层实现这些数据结构的时候, 会在源码层面, 针对上述实现进行特定的优化(编码方式可能有变数), 达到节省时间/空间 的效果
同一个数据类型, 背后可能编码方式是不同的, 会根据具体场景优化
redis自动适应, 程序猿使用时是感觉不到的
在这里插入图片描述

  1. raw
    最基本的字符串, 底层就是一个byte数组在存放数据
  2. int
    当value是个整数的时候, 此时可能redis会直接使用int来存储数据
    redis通常也可以用来实现"计数"这样的功能
  3. embstr
    针对短字符串进行的特殊优化
  4. hashtable
    最基本的哈希表
  5. ziplist
    压缩列表, 在哈希表中元素比较少的时候, 并且value的值长度比较短, 可能会优化成ziplist

压缩: 压缩的本质, 是针对数据进行重新编码, 不同的数据有不同的特点, 结合这些特点进行精妙的设计, 重新编码后, 就能够缩小体积, 但付出的代价就是读写速度慢

  1. linkelist
    链表
  2. ziplist
    压缩列表, 在列表中元素比较少的时候, 可能会优化成ziplist
    (从redis3.2开始, 引入了新的quicklist, 代替上面两个)
  3. hashtable
    最基本的哈希表
  4. inset
    集合里都是整数
  5. skiplist
    跳表, 也是链表, 不同于普通的链表, 每个节点上有多个指针域, 巧妙地搭配这些指针域的指向, 就可以做到, 从跳表上查询元素的时间复杂度是O(logN)
  6. ziplist
    压缩列表, 在列表中元素比较少的时候, 可能会优化成ziplist

object encoding mylist
可以查看底层的编码方式

在这里插入图片描述

四. redis单线程模型

我们知道, 如果多个客户端, 同时对服务器发起请求, 可能会引起线程不安全问题
但是, redis服务器不会发生

redis服务器实际上是单线程模型, 保证了当前收到的多个请求是串行执行的
多个请求同时到达redis服务器, 也是要先在队列中排队, 等待redis服务器一个一个取出里面的命令再执行
微观上讲, redis服务器是串行/顺序执行这么多命令的

总结: redis只使用一个线程, 来处理所有的命令请求, 但不是说redis服务器进程内部真的只有一个线程, 其他也有线程, 多个线程是在处理网络IO

redis之所以能够使用单线程工作, 是因为redis的核心业务逻辑, 都是短平快的, 不太消耗cpu资源, 单线程可以处理
但单线程带来的弊端就是, 必须特别小心, 某个操作占用时间长, 阻塞其他命令执行

redis虽然是单线程模型, 为啥效率那么高, 速度那么快?

  1. redis访问内存, 数据库访问硬盘
  2. redis的核心业务, 比数据库的核心功能更简单(redis干的活少, 提供的功能相比mysql也是少了不少)
  3. 单线程模型, 避免了一些不必要的线程竞争开销
  4. 处理网络IO, 使用了epoll这样的IO多路复用机制

IO多路复用:
概念: 一个线程, 管理多个socket
针对TCP来说, 服务器每次要服务一个客户端, 都需要给客户端安排一个socket
一个服务器多个客户端, 同时就有多个socket
很多情况下, 每个客户端和服务器之间的通信没有那么频繁, 此时, 这么多socket大部分时间是静默的, 上面是没有数据需要传输的
所以, 同一时刻, 只有少数socket活跃, 所以引入IO多路复用, 一个线程处理多个socket

IO多路复用, 是操作系统给程序猿提供的机制, 提供了一套API, 内部的功能都是操作系统内核实现的
Linux上提供了IO多路复用, 主要有三套: select, poll, epoll
epoll 时间通知/回调机制

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

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

相关文章

Dromara WarmFlow工作流动态指定办理人

Dromara WarmFlow工作流动态指定办理人 背景: 审批任务的办理人,通常是在流程设计器中预先设定好办理人,那如果想要在办理过程中指定办理人呢? 那不得不提一下本次的主角,来自Dromara组织的WarmFlow工作流&#xff0…

理解Parquet文件和Arrow格式:从Hugging Face数据集的角度出发

parquet发音:美 [pɑrˈkeɪ] 镶木地板;拼花木地板 理解Parquet文件和Arrow格式:从Hugging Face数据集的角度出发 引言 在机器学习和大数据处理中,数据的存储和传输格式对于性能至关重要。两种广泛使用的格式是 Parquet 和 Arr…

Kylin Server V10 下 Kafka 集群部署

一、ZooKeeper 集群部署 1、主机规划 主机名 IP 地址 myid 10.8.3.35 1 10.8.3.36 2 10.8.3.37 3 2、拓扑结构 3、部署 (1) 下载Zookeeper [root@localhost ~]# cd /usr/local [root@localhost local]# wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-…

【MySql】navicat连接报2013错误

navicat连接mysql报2013错误 报错信息1、检验Mysql数据库是否安装成功2、对Mysql的配置文件进行修改配置2.1、找到配置文件2.2、Linux下修改配置文本 3、连接进入mysql服务4、在mysql下执行授权命令 报错信息 Navicat连接mysql报2013错误 2013-Lost connection to MYSQL serve…

机器学习——决策树模型

决策树是如何工作的? 假设你在经营一家猫收养中心,并提供了一些功能,你想训练一个分类器来快速告诉你,动物到底是不是猫,这里有10个训练例子,并与这10个例子中的每一个相关联,我们将有关于动物…

65页PDF | 企业IT信息化战略规划(限免下载)

一、前言 这份报告是企业IT信息化战略规划,报告详细阐述了企业在面对新兴技术成熟和行业竞争加剧的背景下,如何通过三个阶段的IT战略规划(IT 1.0基础建设、IT 2.0运营效率、IT 3.0持续发展),系统地构建IT管理架构、应…

【C++】—— 从零开始封装 Map 与 Set:实现与优化

人生的态度是,抱最大的希望,尽最大的努力,做最坏的打算。 —— 柏拉图 《理想国》 目录 1、理论基石——深度剖析 BSTree、AVLTree 与 RBTree 的概念区别 2、迭代器机制——RBTree 迭代器的架构与工程实现 3、高级容器设计——Map 与 Set…

番外:HTTP、WebSocket 和 gRPC 协议详解

HTTP、WebSocket 和 gRPC 协议详解 在现代网络编程中,HTTP、WebSocket 和 gRPC 协议是三种常用的通信协议。它们各自有着不同的特点和适用场景。本文将从功能、优缺点、使用场景、工作原理以及发明背景等多个方面深入探讨这三种协议。 HTTP协议 功能 HTTP&#…

单元测试报websocket bean创建失败

在单元测试的基础类上添加注解 使用tomcat容器启动即可 如下图

Samtec 大数据应用科普 | 用于HPC和超级计算的连接器

【摘要/前言】 我们的现代工业世界依赖于原材料。无论是石油、钢铁还是棉花,原材料对工业化世界的发展都具有巨大的重要性。尽管这些有形产品仍然一如既往地重要,但现代社会为我们带来了一种新的原材料,那就是数据。 【数据是未来的原材料】…

C++学习日记---第16天

笔记复习 1.C对象模型 在C中,类内的成员变量和成员函数分开存储 我们知道,C中的成员变量和成员函数均可分为两种,一种是普通的,一种是静态的,对于静态成员变量和静态成员函数,我们知道他们不属于类的对象…

机器学习周志华学习笔记-第14章<概率图模型>

机器学习周志华学习笔记-第14章<概率图模型> 卷王&#xff0c;请看目录 14概率图模型14.1 隐马尔可夫模型(HMM)14.1.1 HMM评估问题14.1.2 HMM解码问题14.1.3 HMM学习问题 14.2 马尔可夫随机场(MRF)14.3 条件随机场(CRF)14.4 学习与推断14.4.1 变量消去14.4.2 信念传播 1…

使用 Apache Commons IO 实现文件读写

在 Java 编程中&#xff0c;文件读写是常见的操作。虽然 Java 标准库提供了基本的文件 I/O 功能&#xff0c;但使用 Apache Commons IO 库可以进一步简化这些操作&#xff0c;提高开发效率。Apache Commons IO 是一个强大的工具库&#xff0c;提供了许多实用的类和方法&#xf…

Linux开发板使用wifi过程

1.buildroot WIFI 工具配置 首先要给文件系统添加一些操作 WIFI 的工具。进入 buildroot 源码目录里&#xff0c;接着运行“make menuconfig”进入图形配置界面&#xff0c;配置如下&#xff1a; → Target packages → Networking applications→ [*] wireless tools //选中…

C# 元组

文章目录 一、元组&#xff08;Tuple&#xff09;概述二、元组的创建方式&#xff08;一&#xff09;使用 Tuple 类&#xff08;旧的方式&#xff0c;C# 7.0 之前常用&#xff09;&#xff08;二&#xff09;使用元组字面量&#xff08;C# 7.0 及之后引入的更便捷方式&#xff…

2024年Java面试八股文大全(附答案版)

很多人会问Java面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。 而且&#xff0c;我国的八股文确…

【数据库系列】Spring Boot如何配置Flyway的回调函数

Flyway 提供了回调机制&#xff0c;使您能够在特定的数据库迁移事件发生时执行自定义逻辑。通过实现 Flyway 的回调接口&#xff0c;可以在迁移前后执行操作&#xff0c;如记录日志、执行额外的 SQL 语句等。 1. 创建自定义回调类 要配置 Flyway 的回调函数&#xff0c;需要创…

Angular v19 (三):增量水合特性详解 - 什么是水合过程?有哪些应用场景?与 Qwik 相比谁更胜一筹?- 哪个技术好我就学哪个,这就是吸心大法吧

Angular在其最新版本 v19 中引入了增量水合&#xff08;Incremental Hydration&#xff09;这一特性。这一更新引发了开发者们广泛的讨论&#xff0c;特别是在优化首屏加载速度和改善用户体验方面。本文将详解水合过程的概念、增量水合的应用场景&#xff0c;以及它与类似框架如…

jmeter如何导出中文版的测试报告?

文章目录 0、初始步骤&#xff1a;把报告模板换成中文形式1、首先添加一份聚合报告2、然后点开【聚合报告】3&#xff0c;生成报告3.1 选择【工具】-【generate HTML report】3.2 【generate HTML report】参数详解3.3 、最后点击 【generate report】直接生成。 声明&#xff…

集团内买卖资产并以注资方式转实收资本

SAP 集团内资产买卖原值、折旧一起入账 合并是个很复杂的东西&#xff0c;我至今不会。 做项目过程中经历的上市公司&#xff0c;一般都要求内部公司间转移的固定资产不能有价格调整&#xff0c;也就是卖出方的账面价值需要等于买入方的账面价值。 当然&#xff0c;集团内也做…