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

前言:

📕作者简介:热爱编程的敖云岚,致力于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.rhkb.cn/news/82330.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【用于全变分去噪的分裂布雷格曼方法】实施拆分布雷格曼方法进行总变异去噪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

流量分析日志查看

一流量分析 buuctf wireshark 从题目出发,既然是上传登录信息,就直接过滤post请求,即搜索 http.request.methodPOST,因为上传用户登录信息使用的一定是http里的post方法 模式过滤 http.request.method “GET” http.request.…

Vantage透明屏的工作原理是什么?应用、展示、显示

Vantage透明屏是一种新型的显示技术,它能够将图像和视频直接投影到透明的屏幕上,使得观众可以同时看到屏幕上的内容和背后的实物。 这种技术在广告、展览、零售和娱乐等领域有着广泛的应用前景。 Vantage透明屏的工作原理是利用透明的显示面板和背后的…

Spring Bean 生命周期的执行流程

问题描述 Spring 生命周期全过程大致分为五个阶段: 1、创建前准备阶段 2、创建实例阶段 3、依赖注入阶段 4、 容器缓存阶段 5、销毁实例阶段 下图是 Spring Bean 生命周期完整流程图,其中对每个阶段的具体操作做了详细介绍: 一、创建前准备阶…

Qt实现可伸缩的侧边工具栏(鼠标悬浮控制伸缩栏)

Qt实现可伸缩的侧边工具栏 一直在网上找,发现大多的实现方案都是用一个按钮,按下控制侧边栏的伸缩,但是我想要实现鼠标悬浮在侧边栏的时候就伸出,移开就收缩的功能,也没找到好的参考,所以决定自己实现一个…

【Spring练习项目】博客系统

目录 1.项目展示2.项目结构设计3.项目功能设计4 数据库准备4.1 建表4.2 DB相关数据 5.项目模块6.添加项目公共模块6.1 common6.2 实现前端界面 7.功能实现7.1实现博客列表约定前后端交互接口实现服务器代码实现客户端代码 7.2实现博客详情约定前后端交互接口实现服务器代码实现…

20、Flink SQL之SQL Client: 不用编写代码就可以尝试 Flink SQL,可以直接提交 SQL 任务到集群上

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

MySQL 查询语句大全

目录 基础查询 直接查询 AS起别名 去重(复)查询 条件查询 算术运算符查询 逻辑运算符查询 正则表达式查询⭐ 模糊查询 范围查询 是否非空判断查询 排序查询 限制查询(分页查询) 随机查询 分组查询 HAVING 高级查询…

QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 终篇

QT图形视图系统 - 终篇 接上一篇,我们需要继续完成以下的效果; 先上个效果图: 资源路径:https://download.csdn.net/download/turbolove/88192114?spm1001.2014.3001.5503 修改背景,使之整体适配 上一篇我们绘制了…

领航优配:沪指震荡涨0.47%,保险、券商板块强势,互联金融概念活跃

4日早盘,两市股指高开高走,沪指一度涨逾1%打破3300点,随后涨幅有所收窄;两市半日成交超6000亿元,北向资金小幅净流入。 截至午间收盘,沪指涨0.47%报3295.91点,深成指涨0.67%,创业板指…

使用idea如何生成webservice客户端

需求阐述 在和外围系统对接的时候,对方只给了wsdl地址,记得之前了解到的webservice,可以用idea生成客户端代码。先记录生成的步骤 使用idea如何生成webservice客户端 1.创建一个Java项目 2.第二步生成代码 我的idea再右键要生成文件目录里…

01.Redis实现发送验证码保存功能

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis来实现发送验证码功能 学习产出&#xff1a; 流程图 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifact…

QT生成可执行文件的步骤

QT生成可执行文件的步骤 第一步&#xff1a;debug为release&#xff0c;然后进行编译 第二步&#xff1a;添加QT生成必要的库 首先&#xff0c;建立一个新的文件夹&#xff0c;然后将Release中的可执行文件拷贝到新的文件夹中 然后&#xff0c;在新建文件夹中生成必要的库 …

flutter:二维码生成与读取

前言 这csdn真的是服了&#xff0c;图片里有个二维码就直接变成违规图片了。至于效果的话&#xff0c;自己运行一下看看吧。 生成 flutter中生成二维码可以使用 qr_flutter。 官方文档 https://pub-web.flutter-io.cn/packages/qr_flutter 安装 flutter pub add qr_flutt…

使用vue-grid-layout时 You may need an appropriate loader to handle this file type.

使用vue-grid-layout时 You may need an appropriate loader to handle this file type. node版本不匹配 我的node v14.16.0 vue-gride-layout 需要用 v 2.3.7的版本 卸载后重新安装即可

我的2048创作纪念日

目录 一、来龙去脉二、2048天前的今天三、2048天的收获四、2048天后的今天五、祝福 一、来龙去脉 今天是 2023 年 8 月 9 日&#xff0c;在咖啡馆浏览我的 CSDN 主页时&#xff0c;看到官方发来了一则私信&#xff1a; 二、2048天前的今天 提示&#xff1a;可以和大家分享最初…

Xilinx FPGA电源设计与注意事项

1 引言 随着半导体和芯片技术的飞速发展&#xff0c;现在的FPGA集成了越来越多的可配置逻辑资源、各种各样的外部总线接口以及丰富的内部RAM资源&#xff0c;使其在国防、医疗、消费电子等领域得到了越来越广泛的应用。当采用FPGA进行设计电路时&#xff0c;大多数FPGA对上电的…

【第一阶段】kotlin的函数

函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范&#xff0c;先有输入&#xff08; getMethod(name:String,age:Int)&#xff09;再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…

Qt 使用QLabel的派生类实现QLabel的双击响应

1 介绍 在QLabel中没有双击等事件响应&#xff0c;需要构建其派生类&#xff0c;自定义信号(signals)、重载事件函数(event)&#xff0c;最后在Qwidget中使用connect链接即可&#xff0c;进而实现响应功能。 对于其余没有需求事件响应的QObject同样适用。 此外&#xff0c;该功…

近地面无人机植被定量遥感与生理参数反演技术

遥感&#xff08;RS-Remote Sensing&#xff09;——不接触物体本身&#xff0c;用传感器收集目标物的电磁波信息&#xff0c;经处理、分析后&#xff0c;识别目标物&#xff0c;揭示其几何、物理性质和相互关系及其变化规律的现代科学技术。 换言之&#xff0c;即是“遥远的感…