PHP如何解决网站大流量与高并发的问题(二)「建议收藏」

PHP如何解决网站大流量与高并发的问题(二)

大家好,又见面了,我是全栈君。

转载:https://zhyunfe.github.io/2017/10/02/php-interview-prepare-hc-2/

数据库缓存

相关概念

  • 什么是数据库缓存?
  • 为什么使用缓存
  • 使用MySQL查询缓存
  • 使用Memcache缓存
  • 使用Redis缓存

什么是数据库缓存

Mysql等一些常见的关系型数据库的数据都存储在磁盘中,在高并发场景下,业务应用对mysql产生的增删改查的操作造成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生

数据库缓存极大的解决数据库服务器的压力

提高应用数据的响应速度

常见的缓存形式:内存缓存、文件缓存,为了避免I/O开销,推荐使用内存缓存

为什么使用缓存

缓存数据时为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程度的降低对数据库服务器的访问压力

用户请求–>数据查询–>连接数据库服务器并查询数据–>将数据缓存起来(HTML,内存,JSON,序列化数据)–>显示给客户端

用户再次请求或者新用户访问–>数据查询–>直接从缓存中获取数据–>显示给客户端

缓存方式的选择

缓存场景的选择

缓存数据的实时性

缓存数据的稳定性

MySQL查询缓存

启用mysql查询缓存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
query_cache_type
#查询缓存类型有0,1,2三个取值。0表示不使用缓存,1表示始终使用查询缓存,2表示按需使用查询缓存

query_cache_type = 1
#此时也可以关闭查询缓存
select sql_no_cache * from table where condition;

query_cache_type = 2
# 按需查询缓存
select sql_cache * from table where condition

query_cache_size
#默认情况下的query_cache_size为0,表示为查询缓存预留的内存位0,则无法使用查询缓存

set global query_cache_size = 133443344;
# 设置query_cache_size的大小

 

查询缓存可以看做是sql文本和查询结构的映射

第二次查询的sql和第一次查询的sql必须完全相同才会使用缓存

show status like ‘Qcache_hits’ 查看命中次数

表的结构或者数据发生改变时,查询缓存中的数据不再有效

清理缓存

flush query cache;清理查询缓存内存碎片

reset qyery cache;从查询缓存中移除所有查询

flush tables;关闭所有打开的表,同时该操作将会清空表缓存的内容

使用Memcache缓存查询数据

memcache 是一套分布式的高速缓存系统,由LiveJournal的Bard Fitzpatrict开发,但目前被许多网站使用以提升网站的访问速度,尤其是对一些大型的、需要频繁访问数据库的网站访问速度提升效果十分明显

  • 工作原理

    memcache 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像,视频,文件以及数据库检索的结构等。简单的说就是将数据调用到内存,然后从内存读取,从而大大提高读取速度。

  • 工作流程

    先检查客户端的请求数据是否在mem中,有的话直接返回,不在的话就去查库,把数据库中的数据返回给客户端,同时缓存到mem中

  • 方法

获取: get(key)

设置:set(key)

删除:delete(key)

Redis缓存查询数据

  • 与memcache的区别

性能差别不大

Redis在2.0版本后增加了自己的VM特性,突破了物理内存的限制,mem可以修改最大可用内存,采用LRU算法

Redis依赖客户端实现分布式读写,mem本身没有数据冗余机制,Redis支持(快照,AOF),依赖快照进行持久化,aof增强了可靠性的同时对性能有所影响

mem不支持持久化,在并发情境下用cas保证一致性,redis事务支持较弱,Redis支持多种类的数据类型

Redis用于数据量小的高性能的操作和运算上,mem用于在动态系统中减少数据库负载,提升性能,适合做缓存,提高性能

缓存其他数据

  • Session

    将session存入到数据库来说是一种逆天的行为,可以存储到mem和redis中
    session_set_save_handler来修改存储地址

MySQL数据库层的优化

相关概念

  • 优化方向
  • 优化方案

优化方向

  • 数据表结构设计的优化
  • 数据表数据类型的优化

    字段使用什么样的数据类型更合适

    1
    2
    3
    4
    tinyint(0-255)、smallint、bigint(存储上千万的数字)#考虑空间的问题,考虑范围的问题,按需取
    char、varchar #考虑字符串长度是否固定
    enum #特定、固定的分类可以使用enum存储,效率更快
    IP地址的存储#ip2long将ip转换成长整型,long2ip
  • 存储引擎的优化

建立合适的索引,在什么时候效率最好?

索引的创立原则: 不是越多越好,在合适的字段上创建合适的索引

复合索引的前缀的原则,like 查询%的问题,全表扫描优化,or条件索引使用情况,字符串类型索引失效问题

  • 数据库服务器架构的优化
    分区操作
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112151.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux查看进程下的线程_linux查看线程状态

    linux查看进程下的线程_linux查看线程状态鉴于linux下线程的广泛使用我们怎么查看某个进程拥有的线程id了现在很多服务的设计主进程->子进程->线程(比如mysql,varnish)主进程负责侦听网络上的连接并把连接发

    2022年8月3日
    27
  • c++学生管理系统源代码_学校运营管理系统

    c++学生管理系统源代码_学校运营管理系统C#学员管理系统C#学员管理系统是在控制台输出的项目,和OOP学员管理系统相似。①创建一个学员的实体类Student,实现其构造方法和封装:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;///<summary>///实体类///</sum…

    2022年9月20日
    3
  • 第十三章《优化》

    第十三章《优化》

    2021年5月29日
    80
  • python怎么表示取余_python如何实现取余操作[通俗易懂]

    python怎么表示取余_python如何实现取余操作[通俗易懂]python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

    2022年4月25日
    76
  • 【软件工程师之路一】咸鱼翻身之自学软件开发[通俗易懂]

    【软件工程师之路一】咸鱼翻身之自学软件开发[通俗易懂]给大家推荐一个网站,主要是给在校学生提供资料和交流的平台,也希望社会人士能进来给与一些经验和建议,把这个网站维持下去。阳光沙滩 http://bbs.sunofbeaches.com/?fromuid=9791“做人如果没有梦想,跟咸鱼有什么分别?”我们的梦想就是如何从零基础去学习软件开发,最后达到我们心目中的高度,首先我按自己的理解大致将各个阶段进行划分,每个公司

    2022年5月6日
    45
  • NFV介绍_NFV技术

    NFV介绍_NFV技术转发自:https://zhuanlan.zhihu.com/p/26259440NFV全称是NetworkFunctionVirtualization。这又是一个与网络相关的故事。先来看看NFV的前世今生吧。在NFV之前,NF(NetworkFunction)是一直存在的,网络中,NF可以看成一个个独立的网元,实现着各自的功能。NF以固定的方式连接起来,统一提供的网络功能和服务。随便在网…

    2022年9月10日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号