【Redis】背景知识

news2025/4/15 15:14:10

一、Redis的特性

       Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合),Bitmaps(位图)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景,而且因为Redis会将所有数据都存放在内存中,所以他的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘中,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。总之,如果在合适的场景使用好Redis,就会像一把利剑。

       Redis是一个在内存中存储数据的中间件,用于作为数据库,用于作为数据缓存,在分布式系统中能够大展拳脚。 

1.1 速度快

正常情况下,Redis执行命令的速度非常快,为什么速度快呢??

  • Redis的所有数据都是存放在内存中的
  • Redis是用C语言实现的,一般来说,C语言实现的程序距离操作系统更近,执行速度相对会更快。(个人不认为,因为MySQL也是用C语言开发的)
  • Redis使用单线程,预防了多线程可能产生的竞争问题。(Redis在6.0版本中引入了多线程机制,但是主要也是在处理网络和IO,不涉及到数据命令,即命令的执行仍然采用了单线程模式)
  • Redis的核心功能都是比较简单的逻辑,核心功能都是比较简单的操作内存的数据结构
  • 从网络角度上,Redis使用了IO多路复用的方式(epoll)

多线程并不是在所有情况下都是快的!!!!!

       多线程提高效率的前提是:CPU密集型的任务,使用多个线程可以充分的利用CPU多核资源,但是Redis的核心任务主要是操作内存的数据结构——不会吃很多CPU

1.2 基于键值对的数据结构服务器

       几乎所有的编程语言都提供了类似字典的功能,例如C++中的map,Java中的map,Python的dict等,类似于这种组织数据的方式叫做基于键值对的方式,与很多的键值对数据库不同的是,Redis中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能提供开发效率。

1.3 丰富的功能

除了5种数据结构,Redis还提供了许多额外的功能:

  • 提供了键过期功能,可以用来使用缓存
  • 提供了发布订阅功能,可以用来实现消息系统
  • 支持Lua脚本功能,可以利用Lua创造出新的Redis命令
  • 提供了简单的事务功能,能在一定程序上保证事务特性
  • 提供了流水线功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销

1.4 客户端语言多

       Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis受到了社区和各大公司的广泛认可,所以支持Redis的客户端语言也非常多,几乎涵盖了主流的编程语言,例如C/C++,Java等。

1.5 持久化

       通常来说,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化方式:RDB和AOF,即可以使用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性。

1.6 主从复制

       Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。

1.7 高可用和分布式

       Redis提供了高可用实现的Redis哨兵,能够保证Redis节点的故障发现和故障自动转移,也实现了Redis集群,是真正的分布式实现,提供了高可用,读写和容量的扩展性。

二、Redis的使用场景

2.1 Redis可以做什么

缓存

       缓存机制几乎在所有大型网站中都有使用,合理地使用缓存不仅可以加速数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。

session storage 

       cookie(只是在浏览器这边存储了一个用户的身份标识sessionid)=>实现用户身份信息的保存,需要session配合(session是存放在服务器上的)

如何解决上述问题?

  1. 想办法让负载均衡器把同一个用户的请求始终打到同一台机器上(不能轮询,而是需要通过userid之类的方式来分配机器)
  2. 把会话数据单独拎出来,放到一组独立的机器上存储(Redis) 

数据库存储

       将Redis当做了数据库,大多数情况下,考虑到数据存储优先考虑的是“大”,但是仍然有一些场景考虑的是“快”。例如:搜索引擎对性能的要求非常高,其中没有使用到MySQL这样的数据库,把所有需要检索的数据存放在内存中,使用类似于Redis这样的内存数据库来完成的。

消息队列系统

       消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。

2.2 Redis不可以做什么

       站在数据规模的角度看,数据可以分为大规模数据和小规模数据,我们知道Redis的数据是存放在内存中的,虽然现在内存已经足够便宜了,但是如果数据量非常大,使用Redis来进行存储的话,基本是一个无底洞,经济成本相当高。

       站在数据冷热的角度,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为冷数据。如果将冷数据放在Redis上,基本上是对于内存的一种浪费,但是对于一些热数据可以放在Redis中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。

三、Redis的安装(Ubuntu)

       安装Redis5 系列,在Linux中进行安装,Redis官方是不支持Windows版本的,微软维护了一个Windows版本的Redis分支。

在Ubuntu中的安装步骤如下:

  1. 先切换到root用户,su命令切换到root
  2. 使用apt命令来搜索redis相关的软件包,apt search redis
  3. 使用apt命令安装redis,apt install redis
  4. 需要手动修改配置文件(redis.conf),将ip进行更改
  5. 重新启动服务器,service redis-server restart
  6. 使用redis自带的客户端来连接服务器,redis-cli
  7. 使用ctrl + d 退出客户端

什么是配置文件?

       很多软件都是有配置文件的,一个大的软件里面包含了很多的功能,有很多可以定制化的操作,就可以通过配置文件选择开启/关闭/设定某些功能~

四、Redis客户端介绍

Redis是一个客户端-服务器结构的程序!!!(MySQL也是)

Redis的客户端也有很多种形态:

  1. 自带了命令行客户端:redis-cli
  2. 图形化界面的客户端:桌面程序,web程序(像这样的图形化程序,依赖windows系统,而未来会有诸多限制,你的windows上的图形化界面客户端能不能连上你们的服务器里的redis,是一个未知数)
  3. 基于Redis的api自行开发客户端:非常类似于mysql的C语言和JDBC

我们在来回顾一下Redis的快:

       我们谈到的redis的快是相对于MySQL这样的关系型数据库的,但是如果是直接和内存中的操作变量相比,就没有优势了,甚至更慢了!!!

  • 使用hash map是直接操作内存,使用redis是先通过网络,在操作内存

我们需要对症下药(具体问题具体分析):

  • 上述场景中,是否需要使用redis,需要结合实际的需求来确定!!!
  • 引入Redis的缺点:会更慢,但是有了Redis之后,我们可以将其扩展为分布式,也可以将数据单独存储,后续服务器重启,不会影响到数据内容。

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

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

相关文章

航电系统的任务载荷集成技术要点概述!

一、任务载荷集成技术难点 1. 接口标准化与兼容性 异构设备协议冲突:不同厂商的载荷设备(如光学相机、雷达、电子战模块)采用不同的通信协议(如1553B、RS422、以太网),需设计统一的总线接口标准以支持即…

OceanBase V4.3.5 上线全文索引功能,让数据检索更高效

近日,OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试,OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…

Qt中的信号与槽及其自定义

信号源:哪个控件发的信号 信号的类型:用户进行不同的操作就会触发不同的信号 如点击按钮,在输入框移动光标,勾选一个复选框,选 择一个下拉框 信号的处理方式:槽(slot)----也就是函数,Qt中用con…

【PFPGA学习】状态机思想编程HDLbitsFPGA练习

目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 4. 选型建议 三、HDLbitsFPGA练习记录(combinational logic…

Android 中集成 Unity 工程的步骤

在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…

Python从入门到精通全套视频教程免费

概述 📢 所有想学Python的小伙伴看过来!作为深耕编程领域的技术分享者,最新整理了一份Python从0到1的视频教程。 💡亮点 ✅ 保姆级系统路线:从环境搭建、语法精讲,到爬虫/数据分析/AI/Web全栈开发&#…

蓝桥杯:对字符串处理常用知识笔记

一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码&#xff08;常用&#xff09; #include <iostream> #in…

实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js

文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中&#xff0c;Mark…

帆软fvs文件中某表格新增数据来声提醒

1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件&#xff08;如 mp3 格式&#xff09;&#xff0c;并将其放置在合适的目录。 例如&#xff1a;%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」&#xff0c;输入以下 JavaScript …

从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人

前言 移动端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 项目整体介绍及演示 前面的文章我们主要完成了基础模块的开发 这次我们跟一下热点 创建AI聊天机器人 并嵌入到我们的uniapp中 首先需要了解dify我已经完成了搭建win10 VMware安装ubuntu…

$_POST 超级全局变量

$_POST 是一个超级全局变量&#xff0c;在 PHP 中用于收集通过 HTTP POST 方法发送到服务器的数据。与 $_GET 不同&#xff0c;$_POST 允许发送大量数据&#xff0c;且数据不会显示在 URL 中&#xff0c;因此更适用于提交敏感信息&#xff0c;如用户登录信息、表单数据等。 使…

开发一个环保回收小程序需要哪些功能?环保回收小程序

废品分类展示与识别 详细分类列表&#xff1a;清晰展示常见废品类型&#xff0c;如废纸&#xff08;报纸、书本纸、包装纸等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金属&#xff08;易拉罐、铁制品、铜制品等&#xff09;、玻璃&#xff0…

Debezium嵌入式连接postgresql封装服务

文章目录 1.项目结构&#xff1a;2.依赖&#xff1a;3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口&#xff08;表处理抽象&#xff09;7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…

Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南

在电商采购和供应链管理中&#xff0c;了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台&#xff0c;提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口&#xff0c;开发者可以获取工厂的详细信息&#xff0c;包括工厂名称、地址、联系方…

Rust所有权详解

文章目录 Rust所有权所有权规则作用域 内存和分配移动与克隆栈空间堆空间 关于函数的所有权机制作为参数作为返回值 引用与租借垂悬引用 Rust所有权 C/C中我们对于堆内存通常需要自己手动管理&#xff0c;手动申请和释放&#xff0c;即便有了智能指针&#xff0c;对于效率的影…

CExercise_07_1指针和数组_2数组元素的逆序数组逆序(指针版 reverse_by_ptr 和下标版 reverse_arr)

题目&#xff1a; 数组元素的逆序。要求使用[]运算符以及纯粹指针操作两种方式来完成。 关键点 arr[i] arr[len - 1 - i]; arr[0]arr[len-1]; 如果数组序列是偶数,则调换最中间一对为止;若为奇数,则单出一个不用反转. 思想就是长度取一半 eg:8/2, 9/24.5,反转一半,到5时固定…

框架PasteForm实际开发案例,换个口味显示数据,支持echarts,只需要标记几个特性即可在管理端显示(2)

PasteForm框架的主要思想就是对Dto进行标记特性,然后管理端的页面就会以不一样的UI呈现 使用PasteForm框架开发,让你免去开发管理端的烦恼,你只需要专注于业务端和用户端! 在管理端中,如果说表格是基本的显示方式,那么图表chart就是一个锦上添花的体现! 如果一个项目拥…

Starrocks的Bitmap索引和Bloom filter索引以及全局字典

写这个的主要作用是梳理一下Starrocks的索引效率以及使用场景。 Starrocks Bitmap索引 原理&#xff1a; Bitmap 索引是一种使用 bitmap 的特殊数据库索引。bitmap 即为一个 bit 数组&#xff0c;一个 bit 的取值有两种&#xff1a;0 或 1。 每一个 bit 对应数据表中的一行&…

QML面试笔记--UI设计篇05容器控件

1. QML中容器控件全解&#xff1a;构建灵活界面的基石 1.1. Item&#xff08;万物容器&#xff09;1.2. Rectangle&#xff08;视觉容器&#xff09;1.3. ListView&#xff08;动态列表容器&#xff09;1.4. Frame&#xff08;表单容器&#xff09;1.5. SwipeView&#xff08;页…

VSCode运行,各类操作缓慢,如何清理

VSCode写代码&#xff0c;随着项目逐步进展&#xff0c;代码量在增加&#xff0c;依赖的第三方头文件也在增加&#xff0c; 先是发现代码提示的速度变慢&#xff0c; 后来格式化代码速度太慢 然后c/c代码的语法检查有时候压根就失败&#xff0c;来个错误提示 还有source contro…