一、缓存技术
缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据的目的,因为CPU的速度太快了,CPU需要的数据由于硬盘往往不能在短时间内满足CPU的需求,因此CPU缓存、内存、Raid 卡缓存以及硬盘缓存就在一定程度上满足了CPU的数据需求,即CPU 从缓存读取数据可以大幅提高CPU的工作效率。
系统缓存
buffer与cache
buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存再写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间在写入磁盘,所以服务器突然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,一般用于读操作,CPU读文件从内存读,如果内存没有就先从硬盘读到内存再读到CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。
如何清除缓存?
向 /proc/sys/vm/drop_caches 写入相应的修改值,会清理缓存。建议先执行sync(强制将所有未写入的系统缓冲区数据刷新到磁盘上)
echo 1 > /proc/sys/vm/drop_caches
清除页面缓存
echo 2 > /proc/sys/vm/drop_caches
清除dentry和inode缓存
echo 3 > /proc/sys/vm/drop_caches
清除所有缓存(包括页面缓存、dentry和inode缓存)
如果因为是应用有像内存泄露、溢出的问题时,从swap的使用情况是可以比较快速可以判断的,但通过执行free 反而比较难查看。但核心并不会因为内存泄露等问题并没有快速清空buffer或cache(默认值是0),生产也不应该随便去改变此值。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的。当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。
排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。
缓存保存位置及分层结构
- 用户层: 浏览器DNS缓存,应用程序DNS缓存,操作系统DNS缓存客户端。
- 代理层: CDN,反向代理缓存。
- Web层: Web服务器缓存。
- 应用层: 页面静态化,利用软件将 数据库中的 资源,提前生成静态页面。
- 数据层: 分布式缓存,数据库。
- 系统层: 操作系统cache。
- 物理层: 磁盘cache, Raid Cache。
cache的特性
自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除。
强制过期:源网站更新图片后CDN是不会更新的,需要强制是图片缓存过期,通过CDN管理后台实现。
命中率:即缓存的读取命中率。
CDN缓存
什么是CDN?
内容分发网络(Content Delivery Network,CDN)是建立并覆盖在承载网上,由不同区域的服务器组成的分布式网络。将源站资源缓存到全国各地的边缘服务器,利用全球调度系统使用户能够就近获取,有效降低访问延迟,降低源站压力,提升服务可用性。
用户请求CDN的流程
假设您的业务源站域名为 www.test.com ,域名接入 CDN 开始使用加速服务后,当您的用户发起 HTTP 请求时,实际的处理流程如下图所示:
详细说明如下:
- 用户向 www.test.com 下的某图片资源(如:1.jpg)发起请求,会先向 Local DNS 发起域名解析请求。
- 当 Local DNS 解析 www.test.com 时,会发现已经配置了 CNAME www.test.com.cdn.dnsv1.com ,解析请求会发送至 Tencent DNS(GSLB),GSLB 为腾讯云自主研发的调度体系,会为请求分配最佳节点 IP。
- Local DNS 获取 Tencent DNS 返回的解析 IP。
- 用户获取解析 IP。
- 用户向获取的 IP 发起对资源 1.jpg 的访问请求。
- 若该 IP 对应的节点缓存有 1.jpg,则会将数据直接返回给用户(10),此时请求结束。若该节点未缓存 1.jpg,则节点会向业务源站发起对 1.jpg 的请求(6、7、8),获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点(9),并返回给用户(10),此时请求结束。
CDN主要优势
CDN 有效地解决了目前互联网业务中网络层面的以下问题:
- 用户与业务服务器地域间物理距离较远,需要进行多次网络转发,传输延时较高且不稳定。
- 用户使用运营商与业务服务器所在运营商不同,请求需要运营商之间进行互联转发。
- 业务服务器网络带宽、处理能力有限,当接收到海量用户请求时,会导致响应速度降低、可用性降低。
- 利用CDN防止和抵御DDos等攻击,实现安全保护。
二、Redis部署和使用
redis简介
Redis (Remote Dictionary Server)在2009年发布,开发者Salvatore Sanfilippo是意大利开发者,他本想为自己的公司开发一个用于替换MySQL的产品Redis,但是没有想到他把Redis开源后大受欢迎,短短几年,Redis就有了很大的用户群体,目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎网,GitHub,Twitter 等。
Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久性等功能。Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛。
redis特性
- 速度快: 10W QPS,基于内存,C语言实现
- 单线程
- 持久化
- 支持多种数据结构
- 支持多种编程语言
- 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
- 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
- 主从复制
- 支持高可用和分布式
单线程
Redis 6.0版本前一直是单线程方式处理用户的请求。
单线程为何如此快?
- 纯内存
- 非阻塞
- 避免线程切换和竞态消耗
Redis为什么这么快?
1、Redis是一款纯内存结构,避免了磁盘I/O等耗时操作。
2、Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。
3、采用了 I/O 多路复用机制,大大提升了并发效率。
注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。
redis对比memcached
- 支持数据的持久化:可以将内存中的数据保持在磁盘中,重启redis服务或者服务器之后可以从备份文件中恢复数据到内存继续使用
- 支持更多的数据类型:支持string(字符串)、hash(哈希数据)、list(列表)、set(集合)、zset(有序集合)
- 支持数据的备份:可以实现类似于数据的master-slave模式的数据备份,另外也支持使用快照+AOF
- 支持更大的value数据:memcache单个key value最大只支持1MB,而redis最大支持512MB(生产不建议超过2M,性能受影响)
- 在Redis6版本前,Redis 是单线程,而memcached是多线程,所以单机情况下没有memcached 并发高,性能更好,但redis 支持分布式集群以实现更高的并发,单Redis实例可以实现数万并发
- 支持集群横向扩展:基于redis cluster的横向扩展,可以实现分布式集群,大幅提升性能和数据安全性
- 都是基于 C 语言开发
memcached | redis | |
---|---|---|
类型 | key-value | key-value |
过期策略 | 支持 | 支持 |
数据类型 | 单一数据类型 | 五大数据类型 |
持久化 | 不支持 | 支持 |
主从复制 | 不支持 | 支持 |
虚拟内存 | 不支持 | 支持 |
Memcached简介
Memcached 是一个高性能、分布式的内存对象缓存系统。
- 定义:
- 一个开源的、高性能的分布式内存缓存系统。
- 用于动态 Web 应用程序,减少数据库负载。
- 主要特点:
- 简单的键值存储。
- 内存存储,快速读写。
- 分布式架构,可横向扩展。
- 支持多种编程语言。
- 工作原理:
- 将数据存储在内存中。
- 使用 LRU(最近最少使用)算法管理缓存。
- 支持 get、set、delete 等基本操作。
- 用途:
- 缓存数据库查询结果。
- 存储会话数据。
- 缓存 API 调用结果。
- 减少应用程序对数据库的依赖。
- 优点:
- 极快的读写速度。
- 易于扩展。
- 减轻数据库负载。
- 提高应用程序响应速度。
- 局限性:
- 不持久化存储。
- 支持数据结构操作。
- 没有内置的安全机制。
redis典型应用场景
- Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享。
- 缓存:数据查询、电商网站商品信息、新闻内容。
- 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景。
- 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等。
- 消息队列:ELK的日志缓存、部分业务的订阅发布系统。
- 地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能。
安装redis
前最新release版本redis 源码包:http://download.redis.io/releases/
yum -y install gcc jemalloc-devel systemd-devel
安装依赖包,支持systemd
make USE_SYSTEMD=yes PREFIX=/apps/redis install
指定安装目录
echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
配置变量,并且写在profile.d下,开机自启。
mkdir /apps/redis/{etc,log,data,run}
创建配置文件、日志、数据等目录
cp redis.conf /apps/redis/etc/
源码包中自带配置文件
前台启动redis
1.指定配置文件
redis-server /apps/redis/etc/redis.conf
指定配置文件启动。
2.systemd 启动
需要准备用户
useradd -r -s /sbin/nologin redis
增加用户
chown -R redis.redis /apps/redis/
设置目录权限
准备service文件
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
#Type=notify 如果支持systemd可以启用此行,表示该服务会在启动完成后主动通知systemd
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
处理redis的warning信息
- TCP backlog
backlog参数控制的是三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列。
vim /etc/sysctl.conf
net.core.somaxconn = 1024
- vm.overcommit_memory
vim /etc/sysctl.conf
vm.overcommit_memory = 1
0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1、表示内核允许分配所有的物理内存,而不管当前的内存状态如何
2、表示内核允许分配超过所有物理内存和交换空间总和的内存
- transparent hugepage
您在内核中启用了透明大页面(THP,不同于一般内存页的4k为2M)支持。 这将在Redis中造成延迟和内存使用问题。 要解决此问题,请以root 用户身份运行命令“echo never> /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local中,以便在重启后保留设置。禁用THP后,必须重新启动Redis。
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
连接到Redis
客户端连接redis
redis-cli
-p 端口
-h 主机
-a 密码
默认无密码连接
图形化界面连接
安装软件redis-desktop-manager-0.8.8.384
可自行上网搜索。