
🚀 欢迎来到我的优快云博客: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
keys pattern(样式)
返回值:返回匹配pattern的所有key

keys命令的时间复杂度是O(N),尤其是 keys *查询redis中所有的key,生产环境中很可能会因为执行时间长而阻塞。必须慎用(我们学习阶段无所谓)。
EXISTS
作用:判断某个key是否存在
exists key [key...]
返回值:返回key存在的个数

我们知道redis支持value可以是一些复杂的数据结构,redis自身这些键值对是通过哈希表的方式来组织的,所以exists时间复杂度是O(1);
而value又可以是一些数据结构,相当于套了一层,把value当作一个键值对。同时,redis也是一个C\S结构的程序,如果一个命令就要进行一次网络通信,效率太低; 所以redis很多命令都是支持一次就能操作多个key进行多种操作,减少了网络通信次数,就提高了效率。
DEL
作用:删除指定的key
DEL key [key ...]
返回值:返回删掉key的个数

EXPIRE(添加过期时间)
作用:为指定的key添加秒级的过期时间,key存活时间超出这个值,就自动删除
expire key seconds
pexpire key mseconds(毫秒级)
返回值:1表示设置成功;0表示设置失败

TTL(获取key的过期时间,秒级)
作用:获取指定key的过期时间,秒级
ttl key
pttl key(毫秒级)
返回值:剩余过期时间;-1表示没有关联过期时间;-2表示key不存在

过期策略
redis中可能存在很多key,key可能有很大一部分有过期时间,那么redis服务器是怎么知道key已经过期要被删除?
最简单的方法就是直接遍历所有key,但是很明显,效率很低。redis采用的策略是
- 定期删除:每次抽取一部分,进行验证过期时间
- 惰性删除:某个key已经过期,但是服务器还不知道,某次访问到这个key,于是这次访问使服务器删除key,同时返回一个nil
当然,仅仅依靠上述策略效果一般,redis还提供了一系列的内存淘汰策略。
TYPE(数据类型)
作用:查看key对应的数据类型
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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中……
悄悄说:点击主页有更多精彩内容哦~ 😊

173万+

被折叠的 条评论
为什么被折叠?



