Redis【2】—— Redis特性 与 数据类型

Redis【2】—— Redis特性 与 数据类型

  • 二、Redis 的基本介绍
    • (一)关于 Redis
      • 1. 特性
        • (1)在内存中存储数据
        • (2)可编程
        • (3)可扩展
        • (4)持久化
        • (5)多集群
        • (6)高可用
        • (7)快速高效 *
      • 2. 应用场景
        • (1)把 `Redis`当数据库
        • (2)把`Redis`当`Caching`和 `session`
        • (3)把`Redis`当消息队列
    • (二)基本指令
  • 三、数据类型 与 编码方式
    • (一)数据类型
    • (二)内部编码

二、Redis 的基本介绍

(一)关于 Redis

简单来说 Redis 是一个在内存中存储数据的中间件。

1. 特性

(1)在内存中存储数据

使用键值对的方式存储数据,其中**key**都是**string****value****都是则可以是不同数据结构的数据。**与 MySQL相比,Redis这种以“键值对”的方式组织数据的方式,称为:非关系型数据库。

(2)可编程

可以直接通过简单的 交互式命令 操作,也可以通过 **Lua****脚本 **进行操作。

(3)可扩展

Redis提供了一组API,可以通过 CC++Rust 语言编写的动态链接库(可以理解为:函数库。在 **windows**上是**.ddl** 文件,在**Linux**上是 **.so** 文件),在原有的功能基础上再进行扩展。

(4)持久化

明明Redis是在内存中存储数据,那么进程退出 或者 系统重启,都会导致数据的丢失,那怎么能说持久化呢?其实,这里的持久化是指:**Redis**也会把数据存储在硬盘上,也就说:硬盘上备份了Redis的数据。重启的**Redis**只需要加载硬盘中的备份数据即可,这样Redis的内存就能恢复到重启前的状态。

(5)多集群

一个 Redis存储的数据是有限的,为了尽可能多地使用到 Redis的特性,就需要引入多台主机,**Redis**部署到多个节点上。这样每个 Redis 都能存储一部分数据。能够被部署在多台机器上的Redis也就拥有了多集群的特点。

(6)高可用

Redis支持“主从”结构,从节点就相当于主节点的备份。

(7)快速高效 *

为什么Redis会快呢?主要是一下四点原因:

  • 访问硬件上看,第一点也是Redis特性的第一点,**Redis**数据存储在内存中,访问内存的速度 比 访问硬盘和数据库的速度快得多。
  • 业务角度上看,Redis核心功能的逻辑简单,大部分是操作内存的数据结构。相比起MySQL还有聚合函数,链表查询等…Redis的应用场景比较简单。
  • 网络角度上看,Redis使用了 **IO多路复用 **的方式(epoll),使用了一个线程管理多个 socket,即:同时去买三份小吃,哪一份完成就先响应哪一份,注意
  • 实现模型上看,Redis使用的是 **单线程 模型。**这减少了不必要的线程竞争开销。这里多解释一下,多线程能提高效率是有场景要求的,即 CPU密集性任务 的场景。此时,多个线程才能够充分利用 CPU的多核资源

2. 应用场景

(1)把 Redis当数据库

这里指的是把 Redis当作全量数据库,也就是说 这些数据并不能丢失,而且这部分被存储的数据不仅多,而且需要快速被搜索到。想要这样使用Redis就需要不少的硬件资源,而这只能发挥公司的“钞”能力了。

(2)把RedisCachingsession

当作缓存(Caching)的话,其实就是把热点数据提出来存储到**Redis**,也就是所谓的**冷热分离。**此时的Redis存储部分数据,当Redis重启之后,数据依然可以从MySQL中读取回来。

当作会话(Session)的意思其实是:使用**Redis**存储会话信息,所有的服务器最终统一地到 **Redis**中获取会话信息即可。这样就不需要负载均衡器 根据 **userID** 做会话保持
image.png

(3)把Redis当消息队列

消息队列是一种在应用程序之间传递消息的通信模式。它允许发送者(生产者)将消息发送到一个队列中,然后接收者(消费者)可以从队列中获取并处理这些消息。消息队列实现了异步通信机制,提供了解耦和缓冲的功能,使得不同的应用程序或服务可以在时间和空间上解耦,以便更高效地进行通信。

1)消息队列通常由以下组件构成:

  • 消息:要传递的数据或信息。
  • 队列:存储消息的容器,通常是先进先出(FIFO)的数据结构。
  • 生产者:将消息发送到队列的应用程序或服务。
  • 消费者:从队列中获取消息并进行处理的应用程序或服务。
  • 中间件:支持消息传递的中间软件,负责管理和维护队列,确保消息的可靠传递和处理。

2)消息队列的优点包括:

  • 异步处理:生产者和消费者之间解耦,不需要即时响应,可以自由选择处理消息的时间和顺序。
  • 削峰填谷:通过缓冲消息,消费者可以按照自身处理能力来消化消息,避免了系统因突发高峰而崩溃。
  • 可伸缩性:可以根据需求增加或减少生产者和消费者的数量,以适应系统的负载变化。
  • 系统解耦:不同的应用程序或服务之间通过消息队列进行通信,解耦了彼此之间的依赖关系,提高了系统的灵活性和可维护性。
  • 可靠性:消息队列通常会提供持久化机制来确保消息的可靠传递,防止消息丢失。

消息队列在分布式系统、微服务架构、任务调度等场景下具有广泛的应用。一些常见的消息队列实现包括 RabbitMQ、Apache Kafka、ActiveMQ 等。但是,如果不想使用消息队列的功能,又不想引入过多的中间件,可以考虑只用Redis做消息队列。

(二)基本指令

redis-server /etc/redis/redis.conf # 启动Redis
redis-cli # 进入客户端
set key1 value1
get key1
get key2 # 不存在返回nil

image.png

# 匹配模式
# ? 一个字符
# * 多个字符
# [xxxx] 出现什么匹配什么
# [^xxx] 出现什么排除什么
# [a-z] 出现范围(一位字符)

注意在生产环境上不要随便使用 keys * ,原因很简单:我们能够清晰地感受到这个操作的时间复杂度是 O(n),而Redis是一个单线程服务器,且生产环境上的key是很多的,那么这个操作执行的时间就很长,整Redis服务器就会被阻塞住,无法给其他客户端提供服务!此时,其余的Redis操作就会超时。
image.png

exists key1 key2 ...
# 时间复杂度是 O(N) ,N 是 key 的个数

image.png
注意下方的两种写法,上方那种优于下方的写法!因为**Redis****是一个 客户端-服务器 结构的程序,客户端和服务器之间通过网络来进行通信!**第二种分开写的方法相当于有两次网络请求,两次的开销必然是大于一次的。
image.png

keys * # 先查看一下 keys 有多少
del hllo 
del hallo hello hzllo # 返回的是个数

image.png
删除数据是否危险还是要看场景!在把Redis当作缓存的场景下,Redis存储的是热点数据(全量数据是存储在MySQL中的),如果只是删除一两条,那其实影响不大,因为热点数据也很有可能会更新,实在不行就放过几条去读MySQL。但如果一下子删除太多,就容易把系统搞挂。因为Redis是在帮MySQL分担压力的,如果分担不了那压力自然就给到MySQL了,大量的请求很可能就把 MySQL冲击跨了。

set k v
get k
expire k 5 # 单位是秒,pexpire 单位是毫秒
ttl k # 当被删除之后返回的结果就是 -2;如果没有关联过期时间返回结果就是 -1;pttl 单位是毫秒

这个功能还是非常有用的,常见的场景比如:验证码,优惠券过期 等。
那么这个过期删除策略是怎么样的呢?主要有两个:定期删除 + 惰性删除。
所谓惰性删除就是:如果key已经过期,但是并没有请求来查询,那么这个key就暂时不会被删除,直到被请求访问的时候Redis才会删除key,同时返回一个nil。但是这样并不靠谱的。**因此还需要结合“定时删除”。**不过,当有很多key时,全部过滤一遍成本可能会很高,占用的时间可能会边长,占用时间一旦过长,就很可能出现跟上方keys *一样的情况!因此,定期删除只是抽取一部分**key**已经检查
注意:Redis并没有使用定时删除的策略。就算采用也不必未每一个key设置一个定时器,未引入的原因很可能是因为Redis最初是单线程的设计模式,如果使用定时器,势必要引入多线程,这与设计的初衷相悖。
但是上方两种策略依旧不能让人满意,因此**Redis**还有内存淘汰机制
image.png
image.png
image.png

# 常见数据类型有以下几种:
# none、string、list、set、zset、hash、stream
keys *
type key1

lpush key2 111 222 333
type key2

sadd key3 111 222 333
type key3

hset key4 k1 v1 k2 v2
type key4

image.png

三、数据类型 与 编码方式

(一)数据类型

image.png

上方只是常用的Redis数据类型,Redis还有其他的若干种数据类型,但适用的场景可能没这么广。这里还需要说明的是:**Redis****底层在实现上述数据结构时,会在源码层面针对上述实现进行特定优化,以 节省时间、节省空间。**也就是说:Redis会承诺相关的操作时间复杂度不变,但背后实现的细节并不一定是所见的标准数据类型,在特定场景下,会采用其他数据类型实现。

(二)内部编码

image.png

为什么hash要压缩为ziplist
因为在Redis中的key很多,对于的valuehash的也很多,但是每个hash不是很大的情况下压缩成ziplist就会比较节省空间,整个的空间占用率就会下降 且 查询速度并没有降下来。

跳表是什么?
跳表也是链表,只不过每个节点上有多个指针域。根据设置的特殊规则,使用跳表查询元素的时间复杂度是O(logN)

keys *
type key1
object encoding key1 # error 注意'object' 需要大写
OBJECT encoding key1

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

场发射透射电子显微镜(FETEM)技术壁垒高 我国具备研制能力

场发射透射电子显微镜(FETEM)技术壁垒高 我国具备研制能力 场发射透射电子显微镜,简称场发射透射电镜,英文简称FETEM,产品主要由场发射电子枪、高压电源、照明透镜、偏转系统、物镜、投影镜、探测器、样品系统等组成。…

PlantUML简介

PlantUML简介 plantUML是一款开源的UML图绘制工具,支持通过文本来生成图形,使用起来非常高效。可以支持时序图、类图、对象图、活动图、思维导图等图形的绘制。你可以在IDEA中安装插件来使用PlantUML, 或者在Visual Studio Code中安装插件。 也可以在dra…

Nacos环境搭建 -- 服务注册与发现

为什么需要服务治理 在未引入服务治理模块之前,服务之间的通信是服务间直接发起并调用来实现的。只要知道了对应服务的服务名称、IP地址、端口号,就能够发起服务通信。比如A服务的IP地址为192.168.1.100:9000,B服务直接向该IP地址发起请求就…

超好看的下载页HTML源码分享

超好看的下载页HTML源码分享,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 下载地址:https://www.qqmu.com/2337.html

Java基于SpringBoot的网上租赁系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上租贸系统,来满足用户网络商品租赁的需求。 本网上租贸系统应用Java技术,MYSQL数据库存储数据,基于Spring Boot框架开发。在网站的整个开发过程中,首先…

NXP实战笔记(十一):32K3xx基于RTD-SDK在S32DS上配置LPSPI(同步、异步、DMA、主机、从机、中断、轮询)

目录 1、概述 2、RTD-SDK配置 2.1、配置目标 2.2、主、从机引脚配置 2.3、时钟配置 2.4、LPSPI配置 2.5、中断配置 2.6、DMA配置(使用DMA才会配置) 2、dma Logic Instance 2.7、RM配置(使用DMA的情况下必须配置此选项) 3、代码实现 1、概述 S32K3_低功耗LPSPI轮询…

Java基于微信小程序的房屋租赁、租房小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

《TCP/IP详解 卷一》第12章 TCP初步介绍

目录 12.1 引言 12.1.1 ARQ和重传 12.1.2 滑动窗口 12.1.3 变量窗口:流量控制和拥塞控制 12.1.4 设置重传的超时值 12.2 TCP的引入 12.2.1 TCP服务模型 12.2.2 TCP可靠性 12.3 TCP头部和封装 12.4 总结 12.1 引言 关于TCP详细内容,原书有5个章…

【YOLO v5 v7 v8 小目标改进】新CNN架构 InceptionNeXt:怎么让大卷积核既好用又快

新CNN架构 InceptionNeXt:怎么让大卷积核既好用又快 提出背景问题: 如何提高大核心卷积的效率,同时保持或提升模型性能? 改进思路MetaNeXtInception深度卷积InceptionNeXt 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 提出背景 论文&am…

【改进算法】【IHAOAVOA】天鹰优化算法和非洲秃鹫混合优化算法

目录 1 主要内容 IHAOAVOA流程图 主要创新点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《IHAOAVOA: An improved hybrid aquila optimizer and African vultures optimization algorithm for global optimization problems》,天鹰优化算法&am…

【c++】理解vec.push_back(vector<int>())

vector<vector> vec; vec.push_back(vector()); vec.back().push_back(10); 定义一个二维向量&#xff08;动态数组&#xff09;: vector<vector> vec; 这行代码定义了一个名为vec的变量&#xff0c;它是一个向量&#xff08;动态数组&#xff09;&#xff0c;其中…

Apache Echarts介绍与入门

介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 入门案例 Apache Echarts官方提供的快…

MySQL误truncate截断后数据恢复2024.3.1

近期很多MySQL数据丢失情况&#xff0c;很多是人为误操作导致。MySQL数据库丢失可能由truncate截断表、delete删除表中数据行、delete删除表、delete删除库、操作系统rm删除数据库文件、硬盘坏道等情况导致。本案例是一个误截断表导致的丢失。 不管哪种情况&#xff0c;第一时…

STM32USART串口数据包

文章目录 前言一、介绍部分数据包两种包装方式&#xff08;分割数据&#xff09;HEX数据包文本数据包 数据包的收发流程数据包的发送数据包的接收固定包长的hex数据包接收可变包长的文本数据包接收 二、实例部分固定包长的hex数据包接收连接线路代码实现 可变包长的文本数据包接…

JavaScript DOM操作笔记记录回忆总结

一、什么是DOM&#xff1f; 1、通过 HTML DOM&#xff0c;可访问 JavaScript HTML 文档的所有元素。 2、当网页被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff08;Document Object Model&#xff09; 二、操作DOM 1、在操作DOM之前&#xff0c;我们需要先获取到…

设计模式-结构型模式-外观模式

外观模式&#xff08;Facade&#xff09;&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。[DP] 首先&#xff0c;定义子系统的各个组件接口和具体实现类&#xff1a; // 子系统组件接…

1美元持有ZKFair PFP-CyberArmy,潜在收益分析

3月2日&#xff0c;ZKFair PFP-CyberArmy 将在 Element 上正式开始Public Sale。

yolov9从头开始训练

yolov9从头开始训练 一、准备数据集 数据集相关文件存放布局如下 yolov9-datasets ├── train │ ├── images │ │ ├── image.jpg │ │ ├── │ └── labels │ ├── image.txt │ ├── ├── valid │ ├── images │ │ ├── image.jpg │ │ ├─…

Android minigbm框架普法

Android minigbm框架普法 引言 假设存在这么一个场景&#xff0c;我的GPU的上层实现走的不是标准的Mesa接口&#xff0c;且GPU也没有提专门配套的gralloc和hwcompoer实现。那么我们的Android要怎么使用到EGL和GLES库呢&#xff0c;并且此GPU驱动是支持drm实现的&#xff0c;也有…

【Sql Server】Update中的From语句,以及常见更新操作方式

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…