Python及项目实现的高并发(二)

  1. 硬件和软件层面常用方法
    (1).HTML静态化其实,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能。

    (2).除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略。

    (3.)同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如公用设置信息,这些信息目前都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

    (4).镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,定期维护更新或者实时更新。

    (5).负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法
    方法就是架设多台应用服务器,架设CDN,并在各个服务器之间做主从,达到高可用
    解释:CDN关键技术主要有内容存储和分发技术, 就近原则, 边缘化服务器.

  2. 项目中使用的方法.
    队列,特点,就是先进先出,这是一个很有效的方法,让所有的请求挨个执行
    还可以使用乐观锁,乐观锁比较的局限,循环时间长开销很大,对个别数据可以进行使用,不能对整个数据库进行操作.

  3. 缓冲区.
    缓冲区,在恰当的地方使用事半功倍,如果使用不好就有可能造成服务器宕机,在使用缓存,有几个需要处理的问题.
    (1).缓存的工具选择
    memcached它支持的缓存类型比较少,都是key : value类型,之前我自己用过redis,我就说下redis在单机和分布式下的使用,其他缓存他们的机制都差不多.

    redis是一个内存数据库,很多类型结构时间复杂度都为o(1),查询效率很快,其次是因为,redis提供的数据类型可以让我们根据需求,将对应的数据类型放到不同的redis类型中,官方数据表示Redis读的速度是110000次/s,写的速度是81000次/s,redis比较实用中小型应用,特别大型应用会出很多问题,数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,系统上线时必须确保有足够的空间,这对资源就会造成了很大的浪费。

    (2)缓存和数据库双写一致性问题.
    这里有3种现象,(1)先写缓存在写db,(2)先写DB再写缓存,这样都会出现一个问题,就是数据脏读的现象,(3)所有一般都会,先写数据库,删缓存,在写入缓存,如何做数据同步,需要自己写一个定时任务,在一段时间内,查询数据库,把现有的缓存数据删除,在写入缓存,从而做到数据同步.

    (3)缓存雪崩和时钟回拨
    数据写入缓存,但是数据不能一直存在缓存中的,所有我们需要把写入的数据设置一个过期时间,redis3.0自身提供了这个方法,当我们设置同一个过期时间时,有大量数据的过期时间相同,在同一时刻缓存过期,大量请求发送到数据库,导致数据库奔溃,这种现象称为缓存雪崩,解决方法:每一条缓存数据写一个过期时间用时间戳表示,在数据量少的情况下,这是一种可选方法,如果数据量很大就不在选用这样方法,原因,可能网络波动,停电,时间戳在那一秒停了,正好记录了一个时间,突然网又好了,下一个记录就和上一个记录相同了,数据量大,过期时间又会相同,同样会造成缓存雪崩,这种现象叫时钟回拨,解决方法;使用第三方工具,雪花算法生成一个唯一标识,就可以解决这样的问题了,简单介绍一下雪花算法,它一共有64位组成,1位标识位;41位时间戳;10位workId(数据中心+工作机器,可以其他组成方式);12位自增序列;

    (4)缓存击穿
    对过期时间,同步问题都解决后,现在客户端恶意请求,请求不存在缓存的数据,请求一下没事,如果每秒请求1000次,同样是造成了高并发,解决方法,就是如果在缓存中没有查询到数据,在数据库也没有查询到,我们就可以把这个数据给存下来,它请求什么数据,我们就存什么数据,然后写入缓存,如果下次还请求的是同样的数据,就把存的数据给它,通过DNS判断ip如果同一个请求,请求很多次,可以单写一个方法来进行阻止操作

    (5)多级缓存层
    根据使用的框架特性,比如在django中的quaryset就是一个缓存,因为quaryset数据一个懒查询,只有需要查询这个对象的时候在会被执行,只要查询过一次之后,下一次就不会在和数据库交互,合理地利用queryset可以大大减少数据库的交互次数,从而使程序能够以更高的效率执行, 配合着之前架设好的redis缓存,可以做到2层缓存,借助第三方库实现多级缓存

    (6)redis集群
    raft协议实现,在一个具有一致性的性质的集群里面,同一时刻所有的结点对存储在其中的某个值都有相同的结果,对共享的存储保持一致。集群具有自动恢复的性质,当少数结点失效的时候不影响集群的正常工作,当大多数集群中的结点失效的时候,集群则会停止服务,优势有很好的容错性
    Redis有三种集群模式,分别是:
    -------主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。
    工作机制:当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
    缺点:从上面可以看出,master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。

    RDB持久化:表示m秒内数据集存在n次修改时,执行快照持久化, 自己的理解就是保存所有操作的最后一次 (恢复不强)
    AOF持久化:将每一次的操作写入磁盘(占用空间太大)

    -------Sentinel模式(哨兵机制)
    最少3台服务器为一个redis集群 3主3从,一台服务器也可以,redis集群自身就占用空间很大,就不能很好的处理高并发
    哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
    工作机制: 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机
    故障转移, 这是哨兵机制中强的一个地方,就是通过哨兵监控,如果发现宕机,通过选举,选出一下一任master,整个redis集群还是可以正常运行的

    -------Cluster模式
    sentinel模式基本可以满足一般生产的需求,但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster的出现就是为了, 解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。

    redis卡槽
    Redis 集群中内置了 16384 个哈希槽,当在 Redis 集群中存放一个 k-v时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据计算值相等的哈希槽映射到不同的节点。

以上就是关于架构中使用缓存工具redis的实现.文字有点多,可能看到时候会能繁杂,这些都是写概念,帮助自己先去了解这些东西,若出现问题还请多多指明!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页