2.Redis 通用命令

Redis 中最核心的两个命令:

set

作用:设置 key 对应的 value 值并存储进去。若key已包含一个值,则无论其类型如何,都会覆盖该值。在SET操作成功时,将丢弃与密钥相关联的任何先前生存时间。
在这里插入图片描述
对于上述这里的 key和value ,不需要加上引号,直接就是表示字符串的类型~~
当然,如果要是给 key 和 value 加上引号也是可以的(单引号或者双引号都可以)
redis 中的命令与mysql一致不区分大小写

get

作用:根据 key 来获取 value值
在这里插入图片描述
如果当前key不存在,那么返回 nil , 和 null / NULL一个意思
在这里插入图片描述

基本全局命令

在这里插入图片描述
Redis 有5种数据结构,但它们都是键值对这种的值,对于键来说有⼀些通⽤的命令。而全局命令,就是能够搭配任意一个数据结构来使用的命令~~

keys

作用:用来查询当前服务器上匹配的key
通过一些特殊符号(通配符)来描述 key 的模样,匹配上述模样的 key 就能够被查询出来
返回所有满⾜样式(pattern)的key。⽀持如下统配样式。

  • h?llo 匹配 hello , hallo 和 hxllo ? 匹配任意一个字符
  • h*llo 匹配 hllo 和 heeeello *匹配0个或者多个任意字符
  • h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo [abcde] 只能匹配到 a b c d e,别的不行,相当于给出了固定的选项了
  • h[^e]llo 匹配 hallo , hbllo,但不匹配 hello [^e] 排除e, 只有e 匹配不了,其他的都能匹配
  • h[a-b]llo 匹配 hallo 和 hbllo [a-b] 匹配 a - b 这个范围内的字符,包含两侧边界

语法: keys pattern
注意事项
keys 命令的时间复杂度是 O(N)
所以,在生产环境上,一般都会禁止使用keys命令。尤其是大杀器 keys *。
生产环境上的 key * 可能会非常多!而redis是一个单线程的服务器,执行keys *的时间非常长,就使得 redis 服务器被阻塞了,无法给其他客户端提供服务!

exists

作用:判断 key 是否存在。
语法:exists key [key ...]
返回值:key 存在的个数。
时间复杂度:O(N),这里的N不是总的 key 数量N,而是你索需要查询的 key 的个数,如果是查询的key个数为1个,那么就是O(1)
在这里插入图片描述

del

作用:删除指定的 key
语法:del key [key ...]
返回值:删除掉的 key 的个数
时间复杂度:O(N),这里的N不是总的key数量N,而是你查询的key的个数,如果是查询的key个数为1个,那么就是O(1)
在这里插入图片描述

expire

作用:是给指定的 key 设置过期时间,单位是秒
语法:EXPIRE key seconds
在这里插入图片描述
与其相对应的就是pexpire,它们之间的区别是设置的单位不同,pexpire设置过期时间单位是毫秒,expire单位是秒。

ttl

作用:获取指定key的过期时间,秒级
语法:TTL key
返回值:剩余过期时间。-1表⽰没有关联过期时间,-2表⽰key不存在。
在这里插入图片描述
与其相对应的是pttl,单位是毫秒。

type

作用:返回key对应的value类型
语法: TYPE key
返回值: none , string , list , set , zset , hash and stream等
在这里插入图片描述

redis 的key 的过期策略是什么实现的

一个redis 中可能同时存在很多很多key,这些 key中可能有很大一部分都有过期时间,此时,redis 服务器咋知道那些key 已经过期要被删除,那些key还没过期?
如果直接遍历所有的key,显然是行不通的,效率非常低~~
redis 整体的策略是:

  1. 定期删除:每次抽取一部分,进行验证过期时间~~
  2. 惰性删除:假设这个 key 已经到过期时间了,但是暂时还没删它,key 还存在,紧接这后面又有一次访问,正好用到了这个key,于是这次访问就会让redis服务器触发删除key的操作,同时再返回一个nil

虽然有了上述两种策略结合,整体的效果一般~~
仍然可能会有很多过期的 key 被残留了,没有及时删除掉~~
redis为了对上述进行补充,还提供了一系列的内存淘汰策略~~

在其他博主上能看到下图这样的机制:
在这里插入图片描述
其中定时删除是错误的,原因如下:
1.redis 中并没有采取 定时器 的方式来实现过期 key 删除。
2.如果有多个key 过期,也可以通过一个 定时器(可以是基于 优先级队列 或者 基于 时间轮 都可以实现比较高效的定时器) 来高效/节省cpu的前提下来处理多个key~

基于优先级队列定时器设计思路

正常的队列是先进先出,而优先级队列则是按照指定的优先级先出,例如c++ STL中的priority_queue一样。
那么啥叫优先级高呢?我们可以自定义,比如再 reids 过期 key 的场景中,就可以通过 “过期时间越早,就是优先级越高”

那么我们现在假定有很多 key 设置了过期时间,就可以把这些 key 加入到一个优先级队列中,指定优先级规则是过期时间早的先出队列,队首元素,就是最早的要过期的key

keyvalue
key112:00
key213:00
key314:00

此时定时器中只要分配一个线程,让这个线程去检查队首元素,看是否过期即可,如果队首元素还没过期,后续元素一定没过期!此时让 这个扫描线程不需要遍历所有的key只需要盯住队首元素即可。
另外再扫描线程检查队首元素过期时间的时候不能太频繁,此时做法就是可以根据当前时刻和队首元素的过期时间,让扫描线程进行等待,当时间到了,系统在去唤醒这个线程,此时扫描线程不需要高频扫描队首元素,把cpu的开销可以降低下来。
其中万一再线程休眠时,来了一个新的任务,是11.30要执行,那么可以再新任务添加进来的时候,先唤醒一下刚下的线程,并且重新检查一下队首元素,再根据时间差距重新调整阻塞时间即可。

基于时间轮实现的定时器思路

首先把时间划分程很多小段,假设每个单元格是100ms的间隔,当有新任务进来时,先找到要存储的单元格位置并存入,如果发现设置的时间超出对应时间轮一轮的范围只需要多旋转几轮直到找到即可,并且当每过100ms时,此时就需要检查当前格子上的每一个任务,并尝试看是否能执行当前任务。
在这里插入图片描述

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

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

相关文章

Vant 4.6.4发布,增加了一些新功能,并修复了一些bug

导读Vant 4.6.4发布,增加了一些新功能,并修复了一些bug等。 新功能 feat(area-data): 更新芜湖的县区数据,由 nivin-studio 在 #12122 中贡献feat(Locale): 添加塞尔维亚语到国际化,由 RogerZXY 在 #12145 中贡献feat(ImagePreview): 添加 c…

神经网络的工作原理

目录 神经网络的介绍 神经网络的组成 神经网络的工作原理 Numpy 实现神经元 Numpy 实现前向传播 Numpy 实现一个可学习的神经网络 神经网络的介绍 神经网络受人类大脑启发的算法。简单来说,当你睁开眼睛时,你看到的物体叫做数据,再由你…

Spring 中 @Primary 注解的原理是什么?

1. 问题分析 当我们使用 Spring 的时候,有时候会遇到下面这种情况。 假设我有 A、B 两个类,在 A 中注入 B,如下: Component public class A {AutowiredB b; }至于 B,则在配置类中存在多个实例: Configu…

【python】jupyter notebook导出pdf和pdf不显示中文问题

文章目录 写在前面1. 使用jupyter notebook导出pdf1.1 安装Pandoc1.2 安装MiKTex1.3 示例导出pdf 2. 中文显示问题2.1 显示中文问题示例2.2 解决办法1:修改tex2.3 解决办法2:修改内置文件 写在前面 使用jupyter notebook导出pdf时,出现了一些…

一文1500字从0到1搭建 Jenkins 自动化测试平台

Jenkins 自动化测试平台的作用 自动化构建平台的执行流程(目标)是: 我们将代码提交到代码托管工具上,如github、gitlab、gitee等。 1、Jenkins要能够检测到我们的提交。 2、Jenkins检测到提交后,要自动拉取代码&#x…

开源与区块链:去中心化的未来

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

git通过fork-merge request实现多人协同

一、问题 对于一个项目,如果需要多人协同开发,大家都在原始仓库中进行修改提交,经常会发生冲突,而且一不小心会把别人的代码内容覆盖掉。为了避免这样的问题,git提供了fork-merge request这样的协同方式。 二、仓库框…

深度学习4. 循环神经网络 – Recurrent Neural Network | RNN

目录 循环神经网络 – Recurrent Neural Network | RNN 为什么需要 RNN ?独特价值是什么? RNN 的基本原理 RNN 的优化算法 RNN 到 LSTM – 长短期记忆网络 从 LSTM 到 GRU RNN 的应用和使用场景 总结 百度百科维基百科 循环神经网络 – Recurre…

Django(3)-创建第一个数据模型-ORM映射

数据库配置 根目录下settings.py 。这是个包含了 Django 项目设置的 Python 模块。 通常,这个配置文件使用 SQLite 作为默认数据库。如果你不熟悉数据库,或者只是想尝试下 Django,这是最简单的选择。Python 内置 SQLite,所以你无…

糟改押ong韵诗词,末三字改qiao ben zhong

题目给出诗词行的汉语拼音,糟改诗词押ong诗词行末三字“敲笨钟“。 (本笔记适合初通 Python 的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&#xff…

websocket和uni-app里使用websocket

一、HTTP是无状态协议 特点: 1、浏览器发送请求时,浏览器和服务器会建立一个连接。完成请求和响应。在http1.0之前,每次请求响应完毕后,会立即断开连接。在http1.1之后,当前网页的所有请求响应完毕后,才断…

springboot+mp完成简单案例

目录 1.框架搭建 2.前端搭建 3.后端编写 需求&#xff1a;完成简单的连表条件查询以及添加即可 1.框架搭建 1.创建springboot项目 2.相关依赖 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…