cache:读缓存,是为了调节速度不一致的两个或多个不同物质的速度。例如cpu先从内存读,内存没有再读磁盘。
buffer:写缓冲,先将数据写入自己最近的地方,,例如cpu写数据会先写入内存。后续由内核写入磁盘
缓存保存位置及分层结构
用户层:浏览器DNS,应用程序DNS,操作系统DNS缓存
代理层:CDN,反向代理缓存
web层:web服务器缓存,解释器opcache
应用层:页面静态化
数据层:分布式缓存,数据库
系统层:操作系统cache
物理层:磁盘cache,raid cache
cache特性
自动过期 缓存数据有实效,超过时间自动删除
强制过期 源网站更新内容后CDN不会自动更新,需要强制让缓存过期
命中率 缓存的读取命中率
浏览器缓存过期机制
1 最后修改时间 last-modified。浏览器请求文件时,会获取last-modified和本地浏览器缓存的文件修改时间比较,如果一样,那么就会返回304,从缓存中读取内容。如果不一样,那么就会重新请求。需要向服务器发起请求才可以使用缓存
2 etag标记:是httpheader中代表资源的标签,在服务器端生成。如果有etag,下一次发送带有etag的请求事,etag没有变化将返回304。需要向服务器发起请求才可以使用缓存
3 过期失效时间expires:由服务端设置,在expires内都不会http请求,直接读取缓存。强制刷新除外。默认过期时间为30天。如果设置过期时间为1年,资源的失效是从客户端请求开始计算往后1年失效。
4 混合使用
last-modified和expire混合使用
etag和expire混合使用:判断expire,过期则发起http请求,然后根据etag返回200或者304
三者混合使用:先判断expire,过期发送http请求,先判断last-modified,如果一致,再判断etag,还是一致,才能返回304
nosql数据库类别
临时性键值存储 memcached,redis
永久性键值存储 roma,redis
面向文档的数据库 mongob,couchdb
面向列的数据库 cassandra ,hbase
rbdms和nosql的对比
特点
关系型数据库 | nosql | |
特点 |
数据关系基于关系模型,结构化存储,完整性约束 基于二维表及其之间的联系 采用结构化的查询语言做数据读写 操作需要数据的一致性,需要事务甚至是强一致性 |
非结构化的存储 基于多维关系模型 具有特有的使用场景 |
优点 |
保持数据的一致性(事务处理) 可以进行join等复杂查询 通用性,技术成熟 |
高并发,大数据下读写能力较强 基于支持分布式,易于扩展,可伸缩 简单,弱结构化存储 |
缺点 |
数据读写必须经过sql解析,大量数据,高并发下读写性能不足 对数据读写,或修改诗句结构时需要加锁,影响并发操作 无法适应非结构化存储 扩展困难 复杂 |
jion等复杂操作能力弱 事务支持弱 通用性差 无完整约束复杂场景支持较差 |
redis对比memcached
支持数据的持久化:能将内存中的数据保存在磁盘中,重启redis服务或者服务器可以从备份文件中恢复数据到内层中继续使用
支持更多的数据类型:string,hash,list,set,zset
支持数据的备份:可以实现类似于数据的master-slave模式的数据备份,也支持使用快照和aof
支持更大的value数据:memcache单个key value最大只支持1mb,redis最大支持512mb,生产不建议超过2m
在redis6版本前,redis是单线程,memcache是多线程,单机情况下并发不高,但是支持分布式集群可以实现数万并发
都是基于c语言开发
redis典型应用场景
session共享:常见于web集群中的tomcat
缓存:数据查询,电商网站商品信息,新闻内容
计数器:访问排行榜,浏览数等和次数相关的数值统计场景
微博微信:共同好友,粉丝数,关注,点赞评论等
消息队列:elk的日志缓存
地理位置:摇一摇,附近的人,外卖等
编译安装redis
---------------------------------------------------------
yum -y install gcc jemalloc-devel 下载依赖
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xvf redis-5.0.3.tar.gz
cd redis-5.0.3/
make PREFIX=/apps/redis install 安装目录自定义
echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
. /etc/profile.d/redis.sh
mkdir /apps/redis/{etc,log,data,run} 创建配置文件,日志,数据等
cp /app/redis-5.0.3/redis.conf /apps/redis/etc/ 将redis.conf拷贝到安装目录etc下
redis-server redis.conf 前台启动redis
可以开启redis多实例
redis-server --port 6380
chown -R redis.redis /apps/redis/ 很重要
-----------------------------------------------
解决启动时的警告
1.vim /etc/sysctl.conf
net.core.somaxconn=1024
vm.overcommit_memory=1
2.echo 'echo nerver' > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
---------------------------------------------------
编辑redis的systemd启动文件,复制yum安装的进行修改路径
验证redis启动
systemctl daemon-reload systemctl enable --now redis
-----------------------------------------------------
多实例部署
将原来的redis.conf修改redis_6379.conf,红色为修改部分
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /apps/redis/run/redis_6379.pid
loglevel notice
logfile "/apps/redis/log/redis_6379.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /apps/redis/data/
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly_6379.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
修改完后复制成redis_6380.conf ,redis_6381.conf。对应的systemd启动文件复制修改(改下对应的配置文件名字即可)。其他的不需要动。data,log,pid会自动生成。
启动!!!systemctl daemon-reload systemctl enable --now redis_6379 redis_6380 redis_6381