redis核心命令全局命令 + redis 常见的数据结构 + redis单线程模型

文章目录

  • 一. 核心命令
    • 1. set
    • 2. get
  • 二. 全局命令
    • 1. keys
    • 2. exists
    • 3. del
    • 4. expire
    • 5. ttl
    • 6. type
  • 三. redis 常见的数据结构及内部编码
  • 四. redis单线程模型

一. 核心命令

1. set

set key value
key 和 value 都是string类型的
在这里插入图片描述
对于key value, 不需要加上引号, 就是表示字符串类型, 加上也可以
redis中, 不区分大小写

2. get

get key
在这里插入图片描述
如果key不存在, 返回nil, 就是null的意思
在这里插入图片描述

二. 全局命令

全局命令, 就是能够搭配任意一个数据结构来使用的命令

1. keys

keys pattern
pattern就是通过一些特殊符号(通配符), 来描述key的模样, 匹配上的key就能被查询出来
在这里插入图片描述
keys的时间复杂度是O(N)
在生产环境上, 一般会禁止使用keys命令, 尤其是keys *

  1. 办公环境
  2. 开发环境 后端程序开发的环境, 硬件配置高
  3. 测试环境 测试工程师使用的
    4.线上环境/生产环境 外界用户可以访问到的

2. exists

在这里插入图片描述

判断key是否存在, 返回key存在的个数(针对多个key是有用的)
时间复杂度: O(1)
redis组织这些key就是按照哈希表的方式来组织的

redis自身的这些键值对, 是通过哈希表的方式来组织的, redis具体的某个值, 又可以是多种数据结构
在这里插入图片描述

3. del

删除指定的key, 可以一次删除一个或多个
在这里插入图片描述
返回删除key的个数(针对多个key是有用的)
时间复杂度: O(1)
在这里插入图片描述
如果redis作为缓存, redis中存的是热点数据, 全量数据是在mysql中存着, 那么redis使用del, 删除几个key, 一般来说问题不大, 相比之下, 如果是mysql数据, 哪怕误删了一个数据, 都可能是影响很大的
如果redis作为数据库, 此时误删数据影响就大了

4. expire

给指定的key设置过期时间, 单位是秒, key存活超出这个指定的值, 就会被自动删除
必须是针对已经存在的key设置过期时间

在这里插入图片描述
(pexpire key 毫秒)

返回0设置失败, 返回1设置成功
时间复杂度: O(1)
在这里插入图片描述

5. ttl

time to live 查看当前key的过期时间还剩多少
在这里插入图片描述
(pttl key )
返回值: 剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在
时间复杂度: O(1)
在这里插入图片描述

redis 的 key 的过期策略是怎么实现的?
redis的整体策略是: 定期删除惰性删除 相结合
惰性删除: 假设key已经过期, 但暂时还没有删除, 后面如果有一次访问, 正好用好这个key, 于是这个访问就会让redis服务器触发删除key的操作, 同时再返回一个nil
定期删除: 每次抽取一部分, 进行验证过期时间, 保证验证的过程足够快
(因为redis是单线程的程序, 如果扫描过期key消耗的时间太多了, 就可能导致正常处理请求命令就阻塞了)
上述过期策略, 任然可能有很多过期的key被残留, redis又提供了一系列的内存淘汰策略

6. type

返回key对应value的数据类型
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三. redis 常见的数据结构及内部编码

在这里插入图片描述
redis在底层实现这些数据结构的时候, 会在源码层面, 针对上述实现进行特定的优化(编码方式可能有变数), 达到节省时间/空间 的效果
同一个数据类型, 背后可能编码方式是不同的, 会根据具体场景优化
redis自动适应, 程序猿使用时是感觉不到的
在这里插入图片描述

  1. raw
    最基本的字符串, 底层就是一个byte数组在存放数据
  2. int
    当value是个整数的时候, 此时可能redis会直接使用int来存储数据
    redis通常也可以用来实现"计数"这样的功能
  3. embstr
    针对短字符串进行的特殊优化
  4. hashtable
    最基本的哈希表
  5. ziplist
    压缩列表, 在哈希表中元素比较少的时候, 并且value的值长度比较短, 可能会优化成ziplist

压缩: 压缩的本质, 是针对数据进行重新编码, 不同的数据有不同的特点, 结合这些特点进行精妙的设计, 重新编码后, 就能够缩小体积, 但付出的代价就是读写速度慢

  1. linkelist
    链表
  2. ziplist
    压缩列表, 在列表中元素比较少的时候, 可能会优化成ziplist
    (从redis3.2开始, 引入了新的quicklist, 代替上面两个)
  3. hashtable
    最基本的哈希表
  4. inset
    集合里都是整数
  5. skiplist
    跳表, 也是链表, 不同于普通的链表, 每个节点上有多个指针域, 巧妙地搭配这些指针域的指向, 就可以做到, 从跳表上查询元素的时间复杂度是O(logN)
  6. ziplist
    压缩列表, 在列表中元素比较少的时候, 可能会优化成ziplist

object encoding mylist
可以查看底层的编码方式

在这里插入图片描述

四. redis单线程模型

我们知道, 如果多个客户端, 同时对服务器发起请求, 可能会引起线程不安全问题
但是, redis服务器不会发生

redis服务器实际上是单线程模型, 保证了当前收到的多个请求是串行执行的
多个请求同时到达redis服务器, 也是要先在队列中排队, 等待redis服务器一个一个取出里面的命令再执行
微观上讲, redis服务器是串行/顺序执行这么多命令的

总结: redis只使用一个线程, 来处理所有的命令请求, 但不是说redis服务器进程内部真的只有一个线程, 其他也有线程, 多个线程是在处理网络IO

redis之所以能够使用单线程工作, 是因为redis的核心业务逻辑, 都是短平快的, 不太消耗cpu资源, 单线程可以处理
但单线程带来的弊端就是, 必须特别小心, 某个操作占用时间长, 阻塞其他命令执行

redis虽然是单线程模型, 为啥效率那么高, 速度那么快?

  1. redis访问内存, 数据库访问硬盘
  2. redis的核心业务, 比数据库的核心功能更简单(redis干的活少, 提供的功能相比mysql也是少了不少)
  3. 单线程模型, 避免了一些不必要的线程竞争开销
  4. 处理网络IO, 使用了epoll这样的IO多路复用机制

IO多路复用:
概念: 一个线程, 管理多个socket
针对TCP来说, 服务器每次要服务一个客户端, 都需要给客户端安排一个socket
一个服务器多个客户端, 同时就有多个socket
很多情况下, 每个客户端和服务器之间的通信没有那么频繁, 此时, 这么多socket大部分时间是静默的, 上面是没有数据需要传输的
所以, 同一时刻, 只有少数socket活跃, 所以引入IO多路复用, 一个线程处理多个socket

IO多路复用, 是操作系统给程序猿提供的机制, 提供了一套API, 内部的功能都是操作系统内核实现的
Linux上提供了IO多路复用, 主要有三套: select, poll, epoll
epoll 时间通知/回调机制

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

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

相关文章

哈希及其模拟实现

1.哈希的概念 顺序结构以及平衡树中,元素的关键码与其存储位置之间没有对应的关系。因此,在查找一个元素时,必须要经过关键码的多次比较。顺序查找的时间复杂度为O(N),平衡树中为树的高度,即O(log_2 N),搜…

k8s,声明式API对象理解

命令式API 比如: 先kubectl create,再replace的操作,我们称为命令式配置文件操作 kubectl replace的执行过程,是使用新的YAML文件中的API对象,替换原有的API对象;而kubectl apply,则是执行了一…

开源ISP介绍(1)——开源ISP的Vivado框架搭建

开源github链接:bxinquan/zynq_cam_isp_demo: 基于verilog实现了ISP图像处理IP 国内Gitee链接:zynq_cam_isp: 开源ISP项目 基于以上开源链接移植项目到正点原子领航者Zynq7020开发板,并对该项目的Vivddo工程进行架构详解,后续会…

[Redis#13] cpp-redis接口 | set | hash |zset

目录 Set 1. Sadd 和 Smembers 2. Sismember 3. Scard 4. Spop 5. Sinter 6. Sinter store Hash 1. Hset 和 Hget 2. Hexists 3. Hdel 4. Hkeys 和 Hvals 5. Hmget 和 Hmset Zset 1. Zadd 和 Zrange 2. Zcard 3. Zrem 4. Zscore cpp-redis 的学习 主要关注于…

GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集

2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集,目的评估视觉-语言模型(VLM)在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白,提供了超过10,000个经过人工验证的指…

设计模式 更新ing

设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客&#xff0…

nlp培训重点

1. SGD梯度下降公式 当梯度大于0时,变小,往左边找梯度接近0的值。 当梯度小于0时,减去一个负数会变大,往右边找梯度接近0的值,此时梯度从负数到0上升 2.Adam优化器实现原理 #coding:utf8import torch import torch.n…

电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用

文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码,比如写一个小程序使电脑关机&#xf…

基础入门-Web应用OSS存储负载均衡CDN加速反向代理WAF防护部署影响

知识点: 1、基础入门-Web应用-防护产品-WAF保护 2、基础入门-Web应用-加速服务-CDN节点 3、基础入门-Web应用-文件托管-OSS存储 4、基础入门-Web应用-通讯服务-反向代理 5、基础入门-Web应用-运维安全-负载均衡 一、演示案例-Web-拓展架构-WAF保护-拦截攻击 原理&a…

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年,OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是,在AI驱动的…

002-日志增强版

日志增强版 一、需求二、引入依赖三、配置日志处理切面四、配置RequestWrapper五、效果展示 一、需求 需要打印请求参数和返回参数 二、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop<…

Spire.PDF for .NET【页面设置】演示:旋放大 PDF 边距而不改变页面大小

PDF 页边距是正文内容和页面边缘之间的空白。与 Word 不同&#xff0c;PDF 文档中的页边距不易修改&#xff0c;因为 Adobe 不提供任何功能供用户自由操作页边距。但是&#xff0c;您可以更改页面缩放比例&#xff08;放大/压缩内容&#xff09;或裁剪页面以获得合适的页边距。…

服务器数据恢复—EVA存储硬盘磁头和盘片损坏离线的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台HP EVA存储中有23块硬盘&#xff0c;挂接到一台windows server操作系统的服务器。 EVA存储上有三个硬盘指示灯亮黄灯&#xff0c;此刻存储还能正常使用。管理员在更换硬盘的过程中&#xff0c;又出现一块硬盘对应的指示灯亮黄…

探索仓颉编程语言:官网上线,在线体验与版本下载全面启航

文章目录 每日一句正能量前言什么是仓颉编程语言仓颉编程语言的来历如何使用仓颉编程语言在线版本版本下载后记 每日一句正能量 当你被孤独感驱使着去寻找远离孤独的方法时&#xff0c;会处于一种非常可怕的状态。因为无法和自己相处的人也很难和别人相处&#xff0c;无法和别人…

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置&#xff0c;可以按下图所示寻找位置&#xff0c;也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly&#xff1a;自动帮我们优化导入的包Optimize imports on the fly&#xff1a;自动去掉一些没有用到的包 禁止导…

【时时三省】(C语言基础)结构体的自引用

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 结构体的自引用 在结构中包含一个类型为该结构体本身的成员是否可以呢&#xff1f; 在struct B里面包含了一个结构体struct A叫sa 结构体类型里面是可以包含另一个结构体类型变量作为它的成…

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

宏海科技募资额有所缩减,最大销售和采购都重度依赖美的集团

《港湾商业观察》施子夫 11月29日&#xff0c;北交所上市审核委员会将召开2024年第24次上市委审议会议&#xff0c;届时将审议武汉宏海科技股份有限公司&#xff08;以下简称&#xff0c;宏海科技&#xff09;的首发上会事项。 在上会之前&#xff0c;宏海科技共收到北交所下…

驱动篇的开端

准备 在做之后的动作前&#xff0c;因为win7及其以上的版本默认是不支持DbgPrint&#xff08;大家暂时理解为内核版的printf&#xff09;的打印&#xff0c;所以&#xff0c;为了方便我们的调试&#xff0c;我们先要修改一下注册表 创建一个reg文件然后运行 Windows Registr…

渗透测试--Windows凭证收集

在渗透测试过程中&#xff0c;我们终究会遇到攻陷了某台加域Windows主机的情况。而这种情况下&#xff0c;我们很需要搜集当前主机的凭证信息。为进一步利用这些相互信任的凭证来进行横向打下基础。 在凭证收集中&#xff0c;我们主要有以下场景&#xff1a; 1.lsass.exe的DMP文…