对redis进行深入学习

news2024/9/20 20:40:00

目录

  • 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.coloradmin.cn/o/1934983.html

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

相关文章

Volatility:分析MS10-061攻击

1、概述 # 1)什么是 Volatility Volatility是开源的Windows,Linux,MaC,Android的内存取证分析工具。基于Python开发而成,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…

2024算力基础设施安全架构设计与思考(免费下载)

算网安全体系是将数据中心集群、算力枢纽、一体化大数据中心三个层级的安全需求进行工程化解耦,从国家安全角度统筹设计,通过安全 服务化方式,依托威胁情报和指挥协同通道将三层四级安全体系串联贯通,达成一体化大数据安全目标。 …

插画插件:成都亚恒丰创教育科技有限公司

【插画插件:数字创意时代的艺术加速器】 在数字化浪潮汹涌的今天,视觉艺术以其独特的魅力穿梭于互联网的每一个角落,成为连接人心、传递情感与信息的桥梁。而在这股创意洪流中,插画插件以其高效、便捷、个性化的特点,…

1219:马走日

#include<bits/stdc.h> using namespace std; int vis[8][2]{-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};//构造偏移量数组 int t,n,m,x,y,ans;//棋盘总共由(n)(m)个点 bool st[100][100];//如果st[i][j]0 表示i,j这个坐标没有走过 st[a][b]1表示a,b这个坐标走过 void d…

【05】LLaMA-Factory微调大模型——初尝微调模型

上文【04】LLaMA-Factory微调大模型——数据准备介绍了如何准备指令监督微调数据&#xff0c;为后续的微调模型提供高质量、格式规范的数据支撑。本文将正式进入模型微调阶段&#xff0c;构建法律垂直应用大模型。 一、硬件依赖 LLaMA-Factory框架对硬件和软件的依赖可见以下…

GPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建

原文链接&#xff1a;GPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608565&idx3&snd4e9d447efd82e8dd8192f7573886dab&chksmfa826912cdf5e00414e01626b52bab83a96199a6bf69cbbef7f7fe…

C语言 | Leetcode C语言题解之第257题二叉树的所有路径

题目&#xff1a; 题解&#xff1a; char** binaryTreePaths(struct TreeNode* root, int* returnSize) {char** paths (char**)malloc(sizeof(char*) * 1001);*returnSize 0;if (root NULL) {return paths;}struct TreeNode** node_queue (struct TreeNode**)malloc(size…

Mysql中的几种常见日志

引言 本文是对Mysql中几种常见日志及其作用的介绍 一、error log&#xff08;错误日志&#xff09; MySQL 中的 error log&#xff08;错误日志&#xff09;是一种非常重要的日志类型&#xff0c;它记录了 MySQL 服务器在启动、运行及关闭过程中遇到的所有重要事件、错误信…

python爬虫实现简单的代理ip池

python爬虫实现简单的代理ip池 我们在普通的爬虫过程中经常遇到一些网站对ip进行封锁的 下面演示一下普通的爬虫程序 使用requests.get爬取数据 这段代码是爬取豆瓣排行榜的数据&#xff0c;使用f12来查看请求的url和数据格式 代码 def requestData():# 爬取数据的urlur…

[Maven] 打包编译本地Jar包报错的几种解决办法

目录 方式1&#xff1a;通过scope指定 方式2&#xff1a;通过新建lib 方式3&#xff1a;通过build节点打包依赖​​​​​​​ 方式4&#xff1a;安装Jar包到本地 方式5&#xff1a;发布到远程私有仓库 方式6&#xff1a;删除_remote.repositories 方式7&#xff1a;打包…

Leetcode二分搜索法浅析

文章目录 1.二分搜索法1.1什么是二分搜索法&#xff1f;1.2解法思路 1.二分搜索法 题目原文&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返…

TCP重传机制详解

1.什么是TCP重传机制 在 TCP 中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回⼀个确认应答消息&#xff0c;表示已收到消息。 但是如果传输的过程中&#xff0c;数据包丢失了&#xff0c;就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的…

决策树回归(Decision Tree Regression)

理论知识推导 决策树回归是一种非参数监督学习方法&#xff0c;用于回归问题。它通过将数据集划分成较小的子集来建立模型&#xff0c;并在这些子集上构建简单的预测模型&#xff08;通常是恒定值&#xff09;。下面是决策树回归的数学推导过程&#xff1a; 实施步骤与参数解读…

紫光展锐5G安卓核心板T760__国产手机芯片方案

展锐T760安卓核心板是具备续航和性能更加均衡的5G移动平台。其主要特点包括主流的6400万像素摄像头和高达120Hz的刷新率。 平台采用多模融合的创新架构和AI智能调节技术&#xff0c;从而在5G数据场景下降低了37%的整体功耗&#xff0c;在5G待机场景下降低了18%的整体功耗。 多…

遇到报错:无法安装 “WebDriverAgentRunner-Runer“ 无法安装此app,因为无法验证其完整性,如何解决

嗨&#xff0c;大家好&#xff0c;我是兰若&#xff0c;相信很多人在做app自动化测试时&#xff0c;都遇到过这种报错&#xff1a;无法安装 “WebDriverAgentRunner-Runer” 无法安装此app,因为无法验证其完整性。 以下是一些解决思路&#xff1a; 这个问题通常是由于 iOS 设…

Linux系统学习日记——vim操作手册

Vim编辑器是linux下的一个命令行编辑器&#xff0c;类似于我们windows下的记事本。 目录 打开文件 编辑 保存退出 打开文件 打开 hello.c不存在也可以打开&#xff0c;保存时vim会自动创建。 效果 Vim打开时&#xff0c;处于命令模式&#xff0c;即执行命令的模式&#x…

Leetcode算法题(移除链表中的元素)

题目如下&#xff1a; 思路1&#xff1a;创建一个新的带头链表 &#xff08;newhead&#xff09;&#xff0c;遍历头结点对应的值分别于x进行比较&#xff0c;将不等于x的节点尾插到新的带头链表中&#xff0c;返回新的带头链表的下一个节点。 代码如下&#xff1a; typedef …

大数据开发之Hadoop

大数据开发之Hadoop Hadoop的发展Hadoop的三个功能组件一、HDFS 分布式文件系统 1、HDFS的基础架构2、HDFS基础操作命令3、HDFS WEB浏览&#xff1a;4、Big Data Tools插件5、使用NFS网关功能将HDFS挂载到本地系统6、HDFS数据存储7、NameNode 元数据8、SecondaryNameNode的作用…

从人工巡检到智能防控:智慧油气田安全生产的新视角

一、背景需求 随着科技的飞速发展&#xff0c;视频监控技术已成为各行各业保障安全生产、提升管理效率的重要手段。特别是在油气田这一特殊领域&#xff0c;由于其工作环境复杂、安全风险高&#xff0c;传统的监控方式已难以满足实际需求。因此&#xff0c;基于视频监控AI智能…

Gettler‘s Screep World 笔记 Ⅰ

夏促时候刚刚入坑&#xff0c;写个笔记叭~ 环境配置 参考 HoPGoldy 大佬的简书&#xff0c;先配置下开发环境 萌新去看大佬的详细教程&#xff0c;我这里比较简单&#xff0c;有前端基础的可以直接抄 VSCode 跳过 node 我配的是v18.18.2 换源 npm config set registry h…