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

2024-09-06 17:12

本文主要是介绍【redis】认识redis和分布式系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 认识 redis
    • redis 的主要功能
    • 实现数据库
    • 实现缓存
    • 实现消息中间件
  • 分布式系统
    • 单机架构
    • 为什么数据多了主机就难以应对 ?
    • 分布式系统

认识 redis

redis 的主要功能

用来在内存中存储数据


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

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

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


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

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

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

实现数据库

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

常见的 MySQL 最大的问题在于:访问的速度比较慢
在很多互联网产品中,对性能要求是很高的,“”有时候就是一个很大的问题

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

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

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

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

实现缓存

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

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

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

实现消息中间件

redis 的初心,就是作为一个“消息中间件”(消息队列),实现分布式系统下的生产者消费者模型
但当前很少会直接使用 redis 作为消息中间件,因为业界中有更多更专业的消息中间件可以使用

分布式系统

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

单机架构

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

  1. 应用服务:我们写的服务器程序

    • 就是说用户打开这个网站,页面上要能显示商品信息,点进去能看到详情,能下单… 这些预计的功能就是通过这个“应用服务器/HTTP服务器这样的程序”来支撑的
    • C++ 里面的 cpp-hyyplib
    • Java 里面的 Spring
    • 这俩都是用来写 HTTP 服务器的
  2. 数据库服务:

    • 用来存储这个网站中大量的数据
    • 可以使用 MySQL
      • MySQL 是一个“客户端-服务器“结构的程序,本体是 MySQL 服务器(存储和组织数据的部分)
      • 上面的 HTTP 应用服务服务器作为客户端,去读写数据库服务
  • 当用户现在查看商品列表,那么应用服务器(HTTP 服务器) 就会发送请求给 MySQL 服务器,然后 MySQL 查找数据之后将数据返回给应用程序,最后应用程序通过 HTTP 协议,最终将信息返回给用户

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

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

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

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

  • CPU
  • 内存
  • 硬盘
  • 网络

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

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

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

分布式系统

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

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

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

这篇关于【redis】认识redis和分布式系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142620

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

分布式系统的主要考虑

异构性:分布式系统由于基于不同的网路、操作系统、计算机硬件和编程语言来构造,必须要考虑一种通用的网络通讯协议来屏蔽异构系统之间的禅意。一般交由中间件来处理这些差异。缺乏全球时钟:在程序需要协作时,它们通过交换消息来协调它们的动作。紧密的协调经常依赖于对程序动作发生时间的共识,但是,实际上网络上计算机同步时钟的准确性受到极大的限制,即没有一个正确时间的全局概念。这是通过网络发送消息作为唯一的通信方式

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

laravel框架实现redis分布式集群原理

在app/config/database.php中配置如下: 'redis' => array('cluster' => true,'default' => array('host' => '172.21.107.247','port' => 6379,),'redis1' => array('host' => '172.21.107.248','port' => 6379,),) 其中cl

Redis的rehash机制

在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的。通过哈希表中的节点保存字典中的键值对。我们知道当HashMap中由于Hash冲突(负载因子)超过某个阈值时,出于链表性能的考虑,会进行Resize的操作。Redis也一样。 在redis的具体实现中,使用了一种叫做渐进式哈希(rehashing)的机制来提高字典的缩放效率,避