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.rhkb.cn/news/115554.html

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

相关文章

vue3组合式api bus总线式通信

vue2中可以创建一个 vue 实例, 做为 总结来完成组件间的通信 但是在vue3中, 这种方法是不能使用的。 因为vue3中main.js中, 使用的createApp() 没有机会再写 new Vue了 但是我们可以使用 mitt 的插件来解决这个问题 vue3 bus组件的用法 安装…

前端速查速记系列----评论列表

小程序评论列表 效果图 wxml代码 <view id"econtent"><block wx:for"{{commentlist}}" wx:for-item"item" wx:for-index"index" wx:key"{{item.id}}"><view class"box1"><view class"…

Thymeleaf

这就是自动装配的原理 1) .SpringBoot启动会加载大量的自动配置类 2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中; 3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中&#xff0c;我们就不需要再手动配置了) 4)、给容器…

pdfh5在线预览pdf文件

前言 pc浏览器和ios的浏览器都可以直接在线显示pdf文件&#xff0c;但是android浏览器不能在线预览pdf文件&#xff0c;如何预览pdf文件&#xff1f; Github: https://github.com/gjTool/pdfh5 Gitee: https://gitee.com/gjTool/pdfh5 使用pdfh5预览pdf 编写预览页面 <…

【LeetCode-中等题】437. 路径总和 III

文章目录 题目方法一&#xff1a;迭代层序 每层节点dfs 维护一个count变量 题目 方法一&#xff1a;迭代层序 每层节点dfs 维护一个count变量 思路&#xff1a; 层序遍历每一个节点遍历一个节点就对这个节点进行dfsdfs的同时&#xff0c;维护一个count变量&#xff0c;并且…

2001-2021年中国城市分产业创新指数(574万+)

2001-2021年中国城市分产业创新指数&#xff08;574万&#xff09; 1、时间&#xff1a;2001-2021年 2、来源&#xff1a;中国城市和产业创新力报告 3、指标&#xff1a;包括城市创新指数、产业创新指数、城市-产业创新指数 4、整理方式&#xff1a; 整理方式是基于国家知…

基于Python的小区监控图像拼接系统设计与实现【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java、Python等技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; …

2023开学礼《乡村振兴战略下传统村落文化旅游设计》南京农大许少辉八一新书

2023开学礼《乡村振兴战略下传统村落文化旅游设计》南京农大许少辉八一新书

【教程分享】Docker搭建Zipkin,实现数据持久化到MySQL、ES

1 拉取镜像 指定版本&#xff0c;在git查看相应版本&#xff0c;参考&#xff1a; https://github.com/openzipkin/zipkin 如2.21.7 docker pull openzipkin/zipkin:2.21.7 2 启动 Zipkin默认端口为9411。启动时通过-e server.portxxxx设置指定端口 docker run --name zi…

最新社区团购电商小程序源码 无bug完美运营版+详细搭建部署教程

分享一个开源社区团购电商小程序源码&#xff0c;无bug完美运营版&#xff0c;含完整前后端详细搭建部署教程。 系统运营模式&#xff1a;整合线下社区资源&#xff0c;由各快递代收点、社区便利店、社区物业、业主等发起的社区微信群&#xff0c;推送商品信息&#xff0c;消费…

MYSQL(索引、事务)

文章目录 一、索引二、事务 一、索引 数据库中的表、数据、索引之间的关系&#xff0c;类似于书架上的图书、书籍内容和书籍目录的关系 1. 概述 概念&#xff1a;相当于是一本书的目录&#xff0c;是以‘列’为维度进行建立的使用场景&#xff1a;如果我们要查询一个表中的某个…

汽车自适应巡航系统车距控制策略研究

1 引言 自适应巡航控制( Adaptive Cruise Control&#xff0c;ACC) 是汽车驾驶辅助系统的重要组成部分&#xff0c;其作用是根据车距传感器探测到本车( ACC 车辆) 与主目标车辆( 前车) 之间的相对位置和相对速度信息&#xff0c;自动调节ACC 车辆的节气门开度或部分制动力矩( 即…

RT_Thread内核机制学习(一)

ARM架构及汇编 ARM芯片属于精简指令集计算机&#xff08;RISC&#xff1a;Reduced Instruction Set Computer&#xff09;&#xff0c;它所使用的指令比较简单&#xff0c;有如下特点&#xff1a; 对内存只有读、写指令。对于数据的运算实在CPU内部实现。使用RISC指令的CPU复杂…

CSC2121A

半桥架构的栅极驱动电路CSC2121A CSC2121系列是一款高性价比的半桥架构的栅极驱动专用电路&#xff0c;用于大功率MOS管、IGBT管栅极驱动。IC内部集成了逻辑信号处理电路、死区时间控制电路、欠压保护电路、电平位移电路、脉冲滤波电路及输出驱动电路&#xff0c;专用于无刷电…

MybatisPlus(2)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 上篇我们简单介绍了MybatisPlus的方便之处&#xff0c;这篇来深入了解Myb…

LNMT架构

所谓的LNMT架构 指的就是Linux操作系统上部署Nginx web服务器、MySQL数据库服务器、Tomcat中间件服务器 L linux N nginx M mysql T tomcat 单机部署 1&#xff0c;安装 apache-tomcat 2&#xff0c;移动目录 3&#xff0c;复制第二个tomcat 4&#xff0c;…

大型商城系统功能逻辑架构_各大系统关系设计_OctShop

一个商城系统应该具备什么样的功能才算一个合格的网上商城呢&#xff0c;才能满意用户的下单支付&#xff0c;退款退货&#xff0c;售后等需求呢&#xff01; 商城一般分为三种角色&#xff1a;买家&#xff0c;商家&#xff0c;平台&#xff0c;这三种角色都有各自的功能特点。…

springMVC之拦截器

文章目录 前言一、拦截器的配置二、拦截器的三个抽象方法三、多个拦截器的执行顺序总结 前言 拦截器 一、拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置&…

Android之自定义时间选择弹框

文章目录 前言一、效果图二、实现步骤1.自定义Dialog2.xml布局3.背景白色转角drawable4.取消按钮背景drawable5.确定按钮背景drawable6.NumberPicker样式和弹框样式7.弹框动画8.Activity使用 总结 前言 随着产品人员不断变态下&#xff0c;总是会要求我们的界面高大上&#xf…