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 key1lpush key2 111 222 333
type key2sadd key3 111 222 333
type key3hset 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

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

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

相关文章

安达发|APS自动排程软件的三种模式

APS自动排程软件是一种用于生产计划和调度的工具,它可以帮助制造企业实现生产过程的优化和效率提升。根据不同的需求和应用场景,APS自动排程软件通常有三种模式:基于模拟仿真模式、基于TOC的模式和扩展以及基于数学建模。下面我将详细介绍这三…

C++面试干货---带你梳理常考的面试题(一)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 1.C和C的区别 1.语法和特性:C是一种过程式编程语言,而C是一种面向对象编程语言。C在C的基础上增加…

基于 STM32U5 片内温度传感器正确测算温度

目录预览 1、引言 2、问题 3、小结 01 引言 STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控晶圆上的温度还是挺好的,以防止芯片过温运行。 02 问题…

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数:获取参数值的字节个数concat(str1,str2,...)函数:字符串拼接upper(str)、lower(str)函数:大小…

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

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

【MySQL】mvcc以及三个重要日志

🍎个人博客:个人主页 🏆个人专栏:【】数据库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 MVCC关键概念: MVCC机制的优点: 三个重要的日志: 重做日志: 回滚日志&am…

从金蝶云星空到四化智造MES(API)通过接口配置打通数据

从金蝶云星空到四化智造MES(API)通过接口配置打通数据 数据源平台:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、…

c语言的数据结构:队列

1.队列存在的实现方式及其存在意义 1.1为什么队列使用单链表实现更好 动态内存分配:链表在C语言中通常使用动态内存分配,这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用,因为队列的大小可以在运…

外链工具,热门的外链工具

在网络推广和搜索引擎优化中,外链工具是提升网站排名和曝光度的关键。本文将介绍一些外链工具,以及它们的作用和用途。 外链工具有哪些? 147SEO工具: 147SEO工具是一款提升网站收录的外链工具,用户可以通过147SEO工具…

antvX6 - Vue自定义节点,并实现多种画布操作,拖拽、缩放、连线、双击、检索等等

一、 首先 antv x6 分为两个版本 低版本和高版本 我这里是使用的2.0版本 并且搭配了相关插件 例如:画布的图形变换、地图等 个人推荐 2.0版本,高版本配置多,可使用相关插件多,但是文档描述小,仍在更新, 低…

JavaWeb之 Web概述

目录 前言1.1 Web和 JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 1.3 JavaWeb 学习内容 前言 博主将用 CSDN 记录 Java 后端开发学习之路上的经验,并将自己整理的编程经验和知识分享出来&a…