【redis】认识redis和分布式系统

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【redis】认识redis和分布式系统

认识 redis

redis 的主要功能

用来在内存中存储数据


定义变量不就是在内存中存储数据吗?为什么还需要 redis 来向内存中存储数据?这不是绕了一个圈嘛?

  • redis 是在分布式系统中才能发挥威力
  • 如果只是单机程序,直接通过变量存储数据的方式,是比使用 redis 更优的选择

由于我们现在很多的系统都是分布式的系统,在分布式系统中,若想让多个服务器都共享同一份数据,又想这个数据存在于内存中,此时使用 redis 就是一个可选的选择了


对于存储数据来说,直接存在变量中,往往是更快速、更方便的选择,但是若放在分布式系统中,直接定义变量就不行了

  • 因为你定义的变量是在你当前服务器进程中的一块空间
  • 进程具有隔离性,每个进程之间都是被隔离开的,进程 A 无法读取进程 B 中的数据
  • 如果是在分布式系统下,肯定会涉及到多个进程,甚至是在不同的主机上的多个进程,此时你想直接访问其他内存中的变量,这件事就变得困难起来了
    redis 就是针对上述的功能点进行了封装,既然没法突破进程的隔离性直接进行访问,那就使用“进程间通信“,网络 就是其最主流方案

网络既可以让同一个主机间的进程进行通信,而且还可以让不同主机之间的进程进行通信,因此,redis 就相当于是基于网络,能够把自己内存中的的变量给别的进程、甚至别的主机的进程进行使用

实现数据库

redis 还被一些人当做数据库来使用

常见的 MySQL 最大的问题在于:访问的速度比较慢

在很多互联网产品中,对性能要求是很高的,“”有时候就是一个很大的问题

redis 被当做数据库来使用的优点就在于:快,快很多

  • 核心在于它是用内存存储数据的,而 MySQL 的数据是在硬盘上的
  • 计算机访问内存的速度比访问硬盘的速度快几千上万倍

redisMySQL 相比,最大的劣势是:存储空间是有限的

  • 虽然有不少的互联网产品,对性能要求是很高的,就需要访问速度很快
  • 但更多的互联网产品对于性能的要求没那么高,同时又希望用更低的成本存更多的数据,显然 MySQL 是更好的选择,同时 MySQL 相比于 redis 来说,提供了更丰富的功能

实现缓存

那有没有存储空间又大,访问速度又快的方案呢?

  • 典型的方案就是把 redisMySQL 结合起来
  • 把热点数据(经常访问的数据)就用 redis 来存储,把全量数据就用 MySQL 来存储
  • “二八原则”,20% 的热点数据能满足 80% 的访问需求

这就是缓存的机制,不过这样系统的复杂程度就会大大提高。而且,如果数据发生修改,还会涉及到 redisMySQL 之间的数据同步问题

实现消息中间件

redis 的初心,就是作为一个“消息中间件”(消息队列),实现分布式系统下的生产者消费者模型

但当前很少会直接使用 redis 作为消息中间件,因为业界中有更多更专业的消息中间件可以使用

基础概念

  • 应用Application)/系统System
    一个应用,就是一个/组服务器程序
  • 模块Module)/组件Component
    一个应用,里面有很多的功能,每个独立的功能,就可以称为是一个模块/组件
  • 分布式Distributed
    引入多个主机/服务器,协同配合完成一系列的工作(物理上的多个主机)
  • 集群Cluster
    通过多个服务器/主机,去协同配合完成一系列的工作(逻辑上的多个主机,一个服务器上部署多个服务器程序,这些服务器程序之间也是通过网络进行通信,看上去也是和多个主机没什么区别,但在硬件上还是一个主机)
  • Master)/Slave
    分布式系统中,一种比较典型的结构。比如现在有多个服务器节点,其中一个是主,另外的是从。这个时候从节点就是主节点的跟班(从节点的数据要从主节点同步过去),
  • 中间件Middleware
    一组和业务无关的服务(功能更通用的服务,数据库、缓存、消息队列…)

评价指标

  • 可用性Availability
    系统整体可用的时间÷总的时间(这个结果越高越好)
    一个系统的第一要务
  • 响应时长Response Time RT
    衡量服务器的性能,越小越好,和具体服务器要做的业务密切相关
  • 吞吐Throughput)vs 并发Concurrent
    衡量系统的处理请求的能力,是衡量性能的一种方式

分布式系统

千万不要把所谓的“分布式”想的太复杂,太高大上…

单机架构

此处假定是一个“电商网站”,用户通过网络访问这个服务器,其分为两个部分:

  1. 应用服务:我们写的服务器程序
  • 就是说用户打开这个网站,页面上要能显示商品信息,点进去能看到详情,能下单… 这些预计的功能就是通过这个“应用服务器/HTTP服务器这样的程序”来支撑的
  • C++ 里面的 cpp-hyyplib
  • Java 里面的 Spring
  • 这俩都是用来写 HTTP 服务器的
  1. 数据库服务:
  • 用来存储这个网站中大量的数据
  • 可以使用MySQL
  • MySQL 是一个“客户端-服务器“结构的程序,本体是 MySQL 服务器(存储和组织数据的部分)
  • 上面的 HTTP 应用服务服务器作为客户端,去读写数据库服务
  • 当用户现在查看商品列表,那么应用服务器(HTTP 服务器) 就会发送请求给 MySQL 服务器,然后 MySQL 查找数据之后将数据返回给应用程序,最后应用程序通过 HTTP 协议,最终将信息返回给用户

绝大部分的公司的产品都是这种单机架构。因为现在的计算机硬件发展速度是非常快的,这就意味着哪怕我们只有一台主机,这一台主机的性能也是非常高的,可以支持非常高的并发,非常大的数据存储

如果业务进一步增长,用户量和数据量都水涨船高,当一台主机难以应付的时候,就需要引入更多的主机,引入更多的硬件资源,就需要使用分布式系统了

为什么数据多了主机就难以应对 ?

一台主机的硬件资源是有上限的,包括但不限于一下几种:

  • CPU
  • 内存
  • 硬盘
  • 网络

  • 服务器每次收到一个请求,都是需要消耗上述的一些资源的~~
    如果同一时刻处理的请求多了,此时就可能会导致某个硬件资源不够用了,无论是那个方面不够用了,都可能会导致服务器处理请求的时间变长,甚至于处理出错

如果我们真的遇到了这样的服务器不够用的场景,我们可以:

  1. 开源
  • 简单粗暴,直接增加更多的硬件资源(什么不够补什么)
  • 不过一个主机上面能增加的硬件资源也是有限的,取决于主板的扩展能力
  1. 节流(软件上优化)
  • 针对程序进行优化,优化代码(各凭本事)
  • 通过性能测试,找到是哪个环节出现了瓶颈,再对症下药
  • 操作起来很难!对程序员的水平要求比较高

分布式系统

当一台主机扩展到极限了,但是还不够,就只能引入多台主机了

但不是说买来的新的机器直接就可以解决问题,也需要软件上做出对应的调整和适配。当引入多台主机了,我们的系统就可以称为“分布式系统”了

引入分布式系统万不得已的,系统的复杂程度会大大大提高(指数增长),这样出现 bug 的概率就越高、加班的概率就越大、丢失年终奖的概率也随之提高


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
18天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
47 5
|
22天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
39 8
|
1月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
57 16
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
40 5
|
2月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
71 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
2月前
|
NoSQL Redis 数据库
计数器 分布式锁 redis实现
【10月更文挑战第5天】
51 1
|
2月前
|
NoSQL 算法 关系型数据库
Redis分布式锁
【10月更文挑战第1天】分布式锁用于在多进程环境中保护共享资源,防止并发冲突。通常借助外部系统如Redis或Zookeeper实现。通过`SETNX`命令加锁,并设置过期时间防止死锁。为避免误删他人锁,加锁时附带唯一标识,解锁前验证。面对锁提前过期的问题,可使用守护线程自动续期。在Redis集群中,需考虑主从同步延迟导致的锁丢失问题,Redlock算法可提高锁的可靠性。
84 4
|
2月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
58 3
|
2月前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!
下一篇
DataWorks