Redis的单线程讲解与指令学习

目录

一.Redis的命令

二.数据类型

三.Redis的key的过期策略如何实现?

四.Redis为什么是单线程的

五.String有关的命令


        

 

Redis的学习专栏:http://t.csdnimg.cn/a8cvV

一.Redis的命令

两个基本命令 

      在Redis当中,有两个基本命令:get和set,顾名思义,获取和设置键值对。

SET命令:

        SET  key   value

GET命令:

        GET   key

注:如果key不存在,则返回一个nil  ;这个表示空值!如果返回的是二进制,启动Redis时,使用 redis  -cil  --raw  ;如此会自动转化

全局命令

        1.KEYS,查询当前服务器上匹配的key,类似MySQL的模糊查找,通过通配符来查找符合条件的key。老规矩:?匹配任意一个字符;*匹配0个字符或者多个字符;[ abcde ]表示只能匹配abcde;[^ a] 表示只有a不能匹配,其他都可以;[a-d]表示匹配a到d之间的字符。

注:这种时间复杂度为O(n);一般禁用key *;原因:redis是一个单线程服务器,执行时间太长会导致Redis服务器阻塞。

keys he[abdo]ll0

通用命令

        exists命令,判断key是否存在,返回key存在的个数!时间复杂度为O(1)

exist key1 key2  //判断是否存在key1和key2

        DEL命令,删除指定的key,可一次删除一个或者多个,时间复杂度为O(1),返回删除的个数

del hello hi

        EXPIRE命令,设置key的过期时间。超出存活时间,自动删除。单位为秒级,时间复杂度为O(1),返回1则是成功,0是失败。

expire hello second

        ttl命令,查询当前key的剩余存活时间,时间复杂度为O(1),返回剩余时间,-1则是没有关联的时间,-2key值不存在

ttl  hello

        TYPE命令,返回的KEY对应的数据类型,Redis所有的key都是String类型,但value却有很多类型。

type key1

字符串命令

        APPEND命令,在字符串键值末尾追加值

APPEND key value

        INCR命令,增加存储在键中的整数值

INCR key

        DECR命令,减少存储在键中的整数值

 DECR key

哈希操作命令   

  1. HSET key field value:在哈希表中设置字段的值。
  2. HGET key field:获取哈希表中指定字段的值。
  3. HDEL key field [field ...]:删除哈希表中一个或多个字段。
  4. HGETALL key:获取哈希表中所有字段和值。

列表操作命令

  1. LPUSH key value [value ...]:将一个或多个值插入到列表头部。
  2. RPUSH key value [value ...]:将一个或多个值插入到列表尾部。
  3. LPOP key / RPOP key:从列表头部或尾部弹出一个值。

集合操作命令

  1. SADD key member [member ...]:向集合添加一个或多个成员。
  2. SMEMBERS key:获取集合中的所有成员。
  3. SREM key member [member ...]:从集合中移除一个或多个成员。

注:这些命令只是 Redis 提供的众多功能之一部分,每个命令都有多种选项和用法,可以根据具体的需求选择合适的命令来操作 Redis 数据库。


二.数据类型

        Redis 支持多种数据类型,每种类型都有其特定的用途和适用场景。

字符串类型

        根据字符串的长度和内容采用不同的内部编码方式,以优化内存使用和操作效率。Redis 中的字符串类型可以使用以下三种内部编码:

  1. int:当字符串可以被解释为整数时,Redis 会使用 int 编码。这种情况下,Redis 会将字符串转换为整数,并使用整数的形式来存储和操作。这种编码方式在节省内存空间和提高读取速度方面有显著优势,特别是对于包含很大整数的情况。

  2. raw:raw 编码直接将字符串以字节数组的形式存储,没有进行进一步的优化。存储较短或者非整数的字符串时使用,保留了字符串原始的字节序列。

  3. embstr:当字符串的长度小于等于 39 字节时,Redis 会使用 embstr 编码。embstr 编码将字符串的长度和内容紧密地存储在一个 Redis 对象中,避免了额外的内存分配和存储开销。这种编码方式适用于长度较小且频繁出现的字符串。

哈希类型

        存储哈希类型(Hash)时,也会根据哈希表的大小和内容采用不同的内部编码方式,以便于内存使用和操作效率的优化。Redis 中的哈希类型可以使用以下两种内部编码之一:

  1. ziplist:当哈希表中包含的键值对数量较少,且每个键和值的大小都较小时,Redis 使用 ziplist 编码。ziplist 是一种紧凑且轻量级的数据结构,将所有的键值对紧凑地存储在一块连续的内存区域中。这种编码方式节省了内存空间,适合于存储少量的小键值对。

  2. hashtable:当哈希表中包含的键值对数量较多,或者键和值的大小较大时,Redis 使用 hashtable 编码。hashtable 编码使用一个哈希表来存储键值对,通过哈希函数将键映射到哈希表的桶中。这种编码方式支持高效的查找、插入和删除操作,适用于大型哈希表和复杂的键值对结构。

列表类型

        存储列表类型(List)时,也会根据列表的大小和内容采用不同的内部编码方式,以优化内存使用和操作效率。Redis 中的列表类型可以使用以下两种内部编码之一:

  1. ziplist:当列表中包含的元素数量较少,且每个元素的大小都较小时,Redis 使用 ziplist 编码。ziplist 是一种紧凑且轻量级的数据结构,将所有的列表元素紧凑地存储在一块连续的内存区域中。这种编码方式节省了内存空间,适合于存储少量的小元素列表。

  2. linkedlist:当列表中包含的元素数量较多,或者元素的大小较大时,Redis 使用 linkedlist 编码。linkedlist 编码使用双向链表来存储列表元素,每个节点除了存储元素值外,还包含指向前一个节点和后一个节点的指针。这种编码方式支持高效的插入、删除和范围操作,适用于大型列表和复杂的元素结构。

注:在Redis3.2开始,引入了新的实现方式代替以上的内部编码,quicklist,兼顾了二者之间的优点。

集合类型

存储集合类型(Set)时,同样会根据集合的大小和内容采用不同的内部编码方式,以优化内存使用和操作效率。Redis 中的集合类型可以使用以下两种内部编码之一:

  1. intset:当集合中的所有元素都是整数,并且元素的数量较少时,Redis 使用 intset 编码。intset 是一种紧凑的数据结构,它将整数元素存储在一个有序的整数数组中。这种编码方式非常节省内存,适合于存储少量的整数元素集合。

  2. hashtable:当集合中包含的元素数量较多,或者元素不是整数时,Redis 使用 hashtable 编码。hashtable 编码使用哈希表来存储集合元素,通过哈希函数将元素映射到哈希表的桶中。这种编码方式支持高效的查找、插入和删除操作,适用于大型集合和复杂的元素结构。

有序类型

        有序集合(Sorted Set,简称 zset)也根据集合的大小和元素的特性选择不同的内部编码方式,以优化内存使用和操作效率。有序集合在 Redis 中可以使用以下两种内部编码之一:

  1. ziplist:与列表类型类似,当有序集合中的成员数量较少且成员的大小较小时,Redis 使用 ziplist 编码。ziplist 将所有成员及其分数紧凑地存储在一块连续的内存区域中。这种编码方式节省了内存空间,适合存储少量的小型有序集合。

  2. skiplist:当有序集合中包含的成员数量较多,或者成员的大小较大时,Redis 使用 skiplist 编码。skiplist 是一种有序的数据结构(跳表),通过多层链表实现,每层链表按照不同步长跳跃,以加快查找操作。这种编码方式支持快速的成员查找、按分数范围获取成员等操作,适用于大型有序集合和复杂的成员结构。

扩展资料:在Redis当中,我们可以查看数据类型的实际编码方式:OBJECT encoding key

三.Redis的key的过期策略如何实现?

        Key有很多,如何判断时间是否过期,需要被删除呢?难道每一次都要遍历key吗?效率方面极低。

Redis整体策略:

  1. 定期删除

    • Redis 默认采用的是定期删除机制。在这种机制下,Redis 每隔一段时间(默认是100ms)会随机检查一批设置了过期时间的 key,并删除其中已经过期的 key。这个过期时间检查是通过 Redis 的 evict (淘汰)算法来完成的。
    • 定期删除机制的优点在于,它可以在 Redis 服务器空闲时(比如在阻塞等待客户端命令的时候)执行,不会影响正常的读写操作。缺点是可能会导致过期的 key 存在一段时间。
  2. 惰性删除

    • 当客户端尝试访问某个 key 时,Redis 会先检查这个 key 是否过期,如果过期了,Redis 就会删除它,并返回 nil 或者空结果给客户端。这种删除策略称为惰性删除,因为它将过期检查和删除操作延迟到客户端访问时执行。
    • 惰性删除保证了只有在需要时才进行删除操作,避免了定期删除可能导致的性能开销和并发问题。但是,它也可能导致过期的 key 在一段时间内仍然存在于内存中。

四.Redis为什么是单线程的

        单线程 Redis 是指 Redis 的主要工作模型,它通过单个主线程来处理所有的客户端请求和操作。不会发生线程安全问题,因为请求是串行执行的。

问:为什么Redis使用单线程呢?

答: 

  1. 减少竞争和复杂性

    • 在多线程环境下,需要考虑线程之间的数据同步、锁竞争等问题,这会增加代码的复杂性和开发难度。
    • Redis 的单线程模型避免了多线程并发控制的复杂性,简化了代码实现和维护。
  2. 避免上下文切换的开销

    • 多线程环境下,频繁的线程切换(上下文切换)会消耗大量的 CPU 时间和资源,尤其是在高并发场景下。
    • 单线程模型减少了这种开销,使得 Redis 能够更有效地利用 CPU 资源来处理请求。
  3. IO 多路复用的高效利用

    • Redis 使用非阻塞的 IO 多路复用机制(如 epoll、kqueue),能够在单线程下处理大量的并发连接和请求。
    • 这种机制使得 Redis 能够保持低延迟和高吞吐量,即使在面对大量并发操作的情况下也能有效处理。
  4. 原子性操作的保证

    • Redis 的大部分操作是原子性的,单线程模型能够确保即使在高并发情况下,操作依然能够保持数据的一致性和可靠性。
    • 操作的原子性对于一个数据存储和缓存系统来说至关重要,特别是在需要保证事务性操作的应用场景下。
  5. 内存操作的高效性

    • Redis 是一个内存数据库和缓存服务器,对内存的读写效率非常重视。
    • 单线程模型可以更有效地利用 CPU 缓存,避免了多线程上下文切换频繁带来的性能损耗,从而提升了内存操作的效率。

Redis选择单线程模型是为了在保证简单性、高性能和高并发能力之间取得平衡。

问:难道单线程就一定那么好吗?

答:错误,Redis在执行当中,若有一个操作占用时间长,会导致阻塞到其他命令的执行!

问:既然是单线程,那么效率为什么这么高?

答:通过对比Mysql,redis访问的是内存,因此数据更快,而且核心功能比MySQL更简单。而且消耗资源少,所以不消耗cpu,速度很快!

还有一个重要的原因:IO多路复用:epoll事件通知

五.String有关的命令

        在Redis当中,所有的Key都是字符串,直接按照二进制数据方式存储。不存在内部编码,存什么,取什么!

SET命令

        SET key  value [ ex key 秒 | PX 毫秒] [ NX | XX ]

其中,NX指:仅在键不存在的情况下设置键的值。如果键已经存在,则 SET 操作将失败,不会对键进行任何操作。

         XX指:仅在键已经存在的情况下设置键的值。如果键不存在,则 SET 操作将失败,不会对键进行任何操作。

可能存在的改变:新的value值会覆盖旧的value值,改变原来的数据类型,原来的ttl,也会失效。

GET命令

        他希望他获取到的value值是字符串类型,所以其他类型会报错。

LRANGE:获取List的值、SMEMBERS获取的是Set类型的值、ZRANGE获取的是有序类型的值、

HGETALL获取的是Hash类型的值


问:如果执行多次的get命令,会发生什么?

答:会涉及到多次的网络传输,因此我们可以选择使用MSET命令,一次执行多个KEY。同理,使用MGET,获取多个KEY值。

SET相关的命令 

SETNX:不存在键值,则设置

SETEX:    设置KEY的同时,设置过期时间  秒   setex   key1  秒  value

Psetex:    设置KEY的同时,设置过期时间,毫秒


运算方面: 

incr  : value值+1             仅支持64位的数值                      例子:Incr  key

incrby:value值 + n                                                           例子:incrby  key  数字

decr : value值 - 1                                                               例子: decr  key

decrby: value值 - n                                                            例子:decrby KEY -8

incrbyfloat  : value  +/-小数                                                例子:incrbyfloat  key  -0.2/0.2

注:时间复杂度全是O(1),key不存在时,value值当作0处理.

拼接,修改/获取 字符串的部分内容,获取字符串长度。

append命令    ----- append key value

        如果可以已经存在,并且是String类型,命令会将value值追加在原有的String后边。如果KEY不存在,则效果等同于SET命令。返回值:长度字节!

getRange命令  ----   getRange  key  start  end

        GETRANGE 是用于获取指定字符串键的子串的命令,闭区间;负数索引表示从字符串末尾开始计算。例如,GETRANGE mykey 0 -1; 则是从下标0开始,截至到最后一个,也就是全部字符串。  如果字符串是汉字呢?截取返回的是什么?就是强制将切割,导致无法出现正常的字符!

setrange命令  ----  setrange  key  offset value

        Redis 中用于修改指定字符串键的子串的命令。Redis 将从指定偏移量开始,用给定的值替换相应位置的内容。如果偏移量超过了原字符串的长度,Redis 会自动扩展字符串,用空字节('\x00')来填充空白部分。

strlen命令 --- STRLEN key

        使用 STRLEN 命令时,Redis 返回指定键的字符串值的长度。对于空字符串或不存在的键名,STRLEN 命令将返回 0

扩展:删除库的所有数据:FLUSHALL命令

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

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

相关文章

企业智能制造赋能的环境条件为什么重要?需要准备什么样的环境?

在全球制造业不断演进的今天,智能制造已经成为推动行业创新和转型的关键力量。它不仅代表了技术的革新,更是企业管理模式和运营思路的全面升级。然而,智能制造的落地实施并非一蹴而就,它需要企业在环境条件上做好充分的准备&#…

Java设计模式的7个设计原则

Java设计模式的7个设计原则是面向对象设计领域中的重要指导方针,它们旨在提高软件系统的可维护性、可扩展性、可复用性和灵活性。以下是这7个设计原则的详细解释: 1. 开闭原则(Open-Closed Principle, OCP) 定义:一个…

tinymce vue拓展多图上传 实现拖拽切换位置,图片排序

实现功能:基于tinymce TinyMCE中文文档中文手册 拖拽图片排序,去掉全部上传按钮,点击保存上传图片并关闭弹窗,优化了一些交互提示 声明:本人不是做vue前端的,可能有些更好的方法实现拖拽或者其他一些开源…

TS 入门(五):TypeScript接口与类

目录 前言回顾高级类型与类型操作1. 接口a. 基本接口b. 可选属性和只读属性c. 函数类型接口d. 可索引类型e. 接口继承 2. 类a. 基本类b. 类的成员(属性和方法)c. 构造函数d. 继承和派生类e. 公有、私有和受保护的修饰符f. 静态属性和方法g. 抽象类 扩展知…

算法篇 滑动窗口 leetcode 长度最小的子数组

长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook,用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应,useState 让函数组件也能拥有…

借助 Aspose.Words,在 C# 中将 Word 转换为 JPG

有时我们需要将 Word 文档转换为图片,因为 DOC 或 DOCX 文件在不同设备上的显示可能会有所不同,但图像(例如 JPG 格式)在任何地方看起来都一样。 Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作…

设计模式-UML类图

1.UML概述 UML-统一建模语言,用来设计软件的可视化建模语言; 1.1 UML分类 静态结构图:类图、对象图、组件图、部署图动态行为图:状态图、活动图、时序图、协作图、构件图等 类图:反应类与类结构之间的关系&#xff0…

非法闯入智能监测摄像机:安全守护的新利器

在当今社会,安全问题愈发受到重视。随着科技的进步,非法闯入智能监测摄像机应运而生,成为保护家庭和财产安全的重要工具。这种摄像机不仅具备监控功能,还集成了智能识别和报警系统,能够在第一时间内检测到潜在的入侵行…

【三维AIGC】扩散模型LDM辅助3D Gaussian重建三维场景

标题:《Sampling 3D Gaussian Scenes in Seconds with Latent Diffusion Models》 来源:Glasgow大学;爱丁堡大学 连接:https://arxiv.org/abs/2406.13099 提示:写完文章后,目录可以自动生成,如何…

Vue3 组件向下通信 祖孙组件的通信 provide与inject

介绍 当父子间通信可以使用props,祖孙使用provide(传递)或inject(接收), 这时不管组件套的多深都可以向下传递。 例子 现在有一个需求,把App.vue的数据传递到MusciPlay.vue里。 App.vue …

Latte: Latent Diffusion Transformer for Video Generation

文章目录 AbstractIntroductionMethodology潜在扩散模型的初步研究Latte的模型变体Latte的实验验证潜在视频片段的patch embeddingTimestep-class information injectionTemporal positional embedding通过学习策略增强视频生成 Experiments Abstract Latte首先从输入的视频提…

150个pb网站模板(都是成品网站,上传php空间即可使用),建站必备

一网友提供的150个pb网站模板,其实就是成品网站,上传php空间即可使用,属于建站公司或者建站开发人员必备的资源。 一共150个基于pb的成品网站,基本上都可以找到适应你手头客户需要的一款,简单修改一下即可交活收钱了。…

python实例练习00001:打开文件输出文件内容

try:file input(enter the file :)with open(file, r) as f:data f.read()print(data) except FileNotFoundError:print(fthe file {file} does not exists:) 打开windows的cmd运行程序,效果如下:

晏子春秋-读书笔记四

景公游于寿春,坐于路寝。公曰:“嗟乎!使我有此国,吾将如之何?”晏子对曰:“此国非君之有也,乃先君之有也。君若欲有之,则修先君之德,以顺民心;若不欲有之&…

使用Jmeter进行接口自动化测试

Jmeter接口自动化 1.接口文档分析接口四要素2.自动化2.1使用用户常量来维护自动化用例2.2使用CSV文件存储常量2.3结果断言法2.4 Json提取器 接口自动化测试的意义也相当于是自动化 测试的意义 减少人为错误:自动化测试可以减少人为因素带来的错误,确保测…

RK3399基础部分

1.RK3399介绍 基础特性: 高达1.8GHz的双核Cortex-A72 四核Cortex-A53高达1.4GHz NPU高达3.0TOPS Mali-T860MP4 GPU 双通道DDR3/DDR3L/LPDDR3/LPDDR4 4K超高清H265/H264/VP9 HDR10/HLG H264编码器 双MIPI CSI和ISP USB Type-CGPU: 图形处理器(英语&…

智汇云舟智慧粮仓解决方案有哪些应用场景和价值?

“粮食”作为人类生活的生命之源,在人们的日常生活中起着决定性的作用。智慧粮仓是运用数字孪生、物联网、商业智能、云计算等技术,精确采集粮食存储过程中的所有信息,并整合到一个统一的信息管理平台上,同时粮库信息管理平台对所…

jmeter持续学习之---控制器

IF控制器 下面这种写法jmeter不推荐有性能的问题 jmeter推荐勾选上的这种写法 使用"Interpret Condition as Variable Expression"工具的性能要好一些 循环控制器 ForEach控制器 与用户定义的变量或者正则表达式提取器配合使用,循环读取。用户定义的变量或者正则…

状态管理的艺术:探索Flutter的Provider库

状态管理的艺术:探索Flutter的Provider库 前言 上一篇文章中,我们详细介绍了 Flutter 应用中的状态管理,以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式:Provider。 Provider优缺点 基…