转载: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条件索引使用情况,字符串类型索引失效问题

  • 数据库服务器架构的优化
    分区操作

PHP如何解决网站大流量与高并发的问题(二)的更多相关文章

  1. PHP解决网站大流量与高并发

    1:硬件方面 普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬 ...

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

    高并发的相关概念 在某个时间点,有多少个访问量 如果一个系统的日PV在千万以上,有可能是一个高并发的系统 QPS: 每秒钟请求或者查询的数量,在互联网领域,指每秒相应请求数(指HTTP请求) 吞吐量: ...

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

    动态语言的并发处理 相关概念 什么是进程.线程.协程 什么是多进程.多线程 同步阻塞模型 异步非阻塞模型 php并发编程实践 什么是进程.线程.协程 进程 进程是一个执行中的程序 进程的三态模型:多道 ...

  4. 转:基础篇|PHP如何解决网站大流量和高并发

    基础篇 高并发架构基础概念和优化思路 高并发架构相关概念 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程 ...

  5. PHP如何解决网站大流量与高并发的问题

    首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...

  6. PHP如何解决网站大流量与高并发的…

    首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...

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

    七层负载均衡的实现 基于URL等应用层信息的负载均衡 Nginx的proxy是一个很强大的功能,实现了7层负载均衡 功能强大.性能卓越,运行稳定 配置简单灵活 能自动提出工作不正常的后端服务器 上传文 ...

  8. PHP 网站大流量与高并发的解决方法

    php 网站如何应对大流量与高并发呢? 首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万地理IP,如果访问量比这个还要大,则请配置一台更高性能的专用服务器. 否则 ...

  9. 如何解决web大流量,高并发问题

    对于当今大流量的网站,每天几千万甚至上亿的流量,是如何解决访问量问题的呢? 以下是一些总结的方法:  第一,确认服务器硬件是否足够支持当前的流量.  普通的P4服务器一般最多能支持每天10万独立IP, ...

随机推荐

  1. python(if判断)

    一.if判断 如果 条件满足,才能做某件事情, 如果 条件不满足,就做另外一件事情,或者什么也不做 注意: 代码的缩进为一个 tab 键,或者 4 个空格 在 Python 开发中,Tab 和空格不要 ...

  2. Django中多对多关系的orm表设计

    作者的管理 1.设计表结构 出版社 书籍 作者 一个出版社出版多个书籍  1对多 书籍和作者的关系:一个作者写多本书,一本书可以是多个作者写.多对多 1)创建一张表,表中多对多的数据关系.使用 多对多 ...

  3. Rabbitmq异常排查

    [RabbitMQ] beam.smp high cpu load https://blog.csdn.net/beer_do/article/details/52777445 Erlang 打开和关 ...

  4. typescript 模块

    模块:模块可以帮助开发者将代码分割为重用的单元.开发者可以自己决定将模块中的哪些资源(类,方法,变量)暴露出去供外部使用,哪些资源只在模块内使用 在ts里面,一个文件就是一个模块,并没有什么特殊的标识 ...

  5. java基础(12)---异常

    一.throws和throw 用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常. 区别: 1.概念 throws E1,E2,E3只是告诉程序这个 ...

  6. 优化MyEclipse编译速度慢的问题、build、project clean 慢

    优化MyEclipse编译速度慢的问题(重点是1) 1 .关闭MyEclipse的自动validation windows > perferences > myeclipse > v ...

  7. HTTP的幂等性

    转自: https://www.jianshu.com/p/234cf2e96832 理解HTTP幂等性基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式.无论是在大型互联网应用还 ...

  8. native与H5优缺点及H5测试

    一.native(原生)与H5优缺点介绍 native(原生)优点 1.运行速度快 2.可以应用到底层的API 3.便捷性与易用性 4.打开会比较节省流量 native(原生)缺点 1.不同操作系统需 ...

  9. php流程控制 之循环语句的使用

    循环语句的使用 王同学需要反复往返于北京和大连,就是典型的循环结构.假设王思总投资这个项目需要往返大连100次,每次往返都王同学都会计数一次.难道我们写一百遍同样的代码?显然对于智商极高的程序员来说不 ...

  10. Hive 数据类型与文件格式

    一.基本数据类型 1.基本数据类型 Tinyint  1byte有符号整数  比如20 Smalint 2byte有符号整数 比如20 Int          4byte有符号整数 比如20 Big ...