对redis进行深入学习

目录

  • 1. 什么是redis?
    • 1.1 为什么使用redis作为缓存?
      • 1.1.0 数据库(MySQL)与 redis
        • 1. 存储介质不同(408选手应该都懂hh)
        • 2. 数据结构优化
        • 3. I/O模型差异
        • 4. CPU缓存友好性
        • 5. 单线程与多线程差异
        • 6. 持久化与缓存差异
        • 7. 主从复制与分布式差异
      • 1.1.1 Redis 与 Memcached
        • 1. 共同点
        • 2. 区别
    • 1.2 为什么用 Redis 作为 MySQL 的缓存?
      • 1.2.1 高性能
      • 1.2.2 高并发
  • 2. redis数据结构
    • 2.1 String(字符串)
    • 2.2 Hash(哈希)
    • 2.3 List(列表)
    • 2.4 Set(集合)
    • 2.5 Zset(有序集合)
  • 3. 总结

1. 什么是redis?

Redis,就是一种特别快的“数据库”,它把数据存在内存里,让你能超级快地存和取数据。其实就是缓存。
举2个例子:

— Redis,就像是一个超快速的记事本,它能够帮你快速地记录和查找信息。
— 比如说,你去超市购物,每买一样东西就记在记事本上。这样,当你需要知道买了什么或者花了多少钱时,只需要打开记事本一看就清楚了,而不需要翻遍所有的购物袋。
— 再比如,你在网上看视频,Redis就像是一个智能的“最近播放”列表,能记住你最近看过哪些视频,这样下次想看时就能快速找到,而不需要从一大堆视频中慢慢搜索。
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。
Redis 虽说是内存数据库,但是 Redis 其实是会把缓存数据保存到硬盘的,只要保存缓存数据的文件没有丢,缓存数据自然就能恢复。

Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。
除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等。

1.1 为什么使用redis作为缓存?

缓存技术确实有很多种,比如Memcached、Varnish等,但选择Redis作为缓存解决方案的原因有多个,比较一下各种缓存技术。

1.1.0 数据库(MySQL)与 redis

Redis能够提供比传统数据库更快的数据读取速度,主要是由于存储介质差异、数据结构优化、I/O模型差异、CPU缓存友好性、单线程与多线程差异、持久化与缓存差异以及主从复制与分布式差异等多方面因素共同作用的结果。

1. 存储介质不同(408选手应该都懂hh)

从计算机组成原理的角度来看:Redis作为内存数据库,将数据直接存储在RAM中,而RAM的访问速度远高于磁盘。数据库通常将数据存储在磁盘上,即使是内存数据库,也可能需要将数据同步到磁盘以确保持久性。因此,从Redis中读取数据时,可以避免磁盘I/O的延迟,从而提高性能。

2. 数据结构优化

Redis使用高效的数据结构来存储数据,如哈希表、跳跃表等,这些数据结构能够快速地进行数据的查找、插入和删除操作。相比之下,数据库可能使用更为复杂的数据结构(如B树、索引等),在数据操作上可能不如Redis高效。

3. I/O模型差异

Redis采用非阻塞I/O模型(如epoll、kqueue等),能够处理大量并发连接,同时保持较低的系统开销。这种模型使得Redis能够在高并发环境下保持较低的延迟。而数据库通常采用阻塞I/O模型,在高并发场景下可能会受到I/O瓶颈的限制,导致性能下降。

4. CPU缓存友好性

Redis的设计注重CPU缓存的利用,尽量减少CPU缓存的 miss rate(未命中率),从而提高数据访问性能。而数据库系统可能更注重数据的持久性和一致性,导致其设计可能不是那么CPU缓存友好。

5. 单线程与多线程差异

Redis采用单线程模型处理请求,避免了多线程环境下的线程切换和竞态条件问题,简化了开发和维护的复杂性。这种模型减少了上下文切换的开销,提高了CPU的利用率。而数据库系统通常采用多线程模型,在处理请求时可能会涉及到线程切换和锁竞争等问题,影响性能。

6. 持久化与缓存差异

Redis作为缓存系统,主要承担数据读写和缓存任务,可以通过合理的配置和策略,将持久化操作的影响降到最低。而数据库系统通常承担着数据持久化的任务,需要在保证数据安全性和一致性的同时进行数据读写操作。

7. 主从复制与分布式差异

Redis支持主从复制和哨兵模式,可以实现数据的复制和故障恢复,提高了系统的可用性和容错能力。这种模式在Redis中实现得更为简单和高效。而数据库在分布式环境下可能需要更复杂的数据同步和一致性保障机制,这可能会增加额外的性能开销。

1.1.1 Redis 与 Memcached

1. 共同点

1.都是基于内存的数据库,一般都用来当做缓存使用。
2.都有过期策略。
3.两者的性能都非常高。

2. 区别

1.速度快:Redis基于内存操作,读写速度非常快,能够显著提升数据访问性能。
2.Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
3.Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;
4.Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
5.高可用和分布式:Redis可以通过主从复制、哨兵模式和集群等方式实现高可用性和水平扩展,满足大规模部署的需求。
6…Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持;

1.2 为什么用 Redis 作为 MySQL 的缓存?

主要是因为 Redis 具备**「高性能」「高并发」**两种特性。

1.2.1 高性能

假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据缓存在 Redis 中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了,操作 Redis 缓存就是直接操作内存,所以速度相当快。

在这里插入图片描述
如果 MySQL 中的对应数据改变的之后,同步改变 Redis 缓存中相应的数据即可,不过这里会有 Redis 和 MySQL 双写一致性的问题,后面我们会提到。

1.2.2 高并发

单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。

所以,直接访问 Redis 能够承受的请求是远远大于直接访问 MySQL 的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

Redis的高并发性能得益于其高效的数据结构、非阻塞I/O模型、单线程处理、管道化和批量操作、持久化机制、主从复制和哨兵模式以及集群模式等多方面的设计和优化。这使得Redis成为构建高并发应用场景(如缓存、消息队列、实时分析等)的理想选择。

2. redis数据结构

Redis 提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。

2.1 String(字符串)

字符串是Redis最基本的数据类型,可以存储文本、数字或者二进制数据。常用操作包括设置值、获取值、追加值、截取值等。应用场景包括计数器、标签、配置信息等。

2.2 Hash(哈希)

哈希是键值对的集合,适合存储对象。常用操作包括设置键值对、获取键值对、删除键值对等。应用场景包括用户信息、商品信息、缓存数据等。

2.3 List(列表)

列表是简单的字符串列表,按插入顺序排序。常用操作包括从左侧或右侧插入元素、获取指定范围的元素、删除元素等。应用场景包括消息队列、日志记录、时间线等。

2.4 Set(集合)

集合是无序且唯一的字符串集合,适合存储去重后的数据集。常用操作包括添加元素、删除元素、判断元素是否存在等。应用场景包括标签系统、好友关系、去重统计等。

2.5 Zset(有序集合)

有序集合是带有分数的字符串集合,按分数排序。常用操作包括添加元素、删除元素、获取指定分数范围的元素等。应用场景包括排行榜、地理位置信息、时间事件等。

3. 总结

未完,更新中,还要学一下redis的持久化。

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

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

相关文章

哈尔滨网站建设注意哪些问题

在进行哈尔滨网站建设时,需要注意以下几个问题: 首先,要明确网站的定位和目标。网站建设的首要任务是明确网站的定位和目标,确定网站所要传达的信息和服务内容,以及面向的目标用户群体。哈尔滨作为一个具有浓厚地域特色…

Linux脚本:如何编写bash脚本统计多个相关进程的CPU占用率,以此统计系统中指定多进程的总的CPU使用率

目录 一、需求 二、分析 三、脚本示例 1、创建脚本 2、编写脚本 3、脚本编写注意事项 (1)CPU占用率列 (2)多进程实例 (3)权限 四、运行脚本 1、给予脚本可执行权限 2、运行脚本 五、优化脚本 …

linux live555编译以及rtsp服务器搭建

一、live555源码 下载:点击跳转 二、编译 1、往文件 config.linux里的 COMPILE_OPTS 添加以下两个参数 -DNO_STD_LIB 和 -DNO_OPENSSL1 ,修改后如下: COMPILE_OPTS $(INCLUDES) -I/usr/local/include -I. -O2 -DNO_STD_LIB -DNO_OPENSS…

大数减法c++

这里写目录标题 key key 检查减数和被减数的大小&#xff0c;大的放前&#xff0c;小的放后确定结果是正数&#xff0c;还是负数&#xff0c;即符号位从低位开始减如果a[i]<b[i]&#xff0c;则向高位借1当10&#xff0c;a[i1]–;a[i]10 #include <iostream> #include…

【python】OpenCV—Coordinates Sorted Clockwise

文章目录 1、需求介绍2、算法实现3、完整代码 1、需求介绍 调用 opencv 库&#xff0c;绘制轮廓的矩形边框&#xff0c;坐标顺序为右下→左下→左上→右上&#xff0c;我们实现一下转化为熟悉的 左上→右上→右下→左下 形式 按照这样的顺序组织边界框坐标是执行透视转换或匹…

采用反相正基准电压电路的反相运算放大器(运放)

采用反相正基准电压电路的反相运算放大器(运放) 采用反相正基准电压电路的同相运算放大器&#xff08;运放&#xff09; 设计目标 输入ViMin输入ViMax输出VoMin输出VoMax电源电压Vcc电源电压Vee电源电压Vref-5V-1V0.05V3.3V5V0V5V 设计说明1 此设计使用具有反相正基准的反…

gite+picgo+typora打造个人免费笔记软件

文章目录 1️⃣个人笔记软件2️⃣ 配置教程2.1 使用软件2.2 node 环境配置2.3 软件安装2.4 gite仓库设置2.5 配置picgo2.6 测试检验2.7 github教程 &#x1f3a1; 完结撒花 1️⃣个人笔记软件 最近换了环境&#xff0c;没有之前的生产环境舒适&#xff0c;写笔记也没有劲头&…

盒须图boxplot 展示第6条线

正常情况下,盒须图是有5条线的,但是实际产品场景是需要6条线,看了下echarts官网,没看到可配置的地方,只能自己骚操作了,效果图如下: 重点:用两条x轴,第6条线挂在第二条x轴上,且第二条x轴不展示。 option = {...,xAxis: [{type: category,data: [Class1, Class2, Cl…

Web前端网页设计与制作(想起来哪里写哪里版)

本文技术栈基于HtmlCssJavaScript制作web页面以及功能实现的部分设计与展示&#xff0c;实际的网站开发会涉及更多的细节&#xff0c;包括但不限于用户认证、数据库存储、前端框架的使用、响应式设计、安全性措施等。 废话不说&#xff0c;直接看源码 1.index 首页&#xff1a…

【漏洞复现】泛微e-cology9 WorkflowServiceXml SQL注入漏洞

文章目录 前言漏洞描述影响范围 漏洞复现nuclei脚本 安全修复 前言 泛微协同管理应用平台e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 漏洞…

算法学习day16——刷题(仍然是数组)

一、图片平滑器 图像平滑器 是大小为 3 x 3 的过滤器&#xff0c;用于对图像的每个单元格平滑处理&#xff0c;平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为&#xff1a;该单元格自身及其周围的 8 个单元格的平均值&#xff0c;结果需向下取整…

使用llama-cpp-python制作api接口

文章目录 概要整体操作流程技术细节小结 概要 使用llama-cpp-python制作api接口&#xff0c;可以接入gradio当中&#xff0c;参考上一节。 llama-cpp-python的github网址 整体操作流程 下载llama-cpp-python。首先判断自己是在CPU的环境下还是GPU的环境下。以下操作均在魔搭…

应用层——HTTP

像我们电脑和手机使用的应用软件就是在应用层写的&#xff0c;当我们的数据需要传输的时候换将数据传递到传输层。 应用层专门给用户提供应用功能&#xff0c;比如HTTP,FTP… 我们程序员写的一个个解决我们实际的问题都在应用层&#xff0c;我们今天来聊一聊HTTP。 协议 协议…

Java案例遍历集合中的自定义对象

目录 一&#xff1a;案例要求&#xff1a; 二案例分析&#xff1a; ​编辑三&#xff1a;具体代码&#xff1a; 四&#xff1a;运行结果&#xff1a; 一&#xff1a;案例要求&#xff1a; 二案例分析&#xff1a; 三&#xff1a;具体代码&#xff1a; Ⅰ&#xff1a; pack…

pyinstaller用法详解3

本文使用创作助手。 大家好&#xff0c;时隔多日&#xff0c;我又更新了pyinstaller的用法详解&#xff01; 当然&#xff0c;这一次要比之前更详细&#xff0c;十分详细。 谢谢大家的支持&#xff0c;我们现在开始&#xff01; 一、快速开始使用pyinstaller 我之前的文章…

Web3时代的教育技术革新:智能合约在学习管理中的应用

随着区块链技术的发展和普及&#xff0c;Web3时代正在为教育技术带来前所未有的革新和机遇。智能合约作为区块链技术的核心应用之一&#xff0c;不仅在金融和供应链管理等领域展示了其巨大的潜力&#xff0c;也在教育领域中逐渐探索和应用。本文将探讨智能合约在学习管理中的具…

Java 中的迭代器

Iterator (迭代器) 正是由于每一个容器都有取出元素的功能&#xff0c;这些功能定义都一样&#xff0c;所以对共性的取出功能进行了抽取&#xff0c;从而出现了Iterator接口。由于每一个容器的数据结构不一样&#xff0c;所以具体的实现方式也不同&#xff0c;每一个容器都在其…

[激光原理与应用-115]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 19 - 主要硬件的介绍、安装与调试

目录 一、概述 1.1 前言 1.2 系统组成 1.2.1 机柜版&#xff1a; 1.2.2 非机柜版 1.3适用范围 1.4 工作条件 1.5 安全说明 1.6 装箱清单 二、硬件安装 2.1 光学传感器安装 2.1.1 转接件安装 2.1.2 光路校准模块的安装与光路校准 2.1.3 光学传感器的安装 2.2 通…

Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(已解决)

文章目录 一、下载MySQL的docker镜像二、启动MySQL容器2.1 命令2.2 报错mysqld: Cant read dir of /etc/mysql/conf.d/ (Errcode: 2 - No such file or directory) 三、进入mysql容器四、修改mysql默认配置4.1 查看mysql挂载的文件夹4.2 mysql配置 五、补充 如果还没在虚拟机/服…

新版本cesium编译1.103之后的版本

cesium1.1之后的版本文件结构域1.1之前的版本有了很大的差别&#xff0c;源码也全部移到了packages目录中。有很多依赖包没有写在根目录的package.json文件中。npm i 后直接编译会保持。 cesium源码git https://github.com/CesiumGS/cesium 1、添加缺少的包&#xff0c;缺少的…