Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型

news2024/9/30 12:27:02

通用命令

get() / set()

这是Redis中两个最为核心的命令。

set插入

这里的key 和 value都是字符串,我们可以加双引号 或者单引号,或者不加。 

get查找

如果查询的key值不存在,那么会返回一个 nil ,也就是代表空

 在Redis中命令是不区分大小写的。

这就是Redis最核心的命令和它俩的使用方法了,看起来就像是一个网络版的hash map一样。这也是Redis的一个优势,使用简单 学习成本低。

keys() 

在这里补充一下 Redis全局命令的概念

 Redis支持很多的数据结构,从整体上来说,Redis是键值对结构,key是固定的字符串,但是value实际上会有多种类型,比如:

字符串 哈希表  列表  集合  有序集合,一般来说操作不同的数据结构就会有不同的命令。

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

keys():用来查询当前服务器上匹配的key。

语法:

KEYS pattern

其中 pattern(模式)是包含特殊符号的字符串。

这个pattern存在的意义是为了描述另外的字符串长什么样

pattern的使用规则:

一般生产环境中是禁止使用keys的,尤其是 keys *。 

 注意:keys 命令的时间复杂度 O(N)的,又因为redis是单线程的,所以当数据量很大时,用 keys * 就把redis阻塞了,无法给其他客户端提供服务。

这样带来的结果往往是灾难性的,因为redis作为缓存,它是挡在mysql前,帮mysql分担请求的,如果此时redis阻塞了,那么请求突然就全打往mysql了,mysql可能会突然承受不主压力而挂掉了,如果mysql也挂了,那整个服务差不多也瘫痪了。 

exists()

exists():判断key是否存在。 这里的key可以是多个。

返回值: 有效key的个数

针对多个key来说,这是挺有用的。

 Redis组织这些key就是按照哈希表的方式来组织的。

关于这个命令的时间复杂度 ,官方给出的是 O(N),但是注意,这里的O(N)中的N指的是我们传入的key的个数,不是传统意义上的O(N)。

有两种写法:

如上,第一种写法查询一次,第二种解法查询两次,那么这两种写法有什么区别呢?

我们始终要记住Redis是 客户端 - 服务器结构的程序,而客户端 与 服务器之间是通过网络来通信的,因此分开的写法会产生更多的轮次的网络通信,导致效率变低。

del()

删除指定的key

可以一次删除一个或者多个

时间复杂度 : (N)跟exists一样

返回值:删掉的key的个数 

而Redis删除数据的严重性要看应用场景

不过归根结底还是不要乱删数据。 

expire()

给指定的key设置过期时间

语法:

EXPIRE key seconds

 成功时返回1,失败时返回0

其中seconds的单位是秒。

这个key得是之前就有的,不然这个命令就会执行失败。

时间复杂度 O(1)

这个命令在有时间限制的场景下应用很广泛,比如手机验证码有效时间。

另外还有关于基于redis实现的分布式锁

补充:

一秒对于计算机来说还是很漫长的,所以还有一个命令 : pexpire ,也就是多加了个p,此时seconds的单位就是毫秒了,用法跟 expire是一样的。

ttl() 

查看指定的key的过期时间。单位:秒级

这里的ttl跟网络IP协议那里的TTL是不一样的。

 返回值:

返回剩余的过期时间。如果该key没有关联过期时间返回-1,如果该key不存在返回-2。

同样还有一个命令 : pttl 。用法一样,不过单位是毫秒。 

补充: Redis的key过期策略

Redis的过期策略是怎么实现的呢? 这也是一道经典的面试题。

如果直接遍历所有key的方式来检查哪些key过期了,效率未免太低了。 
对此Redis整体的策略有:

1.定期删除:

周期性的每次抽取一部分key,进行验证过期时间。 Redis会保证这个抽查的速度足够快。

为什么对于定期删除有明确的速度要求,只抽取一部分验证来保证抽查速度快呢?

因为Redis是单线程的程序,它的主要任务都是在单线程中执行的,如果扫描过期的key消耗的时间太多了,就有可能导致正常处理请求命令被阻塞了(产生了类似执行 key * 的效果)。

2.惰性删除:

假设这个key已经过期了,但是暂时还没有删除它,当紧接着后面的一次访问正好用到了这个key,那么服务器就触发了删除key的操作,同时再返回一个nil。

在Redis中这两种删除策略是搭配在一起使用的,但是仍然会存在很多过期的key残留在服务器上,没有及时删除掉,为此Redis还提供了一系列内存淘汰策略。

扩展:

 理解定时器的实现原理

1.基于优先级队列/堆 

正常的队列是先进先出,而优先级队列是按照指定的优先级,优先级高的先出。

这个优先级是可以自定义的。

在Redis过期key销毁的场景中,距离过期时间越近,那么优先级就越高。

我们把设置了过期时间的key放入到这个堆中,那么堆顶元素就是最早会过期的key。

此时定时器只要分配一个线程,去检查这个堆顶,查看堆顶的元素是否过期即可。

也就是不需要遍历所有key,而是只需要检查堆顶元素即可。 

另外,检查堆顶元素的周期也不能太短, 对于下一次检查的时间可以设置为:堆顶元素距离过期的时间。在此期间就让这个线程阻塞挂起就可以了。

另外如果新来了一个元素,那么也会唤醒这个线程,会重新设置下一次的检查时间。

2.基于时间轮实现的定时器

 如图,就是一个循环数组,把时间划分成很多小段,划分的粒度要看实际需求。

时间轮运行的时候有一个指针,这个指针每次会按照固定的时间间隔向前移动(这个时间间隔就是我们划分的时间粒度),每走到一个格子上,就会尝试执行这个格子上链表的所有任务,为什么是尝试呢?假设某个key的过期时间超过了这个时间轮能表示的最大时间,那么就会让这个key多转几圈,然后放到对应格子的链表上。并且在执行销毁任务时,还是会检查一下过期时间的,如果发现还没有到就不会销毁的。

 type()

返回这个key对应的value的数据类型。

注意:Redis中key的类型只有string。

返回类型:
 返回值为none就是没有这个key。

使用示例:

对于操作链表,插入的命令是 lpush 后面跟元素值;对于集合 插入命令是sadd;对于哈希表,插入命令是hset,可见命令都是不一样的。

 常用数据结构

redis常用的数据结构有 字符串,哈希,列表,集合,有序集合。

另外Redis在底层实现这些数据结构的时候,会在源码层面针对上面的数据结构的实现进行特定的优化,来达到节省时间/空间的效果,也就是内部具体的数据结构(编码方式)还会有变数。 

 总结:同一个数据类型,背后的编码实现方式可能是不同的,会根据特定的场景进行优化

比如string类型,当value就是一个整数的时候,此时Redis可能直接会使用int来保存。

再比如hash表,当数据元素比较少时,会用一个ziplist来存储,以此来压缩空间,因为当元素比较少时,它遍历的速度也很快。

 关于为什么要压缩?

再看看list set zset

 并且在有序集合那里,底层的实现有跳表,因为有序集合里的元素是带有权值的,当需要在某个权值范围内遍历的时候,用跳表就比较合适。

 并且在list和zset的ziplist那里,从Redis3.2开始,就引入了新的实现方式:quicklist。

可以使用命令

object encoding key

来查询这个key底层的编码方式

 

关于Redis单线程模型

Redis单线程工作过程 

Redis只用一个线程来处理所有的命令请求。但是不是说Redis服务器内部真的只有一个线程,其他的多线程都是在网络部分处理IO的。

因为Redis实际处理请求是单线程,所以它保证了对收到来自不同客户端的请求的处理是串行化的,也就是不会有线程安全问题。

关于Redis能够使用单线程模型的主要原因:Redis的核心业务逻辑都是 短平快 的,这样的话就不吃CPU资源,也就不吃多核了,所以Redis使用单线程也能很好的工作。

弊端就是:Redis必须特别小心某个操作的时间过长,这样会阻塞其他命令的执行。

 Redis单线程快在哪里?

Redis虽然是单线程,但是为什么效率高,速度快?(经典面试题)

首先 Redis的效率高,速度快  是参照于 数据库:MySQL, Oracle,SQL Server的。

原因:
1.Redis访问的是内存,而MySQL这样的数据库访问的是硬盘。

2.Redis的核心逻辑比那些数据库的核心功能要简单。

3.单线程模型,避免了一些不必要的线程竞争开销。

因为Redis的基本操作都是 短平快的,也就是简单操作一下内存,不是什么特别消耗CPU的操作,就算是多线程也提升不大。

4.处理网络IO的时候,用了epoll这样的多路复用机制。

IO多路复用适合交互不是很频繁,大部分时间都在等的场景,如果交互十分频繁(比如下载文件或者直播),此时还是创建一个线程来处理比较好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop搭建及Springboot集成

文章目录 环境说明下载安装配置单机伪集群配置hadoop-env.sh配置core-sit.xml配置hdfs-site.xml配置 yarn-site.xml配置mapred-site.xml 启动访问web界面 Windows电脑远程调用springBoot 集成 环境说明 使用Hadoop的前提是linux服务器上必须安装java,这里不赘述怎么…

一天学习开发一个APP!PDF转Word文档,Power Platform也能搞定

之前,给大家分享了微软Power Platform开发课程——手把手教你搭建二维码识别器,大家都很感兴趣。听说,很多小伙伴对于PDF转Word文档有困扰,这期我们继续为大家分享Power Platform的开发能力与技巧,怎么通过Power Platf…

[ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题

问题描述 由前一篇文章https://blog.csdn.net/jay547063443/article/details/142059700?fromshareblogdetail&sharetypeblogdetail&sharerId142059700&sharereferPC&sharesourcejay547063443&sharefromfrom_link,移植HDMI-IN部分驱动后出现&a…

什么是 JWT?它是如何工作的?

松哥最近辅导了几个小伙伴秋招,有小伙伴在面小红书时遇到这个问题,这个问题想回答全面还是有些挑战,松哥结合之前的一篇旧文和大伙一起来聊聊。 一 无状态登录 1.1 什么是有状态 有状态服务,即服务端需要记录每次会话的客户端信…

什么牌子的护眼台灯质量好?五款护眼台灯性价比高又好用

如今,市场上的护眼台灯琳琅满目,种类繁多。家长们为了孩子们的视力健康,都会精心挑选合适的台灯。什么牌子的护眼台灯质量好?然而,市面上仍存在一些质量不过关的产品,可能会出现频闪、线路短路、底盘过热、…

生产环境升级mysql流程及配置主从服务

之前写到过mysql升级8.4的文章, 因此不再介绍mysql的安装过程 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客 生产环境升级mysql8.4.x流程 安装mysql 参考之前文章: 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客…

无界购物:线上商城开启便利与智能新潮流-亿发

随着科技的不断进步,线上购物已经成为现代消费者日常生活的重要组成部分。无论是在繁忙的工作间隙,还是在闲暇的周末时光,消费者都能通过线上商城轻松实现购物的愿望。而这一切的背后,是线上商城打破了地理界限,开启了…

【SpringBoot详细教程】-06-Restful风格【持续更新】

点个关注,不迷路 ⾸先,回顾并详细说明⼀下在SSM中使⽤的 Controller 、 RestController 、 RequestMapping 注解。如果您对SpringMVC不熟悉并且还没有尝试过快速⼊⻔案例,建议先看⼀下SSM与Restful相关的内容。 Controller :修饰…

Zynq7000系列中的Quad-SPI(四线制串行外设接口)Flash控制器编程指南

Zynq7000系列中的Quad-SPI(四线制串行外设接口)Flash控制器是一个功能强大的组件,它支持高速数据传输和多种配置模式。以下是基于Zynq7000系列的Quad-SPI Flash控制器编程指南,旨在帮助开发者了解如何配置和使用该控制器。 编程指…

医院配电系统谐波的分析及治理

七次谐波,流入电网。 4.计算机及UPS 目前大部分医院都是通过计算机实现运营和管理工作,计算机数量众多,计算机服务器配有UPS等备用电源,加之个人电脑的开关电源,都是产生谐波的电源。 3医院配电系统谐波设备的治理方…

【Golang】Go语言中时间time相关处理方法

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

微信广告任务平台 ajax_upload 任意文件上传漏洞

0x01 漏洞描述: 微信广告任务平台ajax_upload接口处存在任意文件上传漏洞,攻击者可利用该漏洞将恶意文件上传至服务器,进而可能实现远程代码执行、篡改网站内容或发动其他形式的攻击,严重危及系统与数据安全。 位于控制器中IndexC…

x-cmd pkg | tokei - 代码统计利器,助你快速了解项目进度

目录 简介首次用户技术特点竞品和相关项目进一步阅读 简介 tokei 是一个使用 Rust 编写的显示有关代码统计信息的命令行工具,可以分门别类的统计目录内的代码行数。 tokei 具有良好的跨平台性,可以在 Linux、macOS、Windows 等多种平台上安装运行。 首…

SU03T(语音识别播报模块)

SU03T(语音识别播报模块) 注意:学习模块的方法是最重要的 目录 SU03T(语音识别播报模块) 查找资料 - SU03T 配置固件 1、进入智能公元,并注册登入 2、点击对应的模块,创建产品 3、随便选…

软件测试|数据库常见面试题

在软件测试数据库的面试中,面试官通常会考察应聘者对数据库的理解、SQL语言的应用、数据库性能优化、以及数据库相关的技术栈和工具等方面的知识。以下是一些可能的面试问题及建议的回答思路: 1、什么是关系型数据库,主键,外键&am…

揭秘网络钓鱼:如何识破并防范这场数字时代的诈骗游戏

网络钓鱼是一种网络攻击,它利用伪装的电子邮件欺骗收件人提供信息、下载恶意软件或采取其他期望的行动。 网络钓鱼是网络害虫,自20世纪90年代初从暗网出现以来,至今仍危害全球。根据SlashNext的报告,2023年平均每天有31,000次网络…

SpringCloudAlibaba的nacos启动注册实现

首先安装nacos,注意看清楚版本号码,后面设置pom依赖的时候有用。 安装地址:Nacos 快速开始 | Nacos 官网 选择这里: 然后在这个跳转的页面中,找到你需要的版本,比如选择2.0.4 进入之后,选择你…

软考题-数据库2-数据模型/ER图/关系模式规范化

一、概念数据模型-ER图 1.概念数据模型-ER图的构件-属性的分类 属性分多值属性和单值属性,题目已经给出联系方式的值有手机电话和办公室电话,所以是多值属性 派生属性是由其他属性而来,年龄来自于出生年月 部门号是EMP表的外键二、关系模式 …

vue-element 表格组合查询 - fc-table-search 组件封装

开发目的 解决搜索form参数读取,配合异步请求,更新渲染数据;支持自适应高度,分页查询,搜索查询/重置。 额外提供formater类型:标签定义,金额,时间格式化,跨页勾选&#x…

Minstrel自动生成结构化提示,让AI为AI写提示词的多代理提示生成框架

在人工智能快速发展的今天,如何有效利用大型语言模型(LLMs)成为了一个普遍关注的话题。这是9月份的一篇论文,提出了LangGPT结构化提示框架和Minstrel多代理提示生成系统,为非AI专家使用LLMs提供了强大支持。 对于非人…