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

Redis_11_类型补充+命令补充+RESP

之前我们已经介绍过了Redis常用的类型:String、LIst、Hash、Set、Zset,这些类型应用广泛,频繁使用。

实际上,Redis的类型总共有10种:

类型补充

下面的类型使用较少,因此我们大概讲一下使用场景,需要使用的时候再去翻阅文档即可。

Stream

官方文档的意思就是stream类型可以用来模拟实现这种事件传播的机制~~

将简单点,stream就是一个队列(阻塞队列),是redis作为一个消息队列的重要支撑,属于是List blpop/brpop的升级版本。

Redis geospatial

这个类型主要用来存储坐标(经纬度),存储一些点之后,就可以让用户给定一个坐标,去从工程存储的点里进行查找(按照半径,矩形区域~)

这个功能在“地图”应用非常重要~~

比如搜索当前地区美食:

Redis HyperLogLog

这个类型的应用场景只有一个,估算集合中的元素个数。

我们之前讲过,Set有一个应用场景,统计服务器的UV(用户的访问次数)使用Set当然可以统计UV,但是最大的问题在于,如果UV数据量非常大,Set就会消耗很多的内存空间~~

就阿佘存储userId每个userId按照8个字节算~~

1亿UV就需要消耗8亿字节~~

那有人可能就会觉得,才0.8GB而已啊又不多,就拿集合存不是也行吗?

问题是HyperLogLog可以最多使用12KB空间实现上述效果~~

之所以Set需要消耗这么大的空间,是因为Set需要存储每个元素;而HyperLogLog不需要存储元素的内容,但是能够记录“元素的特征”,从而在新增元素的时候,就能知道当前新增的元素是一个已经存在的元素,还是一个崭新的、第一次出现的元素,它的主要功能是用来计数(记录出当前集合中有多少个不同的严肃,但是不能告诉你这些元素是啥~~)

Redis bitmaps

这个类型叫做位图,主要作用是使用bit位来表示整数。

位图本质上还是一个集合,属于是Set针对整数的特化版本~~

主要作用也是为了节省空间。

咦?那不是和HypeLogLog一样吗?而且HypeLogLog更省空间呢?

不同的是bitmap这里存储元素了!!它既可以存储数字,也可以存储字符串;而HypeLogLog不存储元素内容,只是计数效果~~

而且HypeLogLog存储元素的时候,提取特征的过程是不可逆的!!(信息量丢失了)就像猪肉能给它做成火腿肠,但是火腿肠还原不回猪肉了……

Redis bitfields

它和我们C语言中位域的概念非常相似:

bitfield可以理解成一串二进制序列(字节数组),同时可以把这个字节数组中的某几个位,赋予特定含义,并且可以进行读取/修改/算术运算相关操作~~

位域这个东西,相比与之前的String/hash来说,目的仍然是节省空间。

这个东西主要应用场景:记录补刀数

渐进式遍历

scan

我们之前知道keys这个命令会一次性把整个redis中所有key都获取到,keys*(这个操作比较危险可能会一下子得到太多的key,阻塞redis服务器!)

通过渐进式遍历,就可以躲到,既能够获取到所有的key,同时又不会卡死服务器。此处的渐进式遍历指的是:不是一个命令,把所有的key都拿到。而是每执行一次命令,只获取到其中的一小部分~~这样的话保证当前这一次操作不会太卡~~

要想的到所有的key就需要多次遍历,多次执行渐进式遍历命令~~

渐进式命令其实是一组命令,这一组命令的使用方法是一样的~~

其中的代表命令是scan:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

ps:这里的pattern和keys命令是一样的;count指的是光标,限制这一次遍历能够获取到多少个元素,默认是10;type指定当前要查询的key对应的value的类型。

这里count与MySQL中的limit不一样,MySQL中的limit是精确的,而这里的count只是给redis服务器的一个提示/建议,写入的count和实际返回的key的个数不一定是完全相同的,但是不会差很多~~

count这里的数字,不是说每次遍历都得设置成一样的~~

这里的渐进式遍历,在遍历过程中,不会在服务器这边存储任何的状态信息。此处的遍历是随时可以终止的~~不会对服务器产生任何的副作用~~

那么什么教服务器不会存储状态信息呢?

比如我去餐馆吃饭,都已经吃饱了,还有一些菜还没上来。

此时我就去结账并且问老板还有一些菜没上,能不能退了~~

老板就会赶紧跑到后厨,看了之后,对我说:“菜已经在做了,退不了了~~”

餐馆就相当于服务器,而我就是客户端,我点了很多菜,餐馆就得一样一样做好上来,相当于在遍历很多的key,我遍历了一半之后,我想取消,发现取消不了,服务器这里保存了状态(服务器就已经把菜做上了)

如果我想强行取消,此时服务器的状态仍然保存着,此时就会对服务器的运行造成一定的影响~~

相比之下,redis则没有采取这样的设定!!redis的服务器是不保留任何状态的,遍历时可以随时中断的~~

相当于去超市买东西,扫了一半,你突然说,后面的你不要了,你想直接走,也是可以的~~

此处还需要注意:渐进式遍历scan虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能会导致遍历时键重复遍历或者遗漏,这点务必在实际开发中考虑~~

数据库管理命令

mysql中有一个重要的概念,database。一个mysql服务器上可以有很多个database,一个database上可以有很多个表。

在前面的学习中,感觉上来就是key value~~

其实redis也是有database这样的概念的,只不过不像MySQL那样随意~~

redis中的database是现成的,咱们用户不能创建新的数据库,也不能删除已有的数据库。

默认redis给我们提供了16个数据库0-15,这16个数据库中的数据库是隔离的(相互之间不会有影响)默认情况下使用的就是0号。

select

使用这个命令来切换到目标数据库。

SELECT index

比如:

在0号数据库中,设置一个key为123,此时能够正常获取到key

此时,我们切换到1号数据库中:

此时,再尝试获取,就获取不到了:

dbsize

这个命令可以获取到当前数据库中键值对的个数。

DBSIZE

flushdb

清空当前数据库。

FLUSHDB [ASYNC | SYNC]

ps:这里的async是异步处理,sync是同步处理。

flushall

清空所有数据库。

FLUSHALL

这个我们之前讲过,就不做过多赘述。

Redis客户端介绍

前面学习的主要是各种redis的基本操作/命令。都是在redis命令行客户端,手动执行的。

我们之前讲过:更多的时候,操作redis是使用redis的api,来定制化redis客户端程序,进一步操作redis服务器的。

就像以前学习MySQL的时候,也会涉及到,关于使用idea来操作MySQL服务器:Mybatis/JDBC/

那我们前面学过的redis命令是不是就没有价值了呢?

当然不是的!!redis命令相当于使用代码来执行了~~

RESP

为什么我们能编写出一个自定义的redis客户端呢?

这是因为Redis公开了它们的自定义协议!!

在网络通信的过程中,会用到很多的“协议”。

应用层:一般是自定义协议,但是业界也有很多成熟的应用层协议,HTTP等……Redis此处应用层协议就是自定义的协议~~

传输层:TCP/UDP协议

网络层:IP协议

数据链路层:以太网

物理层

这后续的几个协议都是固定好的,是在系统内核或驱动程序中实现的~~咱们程序员只能选择,不能修改~~

客户端按照这里的应用层协议(传输层还是基于TCP),发送请求,服务器按照这个协议进行解析,再按照这个协议构造响应,客户端再解析这个响应,之所以上述通信能够完成,是因为开发客户端的人和开发服务器的人都清楚地知道协议的细节~~

而Redis的自定义协议就是RESP协议

详解

resp协议的优点:

1、简单好实现。

2、快速进行解析

3、肉眼可读

特点:

1、传输层基于TCP但是又和TCP没有强耦合

2、请求和响应之间的通信模型是一问一答的模式~~(客户端给服务器发一个请求,服务器就返回一个响应)

在响应中不同的类型,返回的格式也是不同的:

那一会我们写代码,真的需要按照上述的协议,解析/构造字符串吗?

不用~~这套协议公开已久~~已经有很多的大佬实现了这套协议的解析/构造~~只需要使用这些大佬们提供的库,就可以简单方便地来实现完成和redis服务器通信的操作了

http://www.dtcms.com/a/600785.html

相关文章:

  • 网站设计哪家便宜seo网站做推广公司
  • 用于感知图像超分辨率的自编码监督(易于理解版本)
  • 地图可视化实践录:空间分析库Turf.js的学习
  • 长沙制作网站公司哪家好广州seo推广营销
  • 11、prometheus-PromQL-5-聚合计算函数
  • (114页PPT)上海x友集团管理咨询及IT规划项目第一期报告管理诊断分析咨询报告(附下载方式)
  • C语言编译器 Visual Studio:实现高效编程与调试环境优化
  • 王树森深度强化学习 DRL(六)连续控制 DDPG + 随机策略
  • 【SatWetCH4 第一期】全球湿地甲烷排放通量估算过程模型 SatWetCH4 介绍
  • Opencv(十一) : 图像缩放
  • 开源 Objective-C IOS 应用开发(四)Xcode工程文件结构
  • 儿童网站 源码html5网站开发教学
  • 编译类语言的特点与应用
  • Python 数组使用方法总结
  • 网站风格变化免费logo在线制作头像
  • 第三章深度解析:智能体“大脑”的底层逻辑——大语言模型技术基石全拆解
  • 100个云计算基础知识
  • 对比 DeepSeek(MLA)、Qwen 和 Llama 系列大模型在 Attention 架构/算法层面的核心设计及理解它们的本质区别。
  • 【C++】List容器模拟实现(超详细)
  • 湖南火电建设有限公司网站龙采哈尔滨建站公司
  • 【PHP反序列化】css夺旗赛
  • ServletLess架构简介
  • 安卓C语言编译器的选择与使用技巧 | 优化C语言编程体验,提升开发效率
  • (三)自然语言处理笔记——Transformer
  • iOS性能分析工具,有UI卡顿、app启动、内存、webview等性能优化解析
  • 电商网站建设 数商云招商码头无忧查询系统
  • 开源 Objective-C IOS 应用开发(三)第一个iPhone的APP
  • (11)(2.2.2) BLHeli32,AM32, and BLHeli_S ESCs(二)
  • Google Chrome v142.0.7444.135 便携增强版
  • [Windows] PDF文件浏览OCR工具1.0