对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://www.mzph.cn/bicheng/47681.shtml

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

相关文章

进程的地址空间

一、写个代码见一见地址空间 1、问题 在代码中我们在第五秒时会在子进程中改变全局变量 g_val 但是我们发现了一个奇怪的现象:在子进程中改变 g_val ,由于进程的独立性,所以子进程和父进程的值不一样是可以理解的,但是为什么变量…

【C++11】线程

本篇文章更多的是熟悉一下C11的线程库接口,与linux的相关线程接口是非常相似的,更多的是将面向过程改为了面向对象。 并没有一些概念的讲解。 想知道线程的相关概念的可以看一看这篇文章及后续 在C11之前,涉及到多线程问题,都是和…

访问控制系列

目录 一、基本概念 1.客体与主体 2.引用监控器与引用验证机制 3.安全策略与安全模型 4.安全内核 5.可信计算基 二、访问矩阵 三、访问控制策略 1.主体属性 2.客体属性 3.授权者组成 4.访问控制粒度 5.主体、客体状态 6.历史记录和上下文环境 7.数据内容 8.决策…

memcached 高性能内存对象缓存

memcached 高性能内存对象缓存 memcache是一款开源的高性能分布式内存对象缓存系统,常用于做大型动态web服务器的中间件缓存。 mamcached做web服务的中间缓存示意图 当web服务器接收到请求需要处理动态页面元素时,通常要去数据库调用数据,但…

【快速逆向一/无过程/有源码】《大学》在线投稿系统

逆向日期:2024.07.18 使用工具:Node.js 加密工具:Crypto-js标准库 文章全程已做去敏处理!!! 【需要做的可联系我】 【点赞 收藏 关注 】仅供学习,仅供学习, 本文为快速逆向&#x…

如果制作红星照耀中国思维导图?6个软件帮助你快速制作思维导图

如果制作红星照耀中国思维导图?6个软件帮助你快速制作思维导图 制作《红星照耀中国》思维导图可以帮助更好地理解和梳理书中的重要信息和内容。以下是六款推荐的思维导图软件及其特点和使用方法,帮助你快速制作高质量的思维导图。 迅捷画图 特点与功…

Python基础语法篇(下)+ 数据可视化

Python基础语法(下) 数据可视化 一、函数(一)函数的定义(二)函数的调用和传参 二、文件操作(一)文件读取和写入(二)文件对象及方法(三&#xff09…

【数学建模】——【线性规划】及其在资源优化中的应用

目录 线性规划问题的两类主要应用: 线性规划的数学模型的三要素: 线性规划的一般步骤: 例1: 人数选择 例2 :任务分配问题 例3: 饮食问题 线性规划模型 线性规划的模型一般可表示为 线性规划的模型标准型&…

达梦数据库的系统视图v$sqltext

达梦数据库的系统视图v$sqltext 在达梦数据库(DM Database)中,V$SQLTEXT 是一个系统视图,用于显示当前正在执行或最近执行的SQL语句的文本信息。这个视图对于监控和分析数据库中的SQL活动非常有用,尤其是在需要调试性…

【MySQL篇】Percona XtraBackup工具备份指南:常用备份命令详解与实践(第二篇,总共五篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

银河麒麟搭建ftp服务器

1.先 查看系统架构,我常遇到的一般银河麒麟是arrch64的 lscpu uname -a cat /etc/os-release 去下载对应版本的vsftp.rpm包和ftp包 Index of /NS/ (cs2c.com.cn) 1.安装rpm rpm -ivh *.rpm --nodeps --force #强制安装 2.修改配置文件 vi /etc/vsftpd/vsftpd.co…

PiT : 基于池化层Pooling layer的Vision Transformer

CNN的降维原理;随着深度的增加,传统CNN的通道维数增加,空间维数减少。经验表明,这样的空间降维对变压器结构也是有益的,并在原有的ViT模型的基础上提出了一种新的基于池的视觉变压器(PiT)。 1. 引言 ViT与卷积神经网络(CNN)有很大的不同。将输入图像分成1616小块馈送到变压…

LabVIEW软件开发的雷区在哪里?

在LabVIEW软件开发中,有几个需要注意的雷区,以避免常见的错误和提高开发效率: 1. 不良的代码结构 雷区:混乱的代码结构和不清晰的程序逻辑。 后果:导致难以维护和调试的代码,增加了错误和故障的风险。 …

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

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

【C++】前缀和:和为K的子数组

1.题目 2.算法 需要借助哈希表(查找效率很高)。 如果一个区间和为sum,如果它的前缀和为sum-k,那么后缀和一定是K。 3.代码

类与对象(3)

对于类的构造函数我们已经有了初步的了解,这里我们对其拷贝构造函数进行讲解: 目录 拷贝构造函数: 1.拷贝构造函数的作用: 2.系统生成拷贝构造函数的缺陷 3.深拷贝的实现 侧面体现 拷贝构造函数: 这里我们将拷贝…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 3.事件传参与数据同步 事件传参 (以下为错误示例) 以上两者的…

Java语言程序设计基础篇_编程练习题**14.29(游戏:豆机)

第十四章第二十九题 **14.29 (游戏:豆机) 请写一个程序,显示编程练习题 7.21 中介绍的豆机,如图 14-52c 所示 代码展示 package chapter_14;import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layou…

NFS存储、API资源对象StorageClass、Ceph存储-搭建ceph集群和Ceph存储-在k8s里使用ceph(2024-07-16)

一、NFS存储 注意:在做本章节示例时,需要拿单独一台机器来部署NFS,具体步骤略。NFS作为常用的网络文件系统,在多机之间共享文件的场景下用途广泛,毕竟NFS配置方 便,而且稳定可靠。NFS同样也有一些缺点&…

Postgresql主键自增的方法

Postgresql主键自增的方法 一.方法(一) 使用 serial PRIMARY KEY 插入数据 二.方法(二) 🎈边走、边悟🎈迟早会好 一.方法(一) 使用 serial PRIMARY KEY 建表语句如下&#xf…