不看后悔一辈子!不看错过50K!历尽心血总结Redis全局命令

news2024/11/15 8:40:25

前言:

📕作者简介:热爱编程的敖云岚,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年!
📘相关专栏:Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。                                                                                                                  

️😇有兴趣的话关注博主一起学习,一起进步吧!😇

一、Redis预备工作

1.1启动Redis

[root@localhost redis]# redis-server /etc/redis/redis.conf

 1.2停止Rudis

先查看到 redis-server 的 pid:

[root@localhost redis]# netstat -anp | grep redis

 然后通过 kill 命令直接杀死 redis 进程:

kill 进程id

Redis:是一个客户端服务器结构的程序


二、Redis 常见数据类型 

2.1Redis两个最核心的命令

get 根据key来取value

set 把key和value存储进去

首先进入redis客户端:

[root@localhost redis]# redis-cli

 代码示例:

127.0.0.1:6379> set key1  value1
OK
127.0.0.1:6379> set key2 value2
OK
# 对于上述的key 和 value 不需要加引号,表示字符串的类型
# 当然,加上单引号或者双引号也是可以的 
# redis 中的命令不区分大小写
# get 命令直接输入key就能得到value
# 如果当前key不存在,会返回nil(和null/NULL是一个意思)
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
"value2"

127.0.0.1:6379> get key5
(nil)

# 对于上述的key 和 value 不需要加引号,表示字符串的类型
# 当然,加上单引号或者双引号也是可以的 
# redis 中的命令不区分大小写 

2.2 基本全局命令

Redis是键值对结构。key固定就是字符串,value会存在多种类型,如字符串、哈希、列表、集合等等。全局命令:就是能够搭配任意一种数据结构来使用的命令

KEYS:返回所有满足样式(pattern)的 key。

pattern : 表示包含特殊符号的字符串(字符串会通过一些特殊符号,如通配符,来描述key的模样)

# 背景示例
127.0.0.1:6379> set hallo 1
OK
127.0.0.1:6379> set hbllo 1
OK
127.0.0.1:6379> set hcllo 1
OK
127.0.0.1:6379> set hdllo 1
OK
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hpppppllo 1
OK

  •  ? 匹配任意一个字符
127.0.0.1:6379> keys h?llo
1) "hcllo"
2) "hdllo"
3) "hbllo"
4) "hello"
5) "hallo"
  • * 匹配0个或任意多个字符
127.0.0.1:6379> keys h*llo
1) "hpppppllo"
2) "hcllo"
3) "hdllo"
4) "hbllo"
5) "hello"
6) "hallo"
  • [abcde] 只能匹配到 a b c d e ,给出固定选项
127.0.0.1:6379> keys h[ae]llo
1) "hello"
2) "hallo"
  • [^e] 排除 e ,只有e匹配不了
127.0.0.1:6379> keys h[^abcd]llo
1) "hello"
  • [a-b] 匹配 a - b 这个范围内的字符,包含两侧边界
127.0.0.1:6379> keys h[a-q]llo
1) "hcllo"
2) "hdllo"
3) "hbllo"
4) "hello"
5) "hallo"

注意事项:

(1.) keys 的时间复杂度为:O(N)

所以在生产环境上一般会禁止使用keys命令,尤其是 keys * 。由于生产环境上的key可能会非常多!而Redis是一个单线程的服务器,执行keys *的时间会非常长,导致redis服务器阻塞,从而一影响到给其他客户端提供服务,这样的后果是灾难性的!

情节严重会丢掉年终奖或者自己的工作!!!

EXISTS:判断某个 key 是否存在。

127.0.0.1:6379> keys *
1) "hdllo"
2) "hallo"
3) "hcllo"
4) "hbllo"
5) "hello"
127.0.0.1:6379> exists key hallo
(integer) 1
127.0.0.1:6379> exists key hfllo
(integer) 0

时间复杂度:O(1)
返回值:key 存在的个数。(不存在返回0)

DEL:删除指定的 key。

127.0.0.1:6379> del key hallo
(integer) 1
127.0.0.1:6379> keys *
1) "hdllo"
2) "hcllo"
3) "hbllo"
4) "hello"

时间复杂度:O(1)

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

EXPIRE:为指定的 key 添加秒级的过期时间(Time To Live TTL)

(单位为秒)

127.0.0.1:6379> keys *
1) "hdllo"
2) "hcllo"
3) "hbllo"
4) "hello"
# 指定hdllo有效时间为3秒
127.0.0.1:6379> expire hdllo 3
(integer) 1
127.0.0.1:6379> keys *
1) "hcllo"
2) "hbllo"
3) "hello"
# 3秒后过期

时间复杂度:O(1)
返回值:1 表示设置成功。0 表示设置失败。

TTL:获取指定 key 的过期时间,秒级。

127.0.0.1:6379> expire hcllo 10
(integer) 1
# 获取剩余有效时间
127.0.0.1:6379> ttl hcllo
(integer) 4
127.0.0.1:6379> ttl hcllo
(integer) 1
127.0.0.1:6379> ttl hcllo
(integer) -2

时间复杂度:O(1)
返回值:剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在。

EXPIRE 和 TTL 命令都有对应的支持毫秒为单位的版本:PEXPIRE 和 PTTL,详细用法就不再介绍了。

TYPE:返回 key 对应的 value 的数据类型。

# 新增键值对:默认为字符串
redis> SET key1 "value"
"OK"
# value为链表
redis> LPUSH key2 "value"
(integer) 1
# value为set类型
redis> SADD key3 "value"
(integer) 1
# 查看key对应的value的数据类型
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

2.3 面试题

2.3.1 redis的key的过期策略是怎么实现的?

一个 reids 中可能同时存在很多 key , 这些 key 中有可能一大部分都有过期时间。此时 redis 服务器如何知道哪些 key 已经过期要被删除,哪些 key 还没过期?

redis 的策略是:两种方式相结合

(1.)定期删除

每次抽取一部分进行验证过期时间,保证抽取检查的过程足够快!因为 redis 是单线程的程序,如果扫描 key 的消耗的时间太多,就可能导致正常处理请求命令收到阻塞!

(2.)惰性删除

假设这个key已经到了过期时间,但是暂时还没有进行删除。当用户后面进行访问时正好用到这个key , 这次访问会让 redis 服务器触发删除 key 的操作,同时返回nil(空)。

2.3.2多线程的两种定时器模式

2.3.2.1 定时器

(1.)定时器:在某个时间到达之后,执行指定的任务。

(2.)原理:基于优先级队列/堆(过期时间越早,优先级越高)。

(3.)过程:队首元素是最早要过期的 key 。此时定时器中只要分配一个线程,让这个线程去检查队首元素,查看是否过期。如果队首元素还没过期,后续元素一定没过期。此时扫描线程不需要遍历所有的key,只要关注队首元素即可。另外,在扫描线程检查队首元素过期时间的时候,不能进行频繁的检察。此时就可以根据当前时刻和队首元素的过期时间设置一个等待时间,当时间接近时,系统再唤醒这个线程,节省了CPU的开销。若中途出现新任务添加,只需要唤醒刚才的线程检查一下队首元素进行重新调整阻塞时间即可。

2.3.2.2 基于时间轮实现的定时器

(1.)时间轮:把时间划分成很多小段(划分的粒度,看实际需求)

(2.)图论理解:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854451.html

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

相关文章

【Python】单元测试框架unitest及其高级应用

目录 Unittest 简单使用示例 重要概念 断言方法 深入 高级应用 认识Page Object 资料获取方法 Unittest Unittest是python的一个单元测试框架,但是它不仅适用于单元测试,还适用自动化测试用例的开发与执行。我们可以很方便的使用它组织执行测试用…

JVM垃圾回收篇-垃圾回收算法

JVM垃圾回收篇-垃圾回收算法 标记清除(Mark Sweep) 概念 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分,比如说我们的应用程序本身。 mutator的职责一般是NEW(分配内存)、READ(从内存中读取内容)、WRITE(将内容写入内…

CSMA/CD协议原理

共享总线以太网具有天然的广播特性,即使总线上某个站点给另一个站点发送单播帧,表示帧的信号也会沿着总线传播到总线上的其他各站点 。 当某个站点在总线上发送顿时,此时,如果总线上的其他站点也要在总线当某个站点在总线上发送顿…

Qt应用开发(基础篇)——时间微调输入框 QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

资深java程序员的IDEA的常用设置

设置入口 打开项目以后也可以在左上角File-->setting进行设置,不过部分设置的是该项目的,换个项目可能就变了,建议打开项目之前就设置。 一般新的idea软件默认是下图页面,或者打开项目后可以点击File-->Close Project退到…

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型(本文所阐述的分支模型)构思于 2010 年,也就是 Git 诞生后不久,距今已有 10 多年。在这 10 多年中,Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里,Git 本身…

C++异常使用

异常关键字: try:在try部可检测异常 catch:当发现异常捕获处 throw:抛出异常处 noexcept:被修饰函数内部不会发生异常 允许抛出和捕捉各种类型的数据。 int main() {try{func();}catch(const char*e){ //捕捉字符…

计算机是怎么存储和识别人类高级语言的

目录 1、计算机是怎么“存储”人类的高级语言的?2、 UTF-8和UTF-32的区别3、UTF-8是如何区分字节的长度呢?(即如何识别这一串二进制是多少个字节的?)4、计算机是如何识别人类的高级语言的? 1、计算机是怎么…

idea如何开启多个客户端(一个代码开启多个客户端运行)

1.在编程界面UdpEchoClient的下拉列表中找到Edit Configurations...并点击 2.点击Modify options 3.点击Allow multiple instances将其勾选上 4.点击ok 在经历了以上的设置以后,再次运行客户端的程序便会创建一个新的客户端运行(有了一个新的运行窗口&am…

【AI】《动手学-深度学习-PyTorch版》笔记(十四):多层感知机

AI学习目录汇总 1、多层感知机网络结构 1.1 线性模型:softmax回归 在前面介绍过,使用softmax回归来处理分类问题时,每个输出通过都一个仿射函数计算,网络结构如下,输入和输出之间为全链接层: 1.2 多层感知机 多层感知机就是在输入和输出中间再添加一个或多个全链接…

解数独(Java)

题目链接: 力扣 题目详情: 37. 解数独t编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只…

研发工程师玩转Kubernetes——使用emptyDir在同一Pod不同容器间共享数据

kubernets可以通过emptyDir实现在同一Pod的不同容器间共享文件系统。 正如它的名字,当Pod被创建时,emptyDir卷会被创建,这个时候它是一个空的文件夹;当Pod被删除时,emptyDir卷也会被永久删除。 同一Pod上不同容器之间…

【数据分析】pandas (三)

基本功能 在这里,我们将讨论pandas数据结构中常见的许多基本功能 让我们创建一些示例对象: index pd.date_range(“1/1/2000”, periods8) s pd.Series(np.random.randn(5), index[“a”, “b”, “c”, “d”, “e”]). df pd.DataFrame(np.random.…

BDA初级分析——界定问题

数据分析,从界定问题开始 一、界定问题的作用 如何从现有台式机企业客户中挑选出那些想购买服务器的企业客户? 问题中的陷阱,隐藏的假设条件 假设1: 在购买服务器的客户中,只有0.01%的客户是购买过公司台式机的客户&#xff0…

超详细的Linux基础命令

文章目录 前言Linux目录结构Linux命令通用格式ls 命令什么是工作目录什么是 HOME 目录 目录切换相关命令cd 命令pwd 命令 特殊的路径符创建目录文件操作相关命令touch 命令cat 命令more 命令cp 命令mv 命令rm 命令通配符 查找命令which 命令find 命令按文件名查找文件按文件大小…

无人驾驶实战-第十一课(控制理论)

在七月算法上报了《无人驾驶实战》课程,老师讲的真好。好记性不如烂笔头,记录一下学习内容。 课程入口,感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 无人驾驶中控制系…

1、如何实现两台电脑之间数据相互读写

一、确保两台电脑在同一个局域网中,可以使用网线【动态配置】进行两台电脑互连。 二、静态配置: 将IP地址和网关设为192.168.0.1,目的是让这台电脑做另一台电脑的网关,子网掩码一点击会自动添加。第二台电脑同样打开设置,此处IP地…

[oeasy]python0082_[趣味拓展]控制序列_清屏_控制输出位置_2J

光标位置 回忆上次内容 上次了解了键盘演化的过程 ESC 从 组合键到 独立按键 ESC的作用 是 进入 控制序列配置 控制信息控制信息 \033[y;xH 设置光标位置\033[2J 清屏 这到底怎么控制???🤔谁来实现这些功能? 控制…

【大数据】Flink 详解(二):核心篇 Ⅱ

Flink 详解(二):核心篇 Ⅱ 22、刚才提到 State,那你简单说一下什么是 State。 在 Flink 中,状态 被称作 state,是用来保存中间的计算结果或者缓存数据。根据状态是否需要保存中间结果,分为 无状…