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.mzph.cn/bicheng/46558.shtml

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

相关文章

记录些MySQL题集(3)

MySQL 分区技术深入解析 分区的基本概念 MySQL分区 是一种数据库优化的技术,它允许将一个大的表、索引或其子集分割成多个较小的、更易于管理的片段,这些片段称为“分区”。每个分区都可以独立于其他分区进行存储、备份、索引和其他操作。这种技术主要…

Docker初识及使用研究

公司使用docker,小组成员人人都是默默使用,也没讲解培训,真是搞笑。 记录自己独自研究及使用: 1)自己安装->失败-系统弄崩->安装成功 目录 1. Docker安装-初次安装失败2. Docker安装-初次安装成功 1. Docker安装-初次安装失…

微信小程序密码 显示隐藏 真机兼容问题

之前使用type来控制&#xff0c;发现不行&#xff0c;修改为password属性即可 <van-fieldright-icon"{{passwordType password? closed-eye:eye-o}}"model:value"{{ password }}"password"{{passwordType password ? true: false}}"borde…

PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题&#xff1f;一、了解长事务阻塞的原因&…

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…

思迈特软件2023H2商业智能和分析软件市场份额增长速度跃居第一

近日&#xff0c;全球知名的IT市场研究与咨询公司IDC发布了《中国商业智能和分析软件市场跟踪报告&#xff0c;2023H2》。根据报告显示&#xff0c;思迈特软件在中国商业智能和分析软件市场份额中位列前五&#xff0c;在中国BI厂商中排名TOP2。 尤其值得一提的是&#xff0c;思…

【数据结构】Splay详解

Splay 引入 Splay旋转操作splay操作插入操作查询x排名查询排名为x删除操作查询前驱/后继模板Splay时间复杂度分析 进阶操作截取区间区间加&#xff0c;区间赋值&#xff0c;区间查询&#xff0c;区间最值区间翻转原序列整体插入指定位置插入整体插入末尾区间最大子段和 一些好题…

C++客户端Qt开发——常用控件(按钮类控件)

2.按钮类控件 ①QPushButton 按钮 继承自QAbstractButton&#xff0c;这个类是⼀个抽象类&#xff0c;是其他按钮的父类 属性 说明 text 按钮中的文本 icon 按钮中的图标 iconSize 按钮中图标的尺寸 shortCut 按钮对应的快捷键 autoRepeat 按钮是否会触发&#xff…

AMD software 将两个显示器合并为一个超宽显示器

最近玩游戏的时候&#xff0c;发现了一个骚操作。 可以将两个显示器&#xff08;更多个的自己去试&#xff0c;不知道&#xff09;组合为一个显示器&#xff0c;注意&#xff0c;这里说的不是将两个显示都连接电脑从而使用双屏显示器&#xff0c; 而是 将两个显示器组合为一个…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型案例

在水利、环境、生态、机械以及航天等领域中&#xff0c;数学模型已经成为一种常用的技术手段。同时&#xff0c;为了提高模型的性能&#xff0c;减小模型误用带来的风险&#xff1b;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

微信小游戏 彩色试管 倒水游戏 逻辑 (二)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义一个 Water class 1. **定义接口和枚举**&#xff1a; - WaterInfo 接口定义了水的颜色、高度等信息。 - PourAction 枚举定义了水的倒动状态&#xff0c;…

C双指针元素去重

需求 在尾部插⼊、删除元素是⽐较⾼效的&#xff0c;时间复杂度 是 O(1)&#xff0c;但是如果在中间或者开头插⼊、删除元素&#xff0c;就会涉及数据的搬移&#xff0c;时间复杂度为 O(N)&#xff0c;效率较低。 代码 #include <stdio.h>// 相邻元素去重 int remove…

01 电场强度通量 高斯定理

电场强度通量 高斯定理 5-4 电场强度通量 高斯定理一.电场线二.电场强度通量三.高斯定理四高斯定理应用举例典型电场的电场线分布图形正点电荷与负点电荷的电场线一对等量正点电荷的电场线一对等量异号点电荷的电场线一对不等量异号点电荷的电场线带电平行板电容器的电场线 5-4…

CompletableFuture介绍与实战

CompletableFuture 介绍与实战 一、前言 ​ 日常工作中&#xff0c;大多数情况下我们的接口的执行逻辑都是串行化的&#xff0c;串行化的逻辑也基本能满足我们绝大部分的场景。但是&#xff0c;在一些情况下我们的代码可能会存在一些比较耗时的操作&#xff0c;串行的逻辑就有…

金蝶云星空与金蝶云星空对接集成付款单查询打通[标准][付款单新增]-v1

金蝶云星空与金蝶云星空对接集成付款单查询打通[标准][付款单新增]-v1 对接源平台:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用…

Gstreamer学习3.1------使用appsrc灌颜色信号数据

这个视频内容讲解的离散余弦变换&#xff0c;讲的很好&#xff0c; 离散余弦变换可视化讲解_哔哩哔哩_bilibili 其中讲到&#xff0c;把颜色变化转换为曲线的处理&#xff0c; 在前面的学习中&#xff0c;我们知道了可以向appsrc来灌数据来进行显示 Gstreamer学习3----灌数据…

yolo格式数据集之野生动物类4种数据集已划分好|可以直接使用|yolov5|v6|v7|v8|v9|v10通用

本数据为野生动物类检测数据集&#xff0c;数据集数量如下&#xff1a; 总共有:1504张 训练集&#xff1a;1203张 验证集&#xff1a;150张 类别数量&#xff1a;4 测试集&#xff1a;151 类别名&#xff1a; [‘buffalo’, ‘elephant’, ‘rhino’, ‘zebra’] 占用空间&…

自动驾驶-端到端分割任务

上采样 bed of nails interpolation transposed convolutions 1. 上采样 (Upsampling) 上采样是一种技术&#xff0c;用于增加数据集中的样本数量或是提高信号的分辨率。在图像处理中&#xff0c;上采样通常指的是增加图像的像素数量&#xff0c;从而使图像变得更大。这可…

如何用STM32实现modbus-RTU?

Modbus RTU是一种广泛应用于工业自动化领域的通信协议,基于主从架构,通过串行通信进行数据传输。本文将详细介绍Modbus RTU协议的基本原理,并提供在STM32微控制器上实现Modbus RTU通信的完整代码示例。 1. Modbus RTU协议概述 Modbus RTU的定义和特点 Modbus RTU(Remote Te…

哥德巴赫猜想c++

方法一 #include<bits/stdc.h> using namespace std; //定义函数&#xff0c;判断素数 bool sushu(int n){bool rtrue;//先假设是素数&#xff0c;即真//循环因子范围&#xff0c;找到一个因子就不是素数for(int i2;i<sqrt(n);i){//判断2~n的根号是否素数if(n%i0){//…