转载: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. IOS 之 NSBundle 使用

    来源:http://blog.sina.com.cn/s/blog_b0c59541010151rd.html An NSBundle object represents a location in ...

  2. MySQL Replication--双主结构优缺点

    双主架构图 双主架构实现原理当从库IO线程接受到主库传递来的二进制日志(Binlog)并将之保存为从库的中继日志(relay log),然后从库SQL线程将中继日志(relay log)的事件重做到从 ...

  3. centos7单用户模式

    1 - 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 如果用的是kvm做了c ...

  4. websocket实现心跳连接

    在使用websocket的时候,遇到了一个websocket在连接一段时间就异常断开连接了.第一想法就是重新去连接websocket(websock.onopen),后来发现这种方式是错误的,查阅文档 ...

  5. SpringDataRedis的简单入门

    Jedis Jedis是Redis官方推出的一款面向java的客户端,提供了很多接口供java语言调用,可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis SRP等,推荐使用 ...

  6. java常用关键字(static、final、this、super)

    this关键字 this关键字的作用有 1.调用本类的成员变量 public class Soft{ private int a; public Soft(int a){ this.a=a; } } ...

  7. maven的使用和环境搭建

    请在博客分类的未分类中找到这篇文章

  8. vue中url带有#号键,去除方法

    在写vue项目中,发现路由跳转总是带有#,在获取数据中带来不必要的麻烦,如果我们不希望 路由中出现 # ,那怎么办呢? 解决办法: 在router ---->index 中 添加代码   mod ...

  9. Codeforces Round #604 (Div. 2) E. Beautiful Mirrors

    链接: https://codeforces.com/contest/1265/problem/E 题意: Creatnx has n mirrors, numbered from 1 to n. E ...

  10. 学习Spring-Data-Jpa(六)---spring-data-commons中的repository

    1.spring-data-commons项目 spring-data-commons项目是所有spring-data项目的核心,我们来看一下该项目下的repository包中的接口和注解. 2.Re ...