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)
上一篇 2022年2月9日 下午9:00
下一篇 2022年2月9日 下午10:00


相关推荐

  • idea Mac 破解2021激活码[免费获取]

    (idea Mac 破解2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSWQi…

    2022年3月21日
    92
  • 报错Uncaught URIError: URI malformed 可以这样解决

    报错Uncaught URIError: URI malformed 可以这样解决最怕写代码出 bug 更怕的是这个 bug 不常见 今天把所有的数据都处理完了突然查到一行数据的时候显示了这个问题 当时我是一脸懵逼呀 URI url 这个我倒是经常见可是这个 URI 平时不多见呀 这是什么原因造成的 网上查了一通才发现原来是这样的 由于 decodeURI 转码时 通过 进行解析 如果字符串中存在 如 巴伐利亚黄啤酒精含量 5 0 vol 原麦汁浓度 14 P 原料 澳洲大麦芽 澳洲焦香麦芽 则会出现 URImalformed 就会出现这个问题 那么就好解决了 解决 将字符串中的 替换为 25

    2026年3月17日
    2
  • 兄弟连新版Linux视频教程

    兄弟连新版Linux视频教程兄弟连新版Linux视频教程目录:F:\linux\兄弟连新版Linux视频教程├(1)云计算是什么东西集群又是嘛玩意?.mp4├(2)兄弟连新版Linux教程1.1.1Linux系统简介-UNIX发展历史和发行版本.mp4├(3)兄弟连新版Linux教程1.1.2Linux系统简介-Linux发展历史和发行版本.mp4├(4)兄弟连新版Linux教程1.2Linux系统简介-开源软件…

    2022年6月10日
    36
  • 计算机网络实验双绞线制作,实验一 双绞线制作实验报告

    计算机网络实验双绞线制作,实验一 双绞线制作实验报告华南师范大学实验报告学生姓名专业课程名称实验类型叶宇丽多媒体与网络技术计算机网络 验证 设计 综合姚彬学号年级 班级实验项目实验时间实验评分 2010 级 4 班双绞线制作和简单局域网组建 2011 年 10 月 20 日实验指导老师实验一双绞线制作和简单局域网组建一 实验目

    2026年3月18日
    1
  • mysql 字符串转数字再排序

    mysql 字符串转数字再排序如果数字是按照字符串格式存储的排序时候又想按照数字排血 只需要在orderby后加上转换函数即可例如: orderby CONVERT(sort,DECIMAL)可用的类型    二进制,同带binary前缀的效果:BINARY   字符型,可带参数:CHAR()    日期:DATE    时间:TIME    日期时间

    2022年5月7日
    252
  • 狂神说Linux_狂神说java

    狂神说Linux_狂神说javaLinux在服务器端,很多大型项目都是部署在Linux服务器上利用VM + Centos7搭建本地Linux系统你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。概念云服务器就是一个远程电脑Linux中一切皆文件根目录/,所有的文件都挂载在这个节点下/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev : dev是Device(设备

    2022年8月8日
    8

发表回复

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

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