01、Redis初认识

news2025/1/10 20:54:47

一、简介

Redis,Remote Dictionary Server ,远程字典服务。它是由一个意大利人使用C语言开发的,支持网络、可基于内存也可以持久化的日志型、NoSQL内存数据库,其提供了多种语言的API。

为什么把Reids称为字典服务?

这个是因为Redis是一个key-value存储系统,其存储value类型有:String(字符串)、List(链表)、Set(集合)、Zset(sorted set有序集合)和Hash(哈希类型)...

关于NoSQL

NoSQL("non-relational","Not Only SQL"),泛指非关系型的数据库。随着互联网web2.0网站兴起,传统的关系型数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站显得有点力不从心,出现了很多难以克服的问题,而非关系型数据库则由于本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多种数据种类带来的挑战,特别是大数据应用难题。

NoSQL数据库的分类

  • 键值存储数据库
    • 像Map一样的key-value对,典型代表:Redis
  • 列存储数据库
    • 关系型数据库典型的就是行存储的数据库。其按行存储的数据在物理层面占用的是连续的存储空间,不适合海量数据存储,而列存储则可以实现分布式存储,适合海量存储,典型代表:HBase
  • 文档型数据库
    • 它是NoSQL与关系型数据库的结合,最像关系型数据库的NoSQL,典型代表就是MongoDB
  • 图形(Graph)数据库
    • 用于存放一个节点关系的数据库,比如用来描述不同人之间的关系,典型代表:Neo4J

二、Redis用途

Redis在生产中使用最多的场景就是做数据缓存

根据Redis缓存的数据与DBMS中数据的同步性划分,缓存一般分为两类:实时同步缓存和阶段性同步缓存

实时同步缓存

DBMS中的数据更新后,Redis缓存中存放的相关数据会立即清除,以促使再有对这个数据的的请求到来时,必须先从DBMS中查询获取到最新数据,然后再写入到Redis。

阶段性同步缓存

阶段性同步缓存是指Redis中的数据允许在一段时间内与DBMS中数据不完全一致。而这个时间段就是缓存数据的过期时间。

针对于阶段性缓存数据,可以在服务器启动的预热阶段就先放到缓存中,这可以避免第一次用户请求时走不到缓存导致RT过高的问题。

三、Redis特性

能做缓存的技术和中间件很多,如:mybaits自带有二级缓存,Memched等等,但是生产中做缓存的产品基本都会选择redis,因为redis具有其它产品所不具备的特性:

  • 性能极高,读的速度可以达到11W次/s,写的速度可以达到8W次/s
  • 简单稳定
  • 支持持久化,有两种持久化方式:RDB、AOF
  • 高可用集群
  • 支持丰富的数据类型,期中value支持的类型包含:String(字符串)、List(链表)、Set(集合)、Zset(sorted set 有序集合)、Hash(哈希)等,除此外还有BitMap,HyperLogLog,Geospatial类型
    • BitMap:一般用于大数据量的二值性统计
    • HyperLogLog:用于对数据量超级庞大的日志做去重统计
    • Geospatial:主要用于地理位置相关的计算
  • 功能强大
  • 客户端语言广泛
  • 支持ACL权限控制
    • ACL,Access Control List,访问控制列表,是一种细粒度的权限管理策略,可以针对任意用户与组进行权限控制,目前大多数Unix和Linux 2.6以后版本已经支持ACL
    • Unix与Linux系统默认使用的是UGO(User Group Ohter)权限控制策略,这是一种粗粒度的权限管理策略
  • 支持多线程IO模型

四、Redis的IO模型

Redis客户端提交的各种请求是如何最终被Redis处理的?Redis客户端请求所采用的处理架构,称为Redis的IO模型。不同的版本的Redis采用的IO模型是不相同的。

单线程模型

Redis 3.0及之前的版本,使用的是纯粹的单线程模型,所有客户端的请求全由一个线程来处理。

这个单线程的性能也是非常好的,官方给出来的QPS可以达到8w~10w

为什么可以达到这么高的QPS?其主要原因有如下两个:

  1. 它是内存中处理的,处理请求无非就是连接请求、关闭连接请求,连接上后就是读写了,这个读写在内存中操作是非常快的
  2. 单线程的可维护性高,没有读写并发的问题 

混合线程模型

这里的的混合线指的是对于一些IO的操作在主线程上开了一此子线程来进行处理

多线程模型

 

 多线程IO模型中的“多线程”仅用于接收、解析客户端的请求,然后把解析出来的请求写到任务队列当中,而对于具体的任务还是由主线程处理的,这样的话用户就无需考虑多线程的问题、无需考虑事务控制、无需考虑你LPUSH/LPOP等命令的执行顺序问题。

单线程与多线程优缺点总结

单线程模型

优点:可维护性高、性能好。不存在并发读写情况,所以也就不存在执行顺序的不确定性问题,不存在线程切换的开销,不存在死锁的问题,不存在为了数据安全而进行的加锁和解锁开销。

缺点:性能会受到影响,由于单线程只能使用一个处理器,所以会形成处理器的浪费

多线程模型

优点:结合了多线程与单线程的优点,避开了它们的所有不足

缺点:它并不是一个真正意义上的“多线程”,因为真正处理“任务”的线程仍是单线程,所以对性能还是有一些影响的。

关于Redis中多路复用选择器

在redis当中多路复用的多路选择器算法有:select模型、poll模型、epoll模型

在这些算法中底层使用的数据结构是不一样的,select模型使用的是数组;poll模型使用的是链表,它们两者是一样的的但是与epoll不一样。

常用的使用poll,而为select模型性能比较低,它采用数组,长度是固定的如果涉及到扩容比较消耗性能。

poll模型,它的选择算法使用轮询算法,一 个一个去找socket连接,确认是否就绪,如果就绪就使用,这个模型对客户端的就绪处理是有延迟的,因为它需要去遍历其它的,只是遍历到这个就绪的客户端连接才知道它是就绪的了

epoll模型,它的选择算法使用回调方法,在事件分发器中注册监听就绪事件,一旦就绪就可以进行操作(根据就绪事件发生后处理方式不同又可以分为LT模型与ET模型),如果存在多个就绪的,它的内部也有一个队列,逐个进行处理。

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

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

相关文章

【2025 Rust学习 --- 10 运算符重载】

重载操作符 算术运算符与按位运算符 Rust 中&#xff0c;表达式 a b 实际上是 a.add(b) 的简写形式&#xff0c;也就是对标准库 中 std::ops::Add 特型的 add 方法的调用。Rust 的标准数值类型都实现了 std::ops::Add。 trait Add<Rhs Self> {type Output;fn add(se…

node-sass@4.14.1报错的最终解决方案分享

输入npm i全安装文件所需的依赖的时候&#xff0c;博主是使用sass去书写的&#xff0c;使用的是node-sass4.14.1和sass-loader7.3.1的版本的&#xff0c;安装的时候老是出现错误&#xff0c; node-sass4.14.1版本不再被支持的原因 node-sass 是一个基于 LibSass 的 Node.js 绑…

LabVIEW大数据有什么应用场景?

LabVIEW在处理大数据时主要依赖于其强大的数据采集、信号处理、控制、以及实时系统的功能。以下是一些典型的应用场景&#xff1a; ​ 1. 工业自动化与制造 数据采集与监控&#xff1a;在生产线上&#xff0c;LabVIEW可以用来收集大量的传感器数据&#xff08;如温度、压力、湿…

深入理解Mybatis原理》MyBatis的sqlSessi

sqlSessionFactory 与 SqlSession 正如其名&#xff0c;Sqlsession对应着一次数据库会话。由于数据库会话不是永久的&#xff0c;因此Sqlsession的生命周期也不应该是永久的&#xff0c;相反&#xff0c;在你每次访问数据库时都需要创建它&#xff08;当然并不是说在Sqlsession…

【OAuth2系列】如何使用OAuth 2.0实现安全授权?详解四种授权方式

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【OAuth2系列】集成微…

Open WebUI 与 AnythingLLM 安装部署

在前文 Ollama私有化部署大语言模型LLM&#xff08;上&#xff09;-CSDN博客 中通过Ollama来搭建运行私有化大语言模型&#xff0c;但缺少用户交互的界面&#xff0c;特别是Web可视化界面。 对此&#xff0c;本文以Open WebUI和AnythingLLM为例分别作为Ollama的前端Web可视化界…

如何稳定使用 O1 / O1 Pro,让“降智”现象不再困扰?

近期&#xff0c;不少朋友在使用 O1 或 O1 Pro 模型时&#xff0c;都会碰到“降智”或“忽高忽低”的智力波动&#xff0c;比如无法识图、无法生成图片、甚至回答准确度也不稳定。面对这些问题&#xff0c;你是不是也感到头疼呢&#xff1f; 为了找到更可靠的解决办法&#xf…

RK3562编译Android13 ROOT固件教程,触觉智能开发板演示

本文介绍编译Android13 ROOT权限固件的方法&#xff0c;触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。 关闭seli…

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景&#xff0c;并在其中添加一个旋转的球体。通过设置不同的光照参数&#xff0c;可以观察到球体表面材质的变化。 知识点 WebGLRenderer …

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹&#xff0c;只保留部分有用的文件 3.项目配置&#xff1a; 配置项目的icon 配置项目的标题 配置项目的别名等&#xff08;craco.config.ts&…

解决GitHub上的README.md文件的图片内容不能正常显示问题

一、问题描述 我们将项目推送到GitHub上后&#xff0c;原本在本地编写配置好可展现的相对路径图片内容&#xff0c;到了GitHub上却不能够正常显示图片内容&#xff0c;我们希望能够在GitHub上正常显示图片&#xff0c;如下图所示&#xff1a; 二、问题分析 现状&#xff1a;REA…

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…

开关不一定是开关灯用 - 命令模式(Command Pattern)

命令模式&#xff08;Command Pattern&#xff09; 命令模式&#xff08;Command Pattern&#xff09;命令设计模式命令设计模式结构图命令设计模式涉及的角色 talk is cheap&#xff0c; show you my code总结 命令模式&#xff08;Command Pattern&#xff09; 命令模式&…

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后&#xff0c;除了用户做的界面&#xff0c;最上面还有一个框&#xff0c;这就是window frame框。对于界面的元素&#xff0c;它们的原点是Qt界面的左上角或win…

LabVIEW水轮发电机组振动摆度故障诊断

本文介绍了基于LabVIEW的水轮发电机组振动摆度故障诊断系统的设计与实施过程。系统在通过高效的故障诊断功能&#xff0c;实现水轮发电机组的振动、温度等关键指标的实时监控与智能分析&#xff0c;从而提高电力设备的可靠性和安全性。 ​ 项目背景 随着电力行业对设备稳定性…

【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)

本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果&#xff1a; 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址&#xff1a;https://qianfan.cloud.baidu.com/ 注册成功后&…

ARM交叉编译Boost库

Boost下载&#xff1a;点击跳转 编译过程&#xff1a; 生成project-config.jam ./bootstrap.sh --with-librariesfilesystem,thread --with-toolsetgcc 2. 修改project-config.jam&#xff08;位于第12行附近&#xff09; if ! gcc in [ feature.values <toolset> ] …

Cpp::C++11右值引用与移动构造(30)

文章目录 前言一、左值 & 右值二、左值引用 & 右值引用三、右值引用的意义四、右值引用和移动语义五、与编译器优化做的对比六、右值引用引用左值七、一些小问题能否将函数返回值设为 右值引用&#xff1f;函数传值返回&#xff0c;但在返回时能否手动 move 返回值&…

LeetCode:108.将有序数组转换为二叉搜索树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;108.将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff…

基于Redisson实现重入锁

一. 分布式锁基础 在分布式系统中&#xff0c;当多个客户端&#xff08;应用实例&#xff09;需要访问同一资源时&#xff0c;可以使用分布式锁来确保同一时刻只有一个客户端能访问该资源。Redis作为高性能的内存数据库&#xff0c;提供了基于键值对的分布式锁实现&#xff0c…