【Redis 系列】深入理解Redis核心特性:全局命令、内部编码与单线程架构

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

前言

相信各位已经配置好了Redis所需的环境。若尚未完成,建议查阅相关资料自行搭建,这对程序员而言是必备技能。后续内容都需要Redis环境支持。

redis-cli客户端redis服务器主要通过redis命令进行交互。虽然常用命令通过日常练习可以熟记,但大多数命令仍需查阅文档。掌握文档阅读能力是必不可少的技能 。这篇博客只是总结了部分常用命令,为了查询时更加快捷。大部分命令推荐去官方文档处查看。文档连接

全局命令

Redis 支持很多种数据结构,但它们都是键值对方式存储的值。
全局命令就是能够搭配任何一个数据结构来使用的命令

整体上,Redis是键值对结构,key是固定字符串,value实际上会有很多种类型,这些类型就是各种数据结构。

KEYS

作用:查询当前服务器上通过一些特殊符号(通配符)来描述key的模样,匹配符合pattern的key

powershell 复制代码
 keys pattern(样式)

返回值:返回匹配pattern的所有key

keys命令的时间复杂度是O(N),尤其是 keys *查询redis中所有的key,生产环境中很可能会因为执行时间长而阻塞。必须慎用(我们学习阶段无所谓)。

EXISTS

作用:判断某个key是否存在

powershell 复制代码
exists key [key...]

返回值:返回key存在的个数

我们知道redis支持value可以是一些复杂的数据结构,redis自身这些键值对是通过哈希表的方式来组织的 ,所以exists时间复杂度是O(1);

而value又可以是一些数据结构,相当于套了一层,把value当作一个键值对。同时,redis也是一个C\S结构的程序,如果一个命令就要进行一次网络通信,效率太低; 所以redis很多命令都是支持一次就能操作多个key进行多种操作,减少了网络通信次数,就提高了效率。

DEL

作用:删除指定的key

powershell 复制代码
DEL key [key ...]

返回值:返回删掉key的个数

EXPIRE(添加过期时间)

作用:为指定的key添加秒级的过期时间,key存活时间超出这个值,就自动删除

powershell 复制代码
expire key seconds
pexpire key mseconds(毫秒级)

返回值:1表示设置成功;0表示设置失败

TTL(获取key的过期时间,秒级)

作用:获取指定key的过期时间,秒级

powershell 复制代码
ttl key
pttl key(毫秒级)

返回值:剩余过期时间;-1表示没有关联过期时间;-2表示key不存在

过期策略

redis中可能存在很多key,key可能有很大一部分有过期时间,那么redis服务器是怎么知道key已经过期要被删除?

最简单的方法就是直接遍历所有key,但是很明显,效率很低。redis采用的策略是

  • 定期删除:每次抽取一部分,进行验证过期时间
  • 惰性删除:某个key已经过期,但是服务器还不知道,某次访问到这个key,于是这次访问使服务器删除key,同时返回一个nil

当然,仅仅依靠上述策略效果一般,redis还提供了一系列的内存淘汰策略。

TYPE(数据类型)

作用:查看key对应的数据类型

powershell 复制代码
type key

返回值:none,string,list,set , zset , hash ,stream

redis所有的key都是string,但是key对应的value存在很多类型。而且上述类型操作方式差别很大,使用的命令完全不同。

以上都是redis通用命令,为后面5种数据结构做准备,后续会围绕每一个数据结构来介绍相关命令。

内部编码

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

redis底层在实现上述数据结构时,为了节省时间\空间,针对每种数据结构都有⾃⼰的底层内部编码实现,⽽且是多种实现,这样Redis会在合适的场景选择合适的内部编码

类似于:商家宣传牛肉饼吃起来和牛肉一样,但是它真的是牛肉吗,可能根据市场价格,会是猪肉饼、鸭肉饼。。。

数据结构 内部编码
string raw
string int
string embstr
hash hashtable
hash ziplist
list linkedlist
list ziplist
set hashtable
set intset
zset skiplist
zset ziplist

可以看到每种数据结构都有⾄少两种以上的内部编码实现,我们通过object encoding命令查询内部编码


数据结构:redis承诺给使用者的,理解为数据类型
编码方式:redis内部底层的实现

同一个数据类型,背后的编码方式也可能不同,根据特定场景选择特定编码方式,程序员感知不到。和接口一个道理,你只要用就行,不需要关注接口内部的实现方式。

单线程架构

redis只使用一个线程处理所有的命令请求,并不是redis服务器内只有一个线程,上篇博客讲到Redis 6.0已经引入了多线程。只是更多时候多个线程在处理网络IO.

当前有三个客户端发起请求,那么服务器这边会不会出现线程安全问题?

因为redis是单线程模型,保证了受到多个请求是串行执行的。同时因为redis执行的大多是短平快任务,不会消耗太多资源。

redis作为单线程,为什么效率高

前提参照物是数据库。

  • redis访问内存,而数据库访问硬盘
  • redis 核心功能比数据库简单
  • 单线程模型,避免线程竞争
  • 处理网络IO,使用epoll实现的IO多路复用机制:一个线程处理多个socket,不在网络通信时间上浪费时间。

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
枫叶丹41 小时前
【Qt开发】Qt窗口(三) -> QStatusBar状态栏
c语言·开发语言·数据库·c++·qt·microsoft
r***l7661 小时前
sql中COALESCE函数详解
数据库·sql
小熊officer1 小时前
pgsql创建用户
数据库
czc1311 小时前
4K QPS 博客社区:CCBlog 全栈开源,Springboot项目实战,Docker一键部署
spring boot·redis·docker·开源·vue·rabbitmq
Skrrapper1 小时前
【编程史】微软的起家之路:一代传奇的诞生
数据库·c++·microsoft
q***31141 小时前
【JAVA进阶篇教学】第十二篇:Java中ReentrantReadWriteLock锁讲解
java·数据库·python
y***n6141 小时前
Redis设置密码
数据库·redis·缓存
瀚高PG实验室2 小时前
HGDB兼容性之oracle的rowid
数据库·oracle·瀚高数据库
晨晖22 小时前
MyBatisPlus的条件构造器
java·数据库·windows