前言:
在《Redis 第二讲》中,我们完成了 Redis 的安装与环境配置,为实际操作奠定了基础。本讲将正式进入 Redis 的核心领域——指令操作。我们将从最基础的键值操作开始,逐步掌握数据读写、键管理及生产环境注意事项,为后续深入学习打下坚实根基。
一、学会使用文档
这是我们学习Redis的第一步,我们想作为一个合格的程序员必须要学会阅读文档。
通过redis-cli客户端和 redis 服务器交互.
redis 的命令非常非常多!!
任何一个工具软件,去找相关资料,一定是官方网站!!!
1. 掌握常用命令(多操作多练习)
2. 学会使用redis 的文档
虽然redis这种知名软件,都是有中文文档的.
但是还是建议大家看英文的,
(英语这一关,必须要过,也一定能过!!》
后面工作中可能会用到一些不太知名的软件/库,很可能没有中文文档.但是一定有英文官方文档。
对于如何阅读文档,主要是阅读官方网站,这里就不再重复了。
-
官方文档(详细命令、配置指南)→ Docs
-
下载 Redis(源码、稳定版、开发版)→ Downloads - Redis
-
Redis 博客(最新动态、技术文章)→ Redis Blog - Read about what’s happening at Redis
-
Redis 命令参考 → Commands | Docs
下面我们就介绍一下,我们在Redis当中会遇到的几个高频全局命令,有的小伙伴可能会问,什么是全局命令呢?
我们下面来解释一下,首先我们知道Redis是一个键值对的数据库,简单来说就是“key-value”,但是在Redis这里不想我们之前在语言阶段学习的键值对,Redis的vaule是各种数据结构,而不是数据类型,所以Redis为了方便操作相关的数据结构,就提出了针对响应结构的指令,但是也有一些指令是不必关心数据库的value是啥结构也可以发挥作用的,这些指令就被称为全局指令。
二、get/set
我们介绍一下,Redis最核心的两条指令,get/set。
我们已经知道redis是按照键值对的方式存储数据的,而get 根据 key 来取 value,set 把 key 和 value 存储进去
使用简单,学习成本很低
但是使用也是有注意的点的,我们前面说的value是有数据结构的区分的,实际上key也是有的,并且就是字符串类型,我们使用key设置键值对关系的时候,无论写的是啥,都会被Redis当成字符串来进行存储。
2.1 set
下面我们来演示一下:
我们发现Redis对于每一次的语句的执行结果是有反映的,这里我们就成功设置了一对键值对。
2.2 get
功能就如它的名字一样,通过输入key值得到value值。
注:
1、对于上述这里的key-value,不需要加上引号,就是表示字符串的类型当然,如果要是给key和value加上引号,也是可以的(单引号或者双引号都行)
2、redis中的命令不区分大小写.
但是在上面get最后一个查询当中我们看到一个新奇的单词 ”nil“,这又是啥意思呢?这就是我们下面的问题了。
2.3 null 与nil
关于这个单词在官方文档当中是这样写的。
nil
和 null
都表示 “无值”或“空值” 的概念,但它们的命名和使用场景因编程语言而异。
在Redis当中开发者选择使用nil表示空值,而在其他语言当中比如C/C++当中就是使用NULL表示空值,大家关于这个概念有个了解就好。
三、keys,exists
Redis 有 5 种数据结构,但它们都是键值对种的值,对于键来说有⼀些通⽤的命令。
3.1 KEYS
返回所有满⾜样式(pattern)的 key。那样式又是什么呢?
pattern样式包含特殊符号的字符串,有的地方翻译成"样式"或者"模式”。
存在的意义,是去描述特定的字符串长啥样的
⽀持如下统配样式。
• h?llo 匹配 hello , hallo 和 hxllo
• h*llo 匹配 hllo 和 heeeello
• h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo
• h[^e]llo 匹配 hallo , hbllo , ... 但不匹配 hello
• h[a-b]llo 匹配 hallo 和 hbllo
当然我们也不口头说,我们下面实机演示一遍。
keys,支持的样式主要是有如下的几种:【?,*,[],^ ,-】
- ?:匹配任意一个字符
- []:[字符串]只能匹配到方括号内的字符串,别的不行.相当于给出固定的选项了,
- ^:排除某个特定的字符,只有该字符匹配不了.其他的都能匹配
- -:匹配某个范围内的字符.包含两侧边界
实际演示:
现在我们的Redis上有这些键值,我们可以开始演示了。
1)?:匹配一个字符
2)*:匹配0个或者多个任意字符
3)[]:[字符串]只能匹配到方括号内的字符串,别的不行.相当于给出固定的选项了,
4)^:排除某个特定的字符,只有该字符匹配不了.其他的都能匹配
5)-:匹配某个范围内的字符.包含两侧边界
注意:我们在使用这个指令查询相关的key的时候,本质上是对key值进行一次遍历,所以我们的时间复杂度就是O(N),谈到这个我们就得谈到另外的一个问题了,那就是我们的keys *。
3.2 KEYS *
keys 命令的时间复杂度是O(N),所以,在生产环境上,一般都会禁止使用keys命令.尤其是大杀器keys*,为什么呢?还记得我们前面在谈到为啥Redis要更快一些吗?其中有一条原因是因为它是单线程,但是在keys *的情况下,一台的Redis服务器就得全力完成该条指令,查询 redis 中所有的 key !!那就没办法对用户的请求做出反映,没关系,负责用户服务的服务器发现没有响应,就会直接找mysql服务器发出请求,这样的后果可能是灾难性的,我们知道Redis服务器上一般存放的是我们服务的热点数据,那么基本上Redis服务器被阻塞了,那就是所有的用户请求就打到了MySQL服务器上,这很容易就让MySQL服务器挂掉,进而导致整个服务的挂掉。
3.3 exists
判断某个 key 是否存在。
语法:
1 EXISTS key [key ...]
时间复杂度:O(1)
返回值:key 存在的个数。
当我们查询的key不存在的时候,就是直接返回0.
那我们下面再来看一种使用exists的方法。
大家说,这以红线划分的两种写法有什么不同吗?
要想讨论这个问题,我们应该先对网络的两个概念有所了解。
封装和分用
进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层,到物理层,层层封装,
(每一层协议都要加上报头或者尾)=>发一个快递,要包装一下,要包装好几层
接收方收到一个数据,这个数据就要从物理层,到应用层层层分用
((把每一层协议中的报头或者尾给拆掉)=>收到一个快递,要拆快递,要拆很多层
而网卡 是 IO 设备,更何况,你的客户端和服务器不一定在一个主机上,中间可能隔着很远。
这就导致了其实每一次的网络IO的消耗是很大的,所有分开的写法,会产生更多轮次的网络通信,效率比较低,成本比较高。
redis自身也非常清楚上述问题.redis的很多命令都是支持一次就能操作多个key的操作
四、生产环境
1.办公环境(入职公司之后,公司给你发个电脑)
笔记本(windows, mac)/台式机,现在办公电脑,一般8C16G512G
2.开发环境
有的时候,开发环境和办公环境是一个
有的时候,开发环境是单独的服务器,配置为28C128G4T,这两种情况主要是看岗位和公司规模
做前端/做客户端,一般来说,开发环境就是办公环境了,后端来说,很可能是单独的服务器。
主要是有的后端程序,会比较复杂
1. 编译一次时间特别久(C++) =>C++ 23 才会引入module
要使用高性能的服务器,进行编译
2. 有的程序一启动要消耗很多的cpu和内存资源.
办公电脑难以支撑
3.有的程序比较依赖linux,在windows环境搭不起来
3. 测试环境(测试工程师使用的)
配置比较好的就是28C128G4T
4.线上环境/生产环境
(办公环境,开发环境,测试环境,也统称为线下环境,外界用户无法
访问到的)
线上环境则是外界用户能够访问到的,
一旦生产环境上出问题,一定会对于用户的使用产生影响!!直接的影响到公司营收!
很多公司的营收都是靠广告,广告一般是按照展示/点击次数来计费的~~
未来我们去操作线上环境的任何一个设备/程序都要怀着12分的谨慎!!
哪有的小伙伴说我以后不操作生产环境了行不行?
不行!!把一个程序“上线”才算是把活干完了。
上线也可以认为是正式程序猿的一个重要考核指标,也是衡量一个实习生能不能转正留用的重要标准。
想要看自己是否可能留用,就看上线次数,一两个月才上线一次,基本凉凉;如果一周能上线两三次,基本稳。
总结:
本讲初步探索了 Redis 的核心操作指令,包括键值读写(get/set
)、键管理(keys/exists
)等基础命令,并强调了生产环境的操作规范。通过实践这些指令,我们已迈出 Redis 实战的第一步。在下一讲《通用命令(二)》中,我们将深入 del
、expire
、type
等进阶指令,进一步解锁 Redis 的高效数据管理能力。请持续关注!