性能优化方案

  • 减少http请求
  • 压缩js/css
  • 减少cookie大小
  • css放在顶部,js放于底部
  • 避免使用css表达式
  • 使用CDN
  • 使用gzip压缩
  • 配置Etag
  • 加Expires或Cache-control
  • 避免空的src(浏览器在渲染过程中会把src中空内容加载)
  • 使用kv缓存
  • 数据库加索引,选引擎,读写分离,分库分表等
  • php 开启opcache

Redis 支持的数据结构及应用场景

  • string 字符串
  • list 列表
  • set 集合
  • hash 哈希散列
  • zset 有序集合

Redis不同数据结构的应用场景

  • string 最常见,普通的kv存储
  • hash 存储对象,比如存储用户信息,商品信息,订单信息等,(hmset, hgetall, hget等命令)
  • list 每个元素都是string 的双向链表,既队列又栈,可以用于好友列表,粉丝列表,消息队列MQ,最新消息排行(lpush, key value, rpush)
  • set 列表可以存储多个相同的字符串,集合通过散列列表来保证自己存储的每个字符串都各不相同,可用于共同好友,共同兴趣,分类标签,交并差集等运算,集合中成员是唯一的,不能出现重复数据(sadd key value, smembers key)
  • zset 按时间排序的时间轴,排好序的set,每个元素会关联一个分值,redis通过分数来为集合中成员进行从小到大的排序(zadd key score value)

Redis淘汰策略

Redis淘汰策略根据conf配置里的maxmemory_policy决定,我所在的平台maxmemory为10G

  • noeviction(不删除策略,达到最大内存限制时,如果再存,直接返回错误)
  • allkeys-lru 所有key, 优先删除最少使用 (less recently used的key)
  • volatile-lru 只限于设置了expire部分
  • allkeys-random 所有key, 随机删除一部分
  • volatile-random 只限于设置了expire部分,随机删除一部分
  • volatile-ttl 只限于设置了expire部分,优先删除剩余时间短的

淘汰策略选择:

  • 如果数据分冷热, 如果没啥具体的业务特征, 推荐使用allkeys-lru
  • key的访问频率差不多,用allkeys-random,读写所有元素的概率差不多
  • 如果想让Redis根据TTL来筛选删除key, 用volatile-ttl
  • volatile-radom和volatile-random视expire和业务情况而定

Redis的rdb和aof持久化的区别?

RDB持久化:将Redis在内存中的数据库记录定时dump到磁盘上
AOF持久化:将Redis的操作日志以追加的方式写入文件

区别:RDB持久化是指在指定的时间间隔内将内存中数据集快照写入磁盘,实际操作是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF持久化以日志形式记录服务器所处理的每一个写删操作,查询操作不会记录,以文本的方式记录

RDB 优点 :

  • 整个Redis数据库只包含一个文件,对于文件备份而言非常完美,一旦系统出现故障,恢复容易,文件迁移方便
  • 性能最大化:持久化是fork子进程,由子进程完成持久化工作,极大的避免服务进程执行IO操作
  • 相比AOF,持久的数据集大时,RDB启动更快

RDB缺点:

  • 如果要保证数据的高可用,最大限度的避免数据丢失,RDB不是最好的,系统在定时持久化之前宕机,数据将丢失
  • RDB通过fork子进程来协助完成数据持久化工作,如果数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至1秒钟

AOF优点:

  • 数据安全性更高,每秒同步,每修改同步(效率低),不同步,每秒同步(异步)效率非常高,一旦宕机,丢失1s
  • 写日志是append模式,写入即使宕机,也不会破坏日志文件中已经存在的内容,redis_check_aof解决数据一致性
  • AOF日志格式清晰,易于理解

AOF缺点:

  • 相同数量的数据集,AOF文件大于RDB文件
  • AOF恢复速度比RDB慢
  • AOF运行效率比RDB慢

总结:

  • 愿意牺牲性能,换取更高的缓存一致性 aof
  • 缓存一致性不用那么高,但是备份性能高 rdb

常见高可用高性能高并发解决

  • html静态化,CMS常用的高并发解决方案,需要注意更新策略
  • 图片服务器分离(分担web 服务器i/o负载,为图片服务器设置针对性的缓存方案,减少带宽成本,提高平台的可扩展性,可随时增加图片服务器,提高图片吐吞能力)
  • 数据库分库分表、库表散列,比如用户表,奇偶分离,不同模块不同的数据库表,物理上也好做隔离
  • 缓存kv,redis、memcache组件的使用
  • 镜像
  • 负载均衡(nginx, haproxy, 硬件F5)
  • CDN
  • 服务降级(保证关键节点上的可用)
  • 限流(通过对并发访问请求进行限速或一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率,则可以拒绝服务、排队或等待,nginx的limit_conn模块,limit_req模块)
  • 集群(服务器集群,组件集群[redis等])
  • 分布式(mfs,codis等)
  • 超时重试
  • 隔离(线程隔离,进程隔离,读写隔离,动静隔离,机房隔离)
  • 主备方式:HA使用比较多的是keepalived,它使主机备机对外提供同一个虚拟IP,客户端通过vip进行数据操作,正常期间主机一直对外服务,宕机后vip自动漂移到备机上
  • 主从方式:一主多从,主从之间进行数据同步,当Master宕机后,通过Paxos, Raft从Slave中选举出新的Master继续对外服务,主机恢复后以slave的身份重新加入,读写分离也是其中一个目的