简单了解Redis(初识阶段)

1.认识Redis

对于Redis有一个很重要的点就是,它存储数据是在内存中存储的。

但是对于单机程序,直接通过变量存储数据的方式是更优的,在分布式系统下 Redis才能发挥威力

因为进程是有隔离性的,Redis可以基于网络,把进程自己的内存中的变量给别的进程,甚至是别的主机使用。这是Redis最核心的地方。

Redis可以用作数据库。它相比MySQL要快很多。因为Redis存储数据是内存级的。

但是内存存储快是快,但是劣势也很明显,那就是空间太小了。

往往都是Redis和MySQL结合起来使用。 在互联网上存在一个 二八原则,那就是 20%的热点数据(高频访问的数据),能满足80%的访问需求,那么就只要把这20%用Redis存储,全量数据用MySQL存储。此时Redis就是充当Cache的角色,不过这样就会使得系统的设计变得复杂,并且修改Redis中的数据时,还需考虑Redis和MySQL之间的同步问题。

2.浅谈分布式系统的演变过程

了解单机架构 

 即只有一台服务器,这个服务器负责所有的工作。

 虽然现在的硬件发展速度非常快,单机架构即便只有一台主机,但是这台主机的性能也是可以很高的,但是还是架不住用户量和数据量的水涨船高,单机的性能再高也是有上限的,

一台服务器的核心硬件资源:1.CPU 2.内存 3.硬盘 4.网络 。当然还有其他的。

 什么是分布式?

之前说了单机架构模式, 还有服务器的核心资源。当某一时刻,请求的数量太多了,就可能会导致服务器的某个硬件资源不够用了,无论是哪个方面不够用了,都会导致服务器处理请求的时间变长,甚至出错。

如果碰到这种情况,怎么处理呢?

1.开源:

简单粗暴,直接增加更多的硬件资源来解决性能问题。但是需要注意:一台主机能增加的硬件资源是有限的。比如CPU ,内存条,这些取决于主板的扩展能力。

当一台主机扩展到极限的时候,那么就只能引入多台主机了。而且不是说新的机器买来就可以直接解决问题,还需要在软件上做出对应的调整和适配。当引入了多台主机时,就可以把这个系统称为”分布式系统“了。

不过一般万不得已是不会引入分布式系统的,因为这会使得系统的复杂度大大提高。

2.节流:

节流就是从软件层面上去优化,需要通过性能测试找到性能瓶颈,再找出切实有效的优化方案。这个是比较难的。

数据库分离和负载均衡 

也就是应用服务和数据库服务分离

这里就已经是两个服务器了。 

此时还可以根据服务器业务的不同,针对性的给服务器配置硬件资源,以此达到更高的性价比。

如果一台应用服务器还是不够用的话,那么还可以引入更多的服务器结点:

 

此时用户访问就会先访问负载均衡器 / 网关(也是一个单独的服务器),然后负载均衡器再将请求进行分发。

另外,看似负载均衡器在这里承担了所有的请求,但是负载均衡器是分配任务的,所以它对于请求的承担能力是远超服务器的。就算请求量大到负载均衡也承担不了时,同样可以引入更多的硬件资源,也就是引入更多的负载均衡器(引入更多机房)。

数据库的读写分离

上面说到了应用服务和数据服务分离,这样降低了应用服务的压力,但是数据库服务的压力又上来了,因此为了降低数据库服务的压力又有两种解决办法:

开源和节流。其中节流门槛高,难度大,这里主要说开源。

 这里的核心思想就是读写分离。图中只画了两台服务器,实际上可能是多台。

在实际的应用场景中,读的频率是比写的频率高的,因此主服务器一般只有一个,从服务器有多个
并且从服务器也可以通过负载均衡的方式让应用服务器进行访问。

引入缓存 

数据库有一个天然的问题,因为它是读写硬盘访问的,所以速度是比较慢的。因此可以将数据进项冷热划分,将热数据放到缓存中,这样访问速度就能快很多了。

将热点数据存到缓存服务器中,数据库中存的依旧是完整的全量数据。 

而我们一直说的Redis就处于缓存服务器这个位置。 

数据库分库分表 

引入分布式系统,不光要应对更高的请求量(并发量),还要能够应对更大的数据量(比如短视频平台的数据量就很大)。当数据量多到一台服务器已经存不下的时候,就需要多台主机来存储。 

所以还可以针对数据库再进行水平拆分,这里也叫分库分表

比如本来一个数据库服务器上有多个数据库(指逻辑上的数据集合),现在就引入了多个数据库服务器,每个数据库服务器存储一个或者一部分数据库。 

图中展现的是分库,如果当某张表特别大的时候,也可以对表进行拆分,也就是分表。

引入微服务 

这里针对的就是应用服务器,当应用服务器里的功能太多太复杂了,就可以把它的功能进行拆分,本来是一个服务器,现在拆分了,就叫做微服务。

 

微服务本质上是解决 ”人“的问题。因为当一个应用服务功能越来越多,结构越来越复杂时,就需要更多的人来维护。

 那么就可以按照功能拆分成多组微服务,这样就有利于上述人员的结构组织的分配了。

虽然微服务解决了人的问题,但是它也是付出了代价的:

 

 

概念的补充 

应⽤(Application)/ 系统(System):

为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。

 模块(Module)/ 组件(Component):

 一个应用,里面有很多个功能,每一个独立的功能就可以称为一个模块 / 组件。

当应⽤较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于
理解。

分布式(Distributed)

系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与
数据库分别⼯作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。⽣活例⼦类⽐:为了更好的满⾜现实需要,⼀个在同⼀个办公场地的⼯作⼩组被分散到多个城市的不同⼯作场地中进⾏远程配合⼯作完成⽬标。跨主机之间的模块之间的通信基本要借助⽹络⽀撑完成。

引入多个主机 / 服务器,协同配合完成一系列的工作 (物理上的多主机)

集群(Cluster)

被部署于多台服务器上的、为了实现特定⽬标的⼀个/组特定的组件,整个整体被称为集群。⽐如
多个 MySQL ⼯作在不同服务器上,共同提供数据库服务⽬标,可以被称为⼀组数据库集群。
分布式 vs 集群。通常不⽤太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即
⼯作在不同服务器上并且通过⽹络通信配合完成任务;⽽集群更在意逻辑形态,即是否为了完成特定服务⽬标。

引入多个主机 / 服务器,协同配合完成一系列的工作 (逻辑上的多主机)

主(Master)/ 从(Slave) 

集群中,通常有⼀个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。⽐如
MySQL 集群中,只有其中⼀台服务器上数据库允许进⾏数据的写⼊(增/删/改),其他数据库的数据修改全部要从这台数据库同步⽽来,则把那台数据库称为主库,其他数据库称为从库。

中间件(Middleware)  

⼀类提供不同应⽤程序⽤于相互通信的软件,即处于不同技术、⼯具和数据库之间的桥梁。⽣活
例⼦类⽐:⼀家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变⼤,成⽴⼀个采购部,由采购部专职于采买业务,称为厨房和菜市场之间的桥梁。

中间件一般是和业务无关的服务:

 1.数据库

2.缓存

3.消息队列(是生产者消费模型)

4...

评价指标(Metric):
1.可⽤性(Availability)
考察单位时间段内,系统可以正常提供服务的概率/期望。例如: 年化系统可⽤性 = 系统正常提供
服务时⻓ / ⼀年总时⻓。
平时我们常说的 4 个 9 即系统可以提供 99.99% 的可⽤性,5 个 9 是 99.999% 的可⽤性,以此类推。 我们平时只是⽤⾼可⽤(High Availability HA)这个⾮量化⽬标简要表达我们系统的追求。

响应时⻓(Response Time RT) 

指⽤⼾完成输⼊到系统给出⽤⼾反应的时⻓。 这个指标越小越好

吞吐(Throughput)vs 并发(Concurrent) 

吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同⼀时刻⽀持的请求最⾼
量。例如⼀条辆⻋道⾼速公路,⼀分钟可以通过 20 辆⻋,则并发是 2,⼀分钟的吞吐量是 20。实践中,并发量往往⽆法直接获取,很多时候都是⽤极短的时间段(⽐如 1 秒)的吞吐量做代替。我们平时⽤⾼并发(Hight Concurrnet)这个⾮量化⽬标简要表达系统的追求。

通常用响应时长和吞吐&&并发来衡量服务器性能,但是它们衡量的角度是不一样的。 

分布式系统 小结:

 大致过程:

1.单机架构 ->

2.数据库和应用分离 ->

3.引入负载均衡  应用服务器 => 集群 ->

4.引入读写分离,数据库主从结构 ->

5.引入缓存,冷热数据分离 ->

6.引入分库分表,数据库能进一步扩展空间 ->

7.引入微服务,从业务上进一步拆分应用服务器

3.Rdies的一些特性介绍(优点) 

Redis特性介绍 

Redis是内存中存储数据的中间件,它作为数据库,作为数据缓存之所以能在分布式系统中大展拳脚是因为它的一些特性(优点)

1.数据在内存中存储的->速度快:

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

⼏乎所有的编程语⾔都提供了类似字典的功能,例如 C++ ⾥的 map、Java ⾥的 map、Python ⾥
的 dict 等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是,
Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开发,同时也能提⾼开发效率。Redis 的全程是 REmote Dictionary Server,它主要提供了 5 种数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set /zet),同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的 ”数据结构“,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis 3.2. 版本种加⼊有关 GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种 “有意思” 的应⽤。

3.有丰富的功能,拓展性强大

除了 5 种数据结构,Redis 还提供了许多额外的功能:
提供了键过期功能,可以⽤来实现缓存。
提供了发布订阅功能,可以⽤来实现消息系统。
⽀持 Lua 脚本功能,可以利⽤ Lua 创造出新的 Redis 命令。
提供了简单的事务功能,能在⼀定程度上保证事务特性。
提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到 Redis,减少了⽹络的开
销。

 比如我们可以自己用C++代码去拓展Redis的功能。

 4.简单稳定

其次,Redis 使⽤单线程模型,
这样不仅使得 Redis 服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。最后,Redis 不需要依赖于操作系统中的类库(例如 Memcache 需要依赖 libevent 这样的系统类库),Redis ⾃⼰实现了事件处理的相关功能。
但与简单相对的是 Redis 具备相当的稳定性,在⼤量使⽤过程中,很少出现因为 Redis ⾃⾝ BUG
⽽导致宕掉的情况。

 5.客户端语言多

C、C++、Java、PHP、Python、NodeJS 等。
6.持久化(Persistence)

通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢
失,因此 Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中。

 7.高可用性(High Availability)

假设主节点挂掉了,那么从结点可以立马顶上,不至于让整个服务直接宕机 。

Redis为什么快呢? 

 1.Redis数据在内存中,那就比访问硬盘的数据库要快很多。

2.Redis核心功能都是比较简单的逻辑

3.从网络角度上来说,Redis使用了IO多路复用

4.Redis使用的是单线程模型(虽然高版本Redis引入多线程,但是是对网络部分的),

这样减少了不必要的线程之间的竞争开销。

注意:多线程提高效率的前提是 CPU密集型的任务,并且能使多个线程可以充分利用CPU的多核资源。但是Redis的核心任务主要就是操作内存的数据结构。

5.Redis是用C语言开发的,所以快。不过需要注意,这里的快是指跟其他语言相比起来,用C语言快,而不能跟MySQL比,因为MySQL也是C语言开发的,而之所以会引入Redis就是因为MySQL慢。

4.Redis的应用场景 

1.作为数据库

虽然在大多数情况下,数据库存储优先考虑的是 “大”,但是还是有一些场景下考虑的是 “快”。因为Redis的最大特点就是快,所以Redis就可以满足 考虑 “快”的场景下的要求。不过此时Redis存储的就是全量数据了,此时的数据可不能丢失。

2.作为缓存 && 会话存储

作为缓存我们之前也谈到过,因为在互联网的数据访问遵循二八原则,所以我们可以把热数据放在 缓存也就是Redis中,全量数据依旧放在MySQL这样的数据库中。此时Redis的数据有丢失也不要紧,丢失了可以从MySQL中再加载回来。

那么会话存储又是什么呢?
我们之前学过Cookie,而Cookie是和session搭配使用的。

假设在一个分布式系统下

有一个用户发起了登录请求,这个请求经过负载均衡器转发到应用服务器上,然后应用服务器就会生成一个会话,并给用户返回了这个会话的id,保存了用户的登录信息,那么用户 下次就只要拿着合法的会话id就直接登录了。

那么此时又有一个问题:因为请求是要先经过负载均衡器的,而会话是形成在一个应用服务器上的,其他的应用服务器没有,那么当用户又发来一个请求时,它不一定会被转发到之前的那个服务器,就导致用户需要再登录一次,如果用户运气不好每个请求都要登录,那就有点反人类了。于是有两种解决方法:

1.想办法让负载均衡器把同一个用户的请求始终打到同一台机器上。

2.直接把会话数据单独拎出来,放到一组独立的机器上存储,也就是用Redis,所以这就是Redis 应用在会话存储上。

3.作为消息队列 

这里的消息队列不是Linux进程通信的消息队列。

那么Redis不能用于什么场景了,这已经显而易见了:
Redis不能用于大规模存储(太贵了)。 

5.Redis环境搭建

这里以Redis 5为例。 

Ubuntu下安装 

在root用户下执行

apt install redis

 一般下载好它会自己启动

可以查看一下

netstat -nltp | grep redis

关于redis的配置文件 ,在 /etc/redis 目录下:

cd /etc/redis

 

 vim打开后发现这里的bind绑定的是本地环回

这样只能本地客户端才能连接这个服务器,我们要将其修改成为  0.0.0.0  。 

还有这里的关于主机保护,为方便今后能跨主机访问,我们给yes 修改为 no

修改完之后,记得要重启服务器。

service redis-server restart

 执行

service redis-server status

可以查看服务的运行状态

在本机执行

redis-cli

 如果想验证是否联通了,可以输入ping,如果返回了一个 PONG 则说明联通了

使用 ctrl + d 来退出redis客户端

Redis客户端介绍 

首先我们要知道,Redis是一个 客户端-服务器结构的程序,这一点和MySQL是一样的。

Redis的客户端有多种形式:

1.自带命令行客户端。

另外 在这里登录时我们可以指明 ip地址和端口号进行登录。

2.图形化界面的客户端

不是很推荐,因为不稳定

 3.基于redis的api自行开发的客户端 (工作常见)

补充:

关于Redis的速度快,是相对于MySQL这样的关系型数据库的,如果直接和内存中的操作变量相比,就没有优势了,甚至更慢了。

举例:
一个单机系统,用hashmap存储了一些简单的数据,此时对于是否要引入Redis,是要结合实际应用场景的,这里举例引入后的优缺点:

缺点:

一:系统变得复杂。

二:hashmap是直接操作内存的,而Redis是要先通过网络,再操作内存的,速度反而会下降。

优点:

一:有了Redis后,数据可以单独存储,如果服务器重启了也不会影响到数据,持久化了。

二:未来如果要扩展成分布式系统,那么用Redis要更佳。

所以综上,对于是否要引入一个技术(Redis),不仅要想清楚能解决什么问题,还得想明白会引来什么新的问题。

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

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

相关文章

Lesson1 MySQL的安装(环境为CentOS云服务器)

卸载内置环境 我们初期使用root账号,后期再切换成普通账号 使用 ps axj | grep mysql 查看系统中是否有MySQL相关的进程 使用 systemctl stop mysqld 关停进程 使用 rpm -qa | grep mysql 查看MySQL相关的安装包 使用 rpm -qa | grep mysql | xargs yum -y remo…

计算机毕业设计非遗项目网站 登录注册搜索 评论留言资讯 前后台管理/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

遗项目网站需求,以下是一个基于Spring Boot、Java Web、J2EE技术栈,使用MySQL数据库,并结合Vue实现前后端分离的简要设计方案: 系统功能概述 ‌用户登录与注册‌:实现用户的注册、登录功能,确保用户信息的…

【Docker】解决Docker Engine stopped

解决Docker Engine stopped 解决Docker Engine stopped1.检查虚拟设置2 安装wslwindows安装wsl 解决Docker Engine stopped 在安装完docker之后不少用户会遇到Docker Engine stopped。下面就下给出解决方法让docker正常运行起来 1.检查虚拟设置 打开任务管理器查看cpu页面&a…

华为全联接大会HUAWEI Connect 2024印象(五):讯飞星火企业级智能体平台

在HC大会上,除了有华为自己的产品,还有很多合作伙伴的产品,今天就简单说一下讯飞星火的企业级智能体平台。讯飞星火此次在HC上有多个展台。我以前是讯飞星火的拥泵,在B站发过视频介绍其API的使用(利用API访问讯飞星火认…

PR视频剪辑工具全指南:开启专业剪辑之旅

pr视频剪辑可以说是视频剪辑里的一把好手,就是如果你想在这方面深耕那还是掌握这个工具的使用比较方便。如果你只是刚入门,那也有不少可以快速帮你剪辑出片的工具。这次我介绍几款我用过的视频剪辑工具,助你开启视频剪辑大门。 1.福昕视频剪…

构建预测睡眠质量模型_相关性分析,多变量分析和聚类分析

数据入口:睡眠质量记录数据集 - Heywhale.com 本数据集目的是探究不同因素是如何影响睡眠质量和整体健康的。 数据说明 字段说明Heart Rate Variability心率变异性:心跳时间间隔的模拟变化Body Temperature体温:以摄氏度为单位的人工生成体…

深度学习(2):梯度下降

文章目录 梯度下降梯度是什么常见梯度下降算法 代码实现批量梯度下降 梯度下降 梯度是什么 类似y ax b这种单变量的函数来说,导数就是它的斜率,这种情况下可以说梯度就是导数。 但在多变量函数中,梯度是一个向量,其分量是各个…

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…

STM32F407之超声波模块使用

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "HC_SR04.h"int main() {OS_ERR err;//错误uart_init(9600);//串口初始化//超声波初始化HC_SR04();//OS初始化 他是第一个运行的函…

Karmada新版本发布,支持联邦应用跨集群滚动升级

摘要:本次升级支持联邦应用跨集群滚动升级,使用户版本发布流程更加灵活可控;透明同事karmadactl 新增了多项运维能力,提供独特的多集群运维体验。 本文分享自华为云社区 《Karmada v1.11 版本发布!新增应用跨集群滚动升…

nfs版本问题导致挂载失败

一、系统环境 环境版本操作系统Linux Mint 22 Wilma内核版本6.8.0-44-genericgcc 版本arm-none-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025uboot 版本2020.01开发板Linux版本5.4.31 二、问题描述 内核通过…

Unity开发绘画板——03.简单的实现绘制功能

从本篇文章开始,将带着大家一起写代码,我不会直接贴出成品代码,而是会把写代码的历程以及遇到的问题、如何解决这些问题都记录在文章里面,当然,同一个问题的解决方案可能会有很多,甚至有更好更高效的方式是…

微信小程序——引入 iconfont 矢量图标,如何使用引用阿里巴巴矢量图标

本文介绍如何在小程序中加入图标,效果如下图: 1、访部iconfont-阿里巴巴矢量图标库 找到需要的图标,然后添加入库 将增加好的图标添加到项目中 2、点击更新生成代码 生成后如下图 3、打开生成的css样式文件 4、在小程序中新建/static/iconfon…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展,越来越多的应用层出不穷,伴随着数据应用的需求变多,为快速响应业务需求,很多企业在初期没有很好的规划的情况下,存在不同程度的烟囱式的开发模式,这样会导致企业不同业务线的数据…

**CentOS7安装redis**

CentOS7安装redis 首先解压压缩包 redis-7.0.0.tar.gz tar -xvf redis-7.0.0.tar.gz接着进入到redis中 cd redis-7.0.0.tar.gz执行make命令编译 make接着执行安装命令 make install之后编译安装完后 程序都会在/usr/local/bin目录下 这里需要将在redis目录中redis.conf配置…

Kubernetes从零到精通(14-Storage)

存储简介 在Kubernetes中,存储是一个关键的部分,用于持久化应用程序的数据。Kubernetes的存储模型支持多种存储类型,并且能根据应用程序的需求动态地提供存储资源。以下是Kubernetes存储的基本概念和机制。 Kubernetes支持很多类型的卷。Pod可…

【Java面向对象高级一08】继承_使用继承的好处

前言 一、继承是什么? 二、使用继承的好处 总结 前言 继承的学习 一、继承是什么? Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。extends(中文意思就是继承)。 继承的意思是&#xf…

Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式

Redis作为一个高性能的key-value数据库,广泛应用于缓存、消息队列、排行榜等场景。然而,Redis是基于内存的数据库,这意味着一旦服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了数据持久化的机制&#…

C语言 | Leetcode C语言题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; int countSegments(char * s){int count 0; //count用来记录单词个数for(int i0; i < strlen(s); i){ //遍历字符串 if((i 0 || s[i-1] ) && s[i] ! ) //一个…

Python | Leetcode Python题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; class Solution:def countSegments(self, s):segment_count 0for i in range(len(s)):if (i 0 or s[i - 1] ) and s[i] ! :segment_count 1return segment_count