当前位置: 首页 > article >正文

Redis基础(1)--基本全局指令与架构

1. 基本全局命令

Redis有5种数据结构,但它们都是键值对中的值,对于键来说有⼀些通用的命令。

1.1KEYS

返回所有满足样式(pattern)的key。支持如下统配样式。

  • 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 pattern
命令有效版本:1.0.0之后
时间复杂度:O(N)
返回值:匹配pattern的所有key。

1.2 EXISTS

判断某个key是否存在。
语法:EXISTS key [key ...]
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:key存在的个数。

注意:exists能够同时查看多个key是否存在,为什么要这样做?
因为Redis是客户端服务器模式的,每条指令会封装成网络请求发给服务端,服务端在接收到请求后解包,处理并将结果封装发回给客户端,封装和解包必然是要消耗性性能的。

1.3 DEL

删除指定的key。
语法:DEL key [key ...]
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:删除掉的key的个数。

1.4 EXPIRE

为指定的 key 添加秒级的过期时间(Time To Live TTL)
语法:EXPIRE key seconds
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:1表示设置成功。0表示设置失败

PEXPIRE:设置毫米级到期时间

1.5 TTL

获取指定 key 的过期时间,秒级。
TTL key
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在。

注意:IP协议首部也有TTL,这个TTL本质上是一个计数器,当IP报文被路由器转发后,就会减一,减到0丢弃IP报文

键的过期机制

Redis主要用两种策略去处理过期的数据

  1. 定期删除:定期查看一部分键是否应该被删除,保证速度足够快,因为redis是单线程程序,不能够阻塞工作线程
  2. 惰性删除:访问时查看是否已经到期

注意:有了上面两种方案,还是有过期数据不会被删除的,redis还有内存淘汰机制去解决这个问题

定时器的两种高效实现

  1. 优先级队列:用优先级队列及堆来维护key的到期时间,到期时间最近的key放入堆顶,专门创建一个线程来维护这个堆,当有新的key被设置了到期时间,就将其加入到堆中,并且查看堆顶的到期时间,用其减去当前时间,得到需要等待的时间,让线程休眠等待的时间,有新的key被设置了到期时间,就唤醒线程
  2. 时间轮

在这里插入图片描述

1.6 TYPE

返回 key 对应 value 的数据类型。
语法:TYPE key
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值: none , string ,list , set ,zset ,hash and stream .。

其中stream是消息队列用的

2. 单线程架构

Redis 使用了单线程架构来实现高性能的内存数据库服务,此处的单线程是只有一个线程来处理命令请求,并不是整个进程都只有一个线程,会有其他线程去处理IO。

2.1 单线程模型

在这里插入图片描述
当三个客户端同时访问Redis服务器时,看似是同时到达并处理请求,实际请求到达一定有先有后,由于Redis是单线程的,一个时间段只能处理一个请求,其他的请求即使来了也只能排队等着。不会有多线程场景下的线程安全问题。

这也能解释了Redis为什么能这么快~
这个快是和数据库相比的

  1. Redis访问内存,而数据库访问磁盘
  2. Redis处理网络请求用的是IO多路转接方案
  3. Redis的核心功能比数据库的核心功能要简单,数据库对于数据的插入删除查询都有更复杂的功能支持,这样必然会造成额外的开销,比如:约束,要做额外的工作
  4. 单线程模型避免了没必要的线程竞争开销
    redis操作都是短平快的,就是简单操作一下内存数据,不特别消耗cpu,使用多线程效率提升也不大

http://www.kler.cn/a/452781.html

相关文章:

  • mac_录屏
  • 解决:excel鼠标滚动幅度太大如何调节?
  • CSS系列(36)-- Containment详解
  • 基于Spring Boot的阿坝州旅游系统
  • kimi搜索AI多线程批量生成txt原创文章软件-不需要账号及key
  • Unity3d 基于UGUI和VideoPlayer 实现一个多功能视频播放器功能(含源码)
  • Charles安装证书过程(手机)
  • CSS系列(35)-- Subgrid详解
  • uni-app开发订单详情页面
  • Vue3知识弥补漏洞——性能优化篇
  • SSH无法启动问题:OpenSSL version mismatch. Built against 30000070, you have 30200020
  • np.triu:NumPy中提取上三角矩阵的利器
  • APP投放的归因框架设计
  • 枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
  • python闭包详解
  • 2024年第十一期 | CCF ODC《开源战略动态月报》
  • 使用Python开发高级游戏:实现一个3D射击游戏
  • UE5仿漫威争锋灵蝶冲刺技能
  • ElasticSearch 的工作原理
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • 医药垃圾分类管理系统|Java|SSM|JSP|
  • Intent--组件通信
  • 华为认证考试模拟题测试题库(含答案解析)
  • STM32-笔记10-手写延时函数(SysTick)
  • nacos-服务发现注册
  • 【Linux】shell脚本:查找可执行文件和批量创建多个账户