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
哈希操作命令
- HSET key field value:在哈希表中设置字段的值。
- HGET key field:获取哈希表中指定字段的值。
- HDEL key field [field ...]:删除哈希表中一个或多个字段。
- HGETALL key:获取哈希表中所有字段和值。
列表操作命令
- LPUSH key value [value ...]:将一个或多个值插入到列表头部。
- RPUSH key value [value ...]:将一个或多个值插入到列表尾部。
- LPOP key / RPOP key:从列表头部或尾部弹出一个值。
集合操作命令
- SADD key member [member ...]:向集合添加一个或多个成员。
- SMEMBERS key:获取集合中的所有成员。
- SREM key member [member ...]:从集合中移除一个或多个成员。
注:这些命令只是 Redis 提供的众多功能之一部分,每个命令都有多种选项和用法,可以根据具体的需求选择合适的命令来操作 Redis 数据库。
二.数据类型
Redis 支持多种数据类型,每种类型都有其特定的用途和适用场景。
字符串类型
根据字符串的长度和内容采用不同的内部编码方式,以优化内存使用和操作效率。Redis 中的字符串类型可以使用以下三种内部编码:
-
int:当字符串可以被解释为整数时,Redis 会使用 int 编码。这种情况下,Redis 会将字符串转换为整数,并使用整数的形式来存储和操作。这种编码方式在节省内存空间和提高读取速度方面有显著优势,特别是对于包含很大整数的情况。
-
raw:raw 编码直接将字符串以字节数组的形式存储,没有进行进一步的优化。存储较短或者非整数的字符串时使用,保留了字符串原始的字节序列。
-
embstr:当字符串的长度小于等于 39 字节时,Redis 会使用 embstr 编码。embstr 编码将字符串的长度和内容紧密地存储在一个 Redis 对象中,避免了额外的内存分配和存储开销。这种编码方式适用于长度较小且频繁出现的字符串。
哈希类型
存储哈希类型(Hash)时,也会根据哈希表的大小和内容采用不同的内部编码方式,以便于内存使用和操作效率的优化。Redis 中的哈希类型可以使用以下两种内部编码之一:
-
ziplist:当哈希表中包含的键值对数量较少,且每个键和值的大小都较小时,Redis 使用 ziplist 编码。ziplist 是一种紧凑且轻量级的数据结构,将所有的键值对紧凑地存储在一块连续的内存区域中。这种编码方式节省了内存空间,适合于存储少量的小键值对。
-
hashtable:当哈希表中包含的键值对数量较多,或者键和值的大小较大时,Redis 使用 hashtable 编码。hashtable 编码使用一个哈希表来存储键值对,通过哈希函数将键映射到哈希表的桶中。这种编码方式支持高效的查找、插入和删除操作,适用于大型哈希表和复杂的键值对结构。
列表类型
存储列表类型(List)时,也会根据列表的大小和内容采用不同的内部编码方式,以优化内存使用和操作效率。Redis 中的列表类型可以使用以下两种内部编码之一:
-
ziplist:当列表中包含的元素数量较少,且每个元素的大小都较小时,Redis 使用 ziplist 编码。ziplist 是一种紧凑且轻量级的数据结构,将所有的列表元素紧凑地存储在一块连续的内存区域中。这种编码方式节省了内存空间,适合于存储少量的小元素列表。
-
linkedlist:当列表中包含的元素数量较多,或者元素的大小较大时,Redis 使用 linkedlist 编码。linkedlist 编码使用双向链表来存储列表元素,每个节点除了存储元素值外,还包含指向前一个节点和后一个节点的指针。这种编码方式支持高效的插入、删除和范围操作,适用于大型列表和复杂的元素结构。
注:在Redis3.2开始,引入了新的实现方式代替以上的内部编码,quicklist,兼顾了二者之间的优点。
集合类型
存储集合类型(Set)时,同样会根据集合的大小和内容采用不同的内部编码方式,以优化内存使用和操作效率。Redis 中的集合类型可以使用以下两种内部编码之一:
-
intset:当集合中的所有元素都是整数,并且元素的数量较少时,Redis 使用 intset 编码。intset 是一种紧凑的数据结构,它将整数元素存储在一个有序的整数数组中。这种编码方式非常节省内存,适合于存储少量的整数元素集合。
-
hashtable:当集合中包含的元素数量较多,或者元素不是整数时,Redis 使用 hashtable 编码。hashtable 编码使用哈希表来存储集合元素,通过哈希函数将元素映射到哈希表的桶中。这种编码方式支持高效的查找、插入和删除操作,适用于大型集合和复杂的元素结构。
有序类型
有序集合(Sorted Set,简称 zset)也根据集合的大小和元素的特性选择不同的内部编码方式,以优化内存使用和操作效率。有序集合在 Redis 中可以使用以下两种内部编码之一:
-
ziplist:与列表类型类似,当有序集合中的成员数量较少且成员的大小较小时,Redis 使用 ziplist 编码。ziplist 将所有成员及其分数紧凑地存储在一块连续的内存区域中。这种编码方式节省了内存空间,适合存储少量的小型有序集合。
-
skiplist:当有序集合中包含的成员数量较多,或者成员的大小较大时,Redis 使用 skiplist 编码。skiplist 是一种有序的数据结构(跳表),通过多层链表实现,每层链表按照不同步长跳跃,以加快查找操作。这种编码方式支持快速的成员查找、按分数范围获取成员等操作,适用于大型有序集合和复杂的成员结构。
扩展资料:在Redis当中,我们可以查看数据类型的实际编码方式:OBJECT encoding key
三.Redis的key的过期策略如何实现?
Key有很多,如何判断时间是否过期,需要被删除呢?难道每一次都要遍历key吗?效率方面极低。
Redis整体策略:
-
定期删除:
- Redis 默认采用的是定期删除机制。在这种机制下,Redis 每隔一段时间(默认是100ms)会随机检查一批设置了过期时间的 key,并删除其中已经过期的 key。这个过期时间检查是通过 Redis 的
evict(淘汰)算法来完成的。 - 定期删除机制的优点在于,它可以在 Redis 服务器空闲时(比如在阻塞等待客户端命令的时候)执行,不会影响正常的读写操作。缺点是可能会导致过期的 key 存在一段时间。
- Redis 默认采用的是定期删除机制。在这种机制下,Redis 每隔一段时间(默认是100ms)会随机检查一批设置了过期时间的 key,并删除其中已经过期的 key。这个过期时间检查是通过 Redis 的
-
惰性删除:
- 当客户端尝试访问某个 key 时,Redis 会先检查这个 key 是否过期,如果过期了,Redis 就会删除它,并返回
nil或者空结果给客户端。这种删除策略称为惰性删除,因为它将过期检查和删除操作延迟到客户端访问时执行。 - 惰性删除保证了只有在需要时才进行删除操作,避免了定期删除可能导致的性能开销和并发问题。但是,它也可能导致过期的 key 在一段时间内仍然存在于内存中。
- 当客户端尝试访问某个 key 时,Redis 会先检查这个 key 是否过期,如果过期了,Redis 就会删除它,并返回
四.Redis为什么是单线程的
单线程 Redis 是指 Redis 的主要工作模型,它通过单个主线程来处理所有的客户端请求和操作。不会发生线程安全问题,因为请求是串行执行的。
问:为什么Redis使用单线程呢?
答:
-
减少竞争和复杂性:
- 在多线程环境下,需要考虑线程之间的数据同步、锁竞争等问题,这会增加代码的复杂性和开发难度。
- Redis 的单线程模型避免了多线程并发控制的复杂性,简化了代码实现和维护。
-
避免上下文切换的开销:
- 多线程环境下,频繁的线程切换(上下文切换)会消耗大量的 CPU 时间和资源,尤其是在高并发场景下。
- 单线程模型减少了这种开销,使得 Redis 能够更有效地利用 CPU 资源来处理请求。
-
IO 多路复用的高效利用:
- Redis 使用非阻塞的 IO 多路复用机制(如 epoll、kqueue),能够在单线程下处理大量的并发连接和请求。
- 这种机制使得 Redis 能够保持低延迟和高吞吐量,即使在面对大量并发操作的情况下也能有效处理。
-
原子性操作的保证:
- Redis 的大部分操作是原子性的,单线程模型能够确保即使在高并发情况下,操作依然能够保持数据的一致性和可靠性。
- 操作的原子性对于一个数据存储和缓存系统来说至关重要,特别是在需要保证事务性操作的应用场景下。
-
内存操作的高效性:
- 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命令
相关文章:
Redis的单线程讲解与指令学习
目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现? 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏:http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中,有两个基本命令࿱…...
为什么MySQL会选择B+树作为索引
为什么MySQL会选择B树作为索引 在数据库管理系统中,索引是提升查询效率的关键技术之一。MySQL作为广泛使用的关系型数据库管理系统,其核心存储引擎InnoDB选择B树作为其索引结构,这一选择背后蕴含了深刻的性能和存储效率考量。本文将简要介绍…...
k8s secret-从环境变量里去读和从yaml文件里读取secret有什么区别?
从环境变量和YAML文件中读取Kubernetes Secret的区别主要体现在使用方式、动态更新能力以及管理便捷性上。以下是详细的区别说明: 1. **使用方式**: - **环境变量方式**:Kubernetes允许将Secret作为环境变量注入到Pod的容器中。这种方式的好处…...
Springboot+Aop用注解实现阿里云短信验证码校验,校验通过自动删除验证码缓存
1.新建操作类型枚举(这里的IEnum是我自定义的http请求拦截接口,不需要的话可以不用实现) Getter AllArgsConstructor public enum OperationType implements IEnum<Integer> {/*** 注册*/SIGN_UP(0),/*** 密码登录*/LOGIN_BY_PWD(1),/…...
无线物联网新时代,RFID拣货标签跟随潮流
拣选技术的演变历程,本质上是从人力操作向自动化、智能化转型的持续进程。近期,“货寻人”技术成为众多企业热烈追捧的对象,它可以根据企业的特定需求,从众多拣选方案中选出最优解。那么,在采用“货到人”拣选技术时&a…...
Java8 根据List实体中一个字段去重取最大值,并且根据该字段进行排序
1、前言 某个功能要求需要对一个list对象里数据按照股票分组,并且取分组涨跌幅最大的,返回一个新的list对象,并且按照涨跌幅字段进行排序,这么一连串的要求,如果按照传统的写法,我们需要写一大坨的代码&am…...
微服务经纬:Eureka驱动的分布式服务网格配置全解
微服务经纬:Eureka驱动的分布式服务网格配置全解 在微服务架构的宏伟蓝图中,服务网格(Service Mesh)作为微服务间通信的独立层,承担着流量管理、服务发现、故障恢复等关键任务。Eureka,Netflix开源的服务发…...
关于前端数据库可视化库的选择,vue3+antd+g2plot录课计划
之前:antdv 现在:g2plot https://g2plot.antv.antgroup.com/manual/introduction 录课内容:快速入门 图表示例: 选择使用比较广泛的示例类型,录课顺序如下: 1、折线图2、面积图3、柱形图4、条形图5、饼…...
linux进行redis的安装并使用RDB进行数据迁移
现在有两台电脑,分别是A,B,现在我要把A电脑上的redis的数据迁移到B电脑上,B电脑上是没有安装redis的 1.找到A电脑的redis的版本 1.先启动A电脑的redis,一般来说,都是直接在linux的控制台输入:re…...
深入理解Scikit-learn:决策树与随机森林算法详解
用sklearn实现决策树与随机森林 1. 简介 决策树和随机森林是机器学习中的两种强大算法。决策树通过学习数据特征与标签之间的规则来进行预测,而随机森林则是由多棵决策树组成的集成算法,能有效提高模型的稳定性和准确性。 2. 安装sklearn 首先&#…...
AutoHotKey自动热键(十一)下载SciTE4AutoHotkey-Plus的中文增强版脚本编辑器
关于AutoHotkey的专用编辑器, SciTE4AutoHotkey是一个免费的基于 SciTE 的 AutoHotkey 脚本编辑器,除了 DBGp 支持, 它还为 AutoHotkey 提供了语法高亮, 调用提示, 参数信息和自动完成, 以及其他拥有的编辑特性和辅助工具.XDebugClient 是一个基于 .NET Framework 2.0 的简单开…...
Halcon与C++之间的数据转换
HALCON的HTuple类型(元组)功能很强大,可以表示INT、double、string等多种类型数据。当元组中只有一个成员时,HTuple也可表示原子类型 1. haclon -> C //HTuple转int HTuple hTuple 1; int data1 hTuple[0].I(); // data1 1//HTuple转do…...
MybatisPlus 一些技巧
查询简化 SimpleQuery 有工具类 com.baomidou.mybatisplus.extension.toolkit.SimpleQuery 对 selectList 查询后的结果进行了封装,使其可以通过 Stream 流的方式进行处理,从而简化了 API 的调用。 方法 list() 支持对一个列表提取某个字段ÿ…...
定制化服务发现:Eureka中服务实例偏好的高级配置
定制化服务发现:Eureka中服务实例偏好的高级配置 在微服务架构中,服务实例的智能管理和优化是保证系统高效运行的关键。Eureka作为Netflix开源的服务注册与发现框架,提供了丰富的配置选项来满足不同场景下的需求。服务实例偏好配置允许开发者…...
【实战场景】MongoDB迁移的那些事
【实战场景】MongoDB迁移的那些事 开篇词:干货篇【MongoDB迁移的方法】:1. 基于mongodump和mongorestore的迁移一、迁移前准备二、使用mongodump备份数据三、使用mongorestore还原数据四、注意事项 2. 基于MongoDB复制集的迁移一、迁移前准备二、配置新复…...
为什么要使用加密软件?
一、保护数据安全:加密软件通过复杂的加密算法对敏感数据进行加密处理,使得未经授权的人员即使获取了加密数据,也无法轻易解密和获取其中的内容。这极大地提高了数据在存储、传输和使用过程中的安全性。 二、遵守法律法规:在许多国…...
k8s学习笔记——dashboard安装
重装了k8s集群后,重新安装k8s的仪表板,发现与以前安装不一样的地方。主要是镜像下载的问题,由于网络安全以及国外网站封锁的原因,现在很多镜像按照官方提供的仓库地址都下拉不下来,导致安装失败。我查了好几天…...
AI艺术创作:掌握Midjourney和DALL-E的技巧与策略
AI艺术创作:掌握Midjourney和DALL-E的技巧与策略 AI艺术创作正逐渐成为艺术家和创意工作者们探索新表达方式的重要工具。Midjourney和DALL-E是两款领先的AI绘画工具,它们各有独特的功能和优势。本文将详细介绍如何掌握这两款工具的使用技巧,…...
在Mac上免费恢复误删除的Word文档
Microsoft Word for Mac是一个有用的文字处理应用程序,它与Microsoft Office套件捆绑在一起。该软件的稳定版本包括 Word 2019、2016、2011 等。 Word for Mac 与 Apple Pages 兼容;这允许在不同的操作系统版本中使用Word文档,而不会遇到任何麻烦。 与…...
HarmonyOS 屏幕适配设计
1. armonyOS 屏幕适配设计 1.1. 像素单位 (1)px (Pixels) px代表屏幕上的像素点,是手机屏幕分辨率的单位,即屏幕物理像素单位。 (2)vp (Viewport Percentage) vp是视口百分比单位,基于…...
obsidian-skills培训管理:培训用户使用技能的方法
obsidian-skills培训管理:培训用户使用技能的方法 【免费下载链接】obsidian-skills Agent skills for Obsidian. Teach your agent to use Markdown, Bases, JSON Canvas, and use the CLI. 项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-skills …...
应急响应靶机练习-Web2
一、靶机介绍这个靶机主要是通过暴力破解ftp,获取ftp账号后上传了php shell,获取shell后创建后门用户,以及做了一些端口转发操作。靶机采用phpstudy,开启了ftp和web服务,但是要注意的是,一旦ftp开启&#x…...
WebGL/Three.js性能优化实战:你的3D模型为什么卡?从理解栅格化与渲染管线开始
WebGL/Three.js性能优化实战:从栅格化原理到渲染管线调优 当你用Three.js加载一个精致的3D模型时,是否遇到过页面突然卡顿、风扇狂转的情况?这背后往往与浏览器如何将矢量图形转换为屏幕像素的过程密切相关。今天我们就从栅格化的底层原理出发…...
MCP4151数字电位器Arduino驱动与三线SPI时序详解
1. MCP4151 数字电位器 Arduino 库深度技术解析1.1 器件本质与工程定位MCP4151 是 Microchip 推出的单通道、10kΩ 标称阻值、257 抽头(0–256)非易失性数字电位器。其核心价值不在于替代模拟电位器进行手动调节,而在于为嵌入式系统提供可编程…...
编程中输入特殊字符的通用方法
编程里的特殊字符(比如 # $ % ^ & * / \ < > " 等)分两种场景:直接键盘输入(写代码最常用)、代码里输出 / 转义(程序运行时显示),我给你整理了最简单、全覆盖的用法…...
OpenClaw v2026.3.31 深度解读:为什么这次更新不是“小修小补”,而是一次明显的安全收口与后台任务体系成形
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
别再自己造轮子了!用InsightFace+FastAPI快速搭建一个高精度人脸识别Web服务
基于InsightFace的高精度人脸识别Web服务实战指南 1. 为什么选择InsightFace构建人脸识别服务 三年前我接手一个考勤系统项目时,曾花费两个月时间从零训练FaceNet模型,结果上线后遇到戴眼镜员工识别率骤降的问题。直到发现InsightFace这个开源项目&#…...
2025届必备的十大降重复率助手实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对维普系统有的AI检测机制,要是想降低生成文本的机器特征,那就得从…...
在大数据求职的路上,你不是一个人在战斗。
大家好,我是专注大数据面试就业的陪跑师。我见过太多优秀的同学,因为表达不自信或项目包装不到位,与心仪的 Offer 失之交臂,真的很可惜。为了回馈大家,我决定每周抽出 2 小时做 【公益模拟面试】。 不管你是࿱…...
P1113 杂务【洛谷算法习题】
P1113 杂务 网页链接 P1113 杂务 题目描述 John 的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完…...
