亿级流量缓存架构学习(一)

3,372 阅读7分钟

前言

文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…
种一棵树最好的时间是十年前,其次是现在
我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码:549684836 鼓励大家在技术的路上写博客

絮叨

这个方案呢?基本上一线公司都在用的一个方案,我们公司当然达不到这个级别,但是也有用到这套解决方案的一部分东西,然后我看到这个系统,就学习一下,然后我自己打算就做一个记录吧,不一定说自己一步步跟着干出来,但是思想我肯定得学会,有道无术,术尚可求,有术无道,止于术。所以我们要学一样东西,再没有真正实践他之前我觉得只要做到观其大道就行。我这边也是大致的学习一下整体的一个思路,记录一下,各种细节的话得大家分解一个个技术点去实现的。就是一个简单的学习记录吧,这个方案有几个比较重要的点

  • Redis 高可用 高性能缓存架构
  • openrestry 高性能Web服务器

商品详情页多级缓存实战

商品详情页架构的要求->高可用 ,-> 高性能,-> 高并发 ; 一般来说 业界分为 种主流的方案

  • 中小公司的详情页方案
  • 头部大公司的方案

中小公司的详情页方案

很多中小型 电商的商品详情页 可能一分钟都没有一个访问,这种的话,就谈不上并发设计,一个tomcat 就能搞定。

还有一种中小型公司呢?虽然说公司不大,但是也是有几十万日活。然后几百万用户,这种公司,就是稍微大点的公司,他们的商品详情用,采取的方案可能是全局的一个静态页面这样子

  • 什么意思呢? 就是我们有把商品详情页直接做成一个静态页面,然后这样子每次全全量的更新,把数据全部静态放到nginx,里面,每次数据变化的时候,我们就通过一个Java服务去渲染这个数据,然后把这个静态页面推送到nginx服务器。(这个推送我也没做过,我想了下看是否能把生成的静态页面放到oss,然后配置一定的规则url,直接通过nginx访问这个静态页面)
    • 这种方案的缺点,如果商品很多,那么渲染的时间会很长,达不到实时的效果
    • 只能处理一些静态的东西,如果动态数据很多,比如有库存的,你不可能说每次去渲染,然后推送到nginx服务器,那不是更加慢?

大型公司的商品详情页的核心思想

其实怎么说呢?上面这张图就能解释他的核心思路了,这边小六六分几步给大家讲解一下

  • 第一步是用户通过一个首页嘛,我进入到了首页,然后我看到了一个商品,这个时候我只能看到这个商品的部分信息对吧,那要看详细信息,那么我得点进去,此时我就是请求了一个url ,这边小六六就随便举个列子,就比如说:www.hqjy.com/goods/10086;
  • 第二步,这个url呢?首先会经过我们的lb lvs,然后到我们的nginx集群,然后nginx 找到这个商品详情页的静态模板,然后里面有一个lua脚本,这个脚本可以去nginx本地去查看 id为 10086这个商品的动态数据,如果说这个10086商品没有nginx 缓存那么此时lua 就可以请求redis,如果说redis中也没有,就直接调用商品的缓存服务(tomcat),然后商品服务查mysql es 等db 查到数据之后再缓存到redis,然后再缓存到nginx中,这样形成一个链路闭环,
  • 优点不要全量更新,并且做到n级缓存,可以做多高可用,高性能,高并发

Redis的架构

其实上面的商品详情页方案成功的关键在哪里呢?没错就是我们Redis的架构,你redis的qps 每秒能到几十万,然后能到做数据的实时备份,并且保证服务的百分之99.99可用。

redis这块,我们公司用的云服务,一般要自己做的话,搭建一个企业级的怎么去考虑他的持久化方案,持久化的真实意义

其实这块就是redis相关的知识,但是在高并发的场景redis是必须的,对于redis的用法 高可用 读写分离的架构,这边就不说了,反正就是redis是高并发的基石

分布式数据存储的几种算法

  • 最简单的Hash算法

  • 一致性hash

  • hash slot

什么是Openresty?

什么是openresty?

OpenResty® 是一款基于 NGINX 和 LuaJIT 的 Web 平台。

OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。

通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。

借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前京东,淘宝、去哪儿网等都在使用Nginx+Lua架构。

Openresty的下载安装

小六六自己也是通过官网去安装的,所以给大家一个官网地址 -Openresty ,其实我觉得中国人写的 所以文档对中文还是有很好的支持的,哈哈。

下载源码包

我这边是基于centos 安装的

  • 第一步,创建一个目录 比如我就是
mkdir /data/openresty 
  • 第二步 下载包 解压
  wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
  tar -zxvf openresty-1.15.8.2.tar.gz 
  • 第三步 就是要安装一些库 您必须将这些库 perl 5.6.1+, libpcre, libssl安装在您的电脑之中。 对于 Linux来说, 您需要确认使用 ldconfig 命令,让其在您的系统环境路径中能找到它们。
yum install pcre-devel openssl-devel gcc curl
  • 第四步
 ./configure 

  • 第五步 make
make
  • 第六步
sudo make install

当你完成上述步骤的时候,你目前就可以把openrestry安装完成,

完成之后,你就去到/usr/local/openresty 里面 这就是整个项目了

来个Hello Word

创建几个目录

mkdir ~/work
cd ~/work
mkdir logs/ conf/

conf/nginx.conf

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    server {
        listen 8080;
        location / {
            default_type text/html;
            content_by_lua_block {
                ngx.say("<p>hello, world</p>")
            }
        }
    }
}

假设您已将OpenResty安装到/usr/local/openresty(这是默认设置),我们将在环境中提供OpenResty安装的nginx可执行文件:PATH

PATH=/usr/local/openresty/nginx/sbin:$PATH
export PATH

然后,我们使用以下配置文件启动nginx服务器:

nginx -p `pwd`/ -c conf/nginx.conf

然后我们关闭server

结尾

今天把介绍了一下Redis的缓存架构,和一个最最最简单Openresty的入门,后面Openresty=nginx+lua 所以后面跟小六六一起来学习学习吧。 文章部分内容是小六六去B站 搜标题学习总结的

日常求赞

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见

六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !