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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UTF-8编码占几个字节?

    UTF-8编码占几个字节?Blog:https://www.jsntian.com占2个字节的:带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码占3个字节的:基本等同于GBK,含21000多个汉字占4个字节的:中日韩超大字符集里面的汉字,有5万多个一个utf8数字占1个字节一个utf8英文字母占1个字节少数是汉字每个占用3个字节,多数占用…

    2022年6月26日
    32
  • Mac 计算机的日常使用 和 从零开始搭建Python开发环境

    Mac 计算机的日常使用 和 从零开始搭建Python开发环境Mac计算机的日常使用和从零开始搭建Python开发环境本文作者:魏泯效率魔法师,最后更新时间:2019年1月10日在进行学习mac常用操作的时候,保证你的mac已经连接网络。目录&#

    2022年7月6日
    20
  • IntentService原理

    IntentService的Demo程序IntentService常被用于处理异步任务,使用的步骤是,先继承IntentService,再在handleIntent方法里写业务逻辑。handleIntent是在子线程执行的,所以不必担心ANR之类的问题,可以执行IO操作,下载等操作,且当执行完后会自动销毁,很方便。先写一个简单的Demo。CountService.java:publicc…

    2022年4月6日
    39
  • js三目运算符

    js三目运算符js三目运算符js三目运算符的正常表达为variable=boolean_expression?true_value:false_value;当boolean_expression传入的不是表达式而是变量时,是如何判断的?在es5文档中找到了解释:先将boolean_expression进行计算拿到结果赋给lref,然后根据ToBoolean(lref)拿到是tr

    2022年6月29日
    25
  • 一台服务器可以干什么

    一台服务器可以干什么

    2021年10月3日
    50
  • 最新Eric Python IDE 安装方法Eric6_17.04.1 + PyQt5_5.8.2[通俗易懂]

    博主是一名新入Pyhton坑的技术小白,一直在寻找更适合自己的PythonIDE,语是准备尝试EricPythonIDE,但是网上找到的安装教程和当前最新版本不一样了,于是经过一番折腾,博主记录下了如何安装最新版本Eric617.04.1以及PyQt5.82。也希望通过本文能帮助到和博主一样的新手同学

    2022年4月14日
    165

发表回复

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

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