lua脚步访问框架

在前面我已经使用Docker快速构建好了Redis集群;

一台Nginx分发层,两台Nginx应用层;

分发层通过一定的算法(使用lua脚步),转发请求到Ningx应用层;

Nginx应用层在启动进程是定时执行脚步(定时请求我们搭建的consul->集群列表),将获取到的集群信息更新到共享内存中;

在Nginx应用运行中,会获取到共享内存中的集群信息,使用lua脚步连接Redis集群,获取缓存;

如果在Redis集群中没有获取需要的key值,将请求转发到php-fpm访问到框架,查询mysql,返回数据,并且更新Redis集群

如果在Redis集群中获取到了key值,就不在请求php-fpm,通过模板直接渲染数据;

最后将获取到的数据通过lua的模板渲染插件进行渲染放回html文件;

--应用层连接php_fpm
function php_fpm()
     --内部子请求,根据框架的访问路径不同,来拼接相应的正确路径
     res = ngx.location.capture(
        '/php/abc/shop/public/index.php'..ngx.var.request_uri,
        method_body()
     )
     --ngx.say('/php/abc/shop/public/index.php'..ngx.var.request_uri)
     --返回的状态码不等于200才算成功
     --ngx.print(cjsonObj.encode(res))
     if res.status == ngx.HTTP_OK then
           -- ngx.say(res.body)
            return cjsonObj.decode(res.body)
     else
      --状态码不是200就返回404或者其它信息
            ngx.say('404')
     end
return
end

请求到php-fpm,获取到数据,通过模板渲染数据; 具体模板的使用: https://github.com/bungle/lua-resty-template 

local category = php_fpm()
goods['category']= category
local template = require "resty.template"
template.render("index.html", { goods = goods })

MyAnswer博客


PHP代码实例:

class IndexController extends Controller
{
    public  $obj_cluster;
    public  function __construct()
    {
        $this->obj_cluster = new \RedisCluster(NULL, ['45.40.207.143:6391','45.40.207.143:6392']);
    }
    /**
     * 商品分类
     * @param  TreeUtil $util [description]
     * @return [type]         [description]
     */
    public function goodsCate( )
    {
       $key="shop_category";
       if($category=$this->obj_cluster->get($key)){
          return $category;
       }
       $data=GoodsCategory::get();
       $this->obj_cluster->set($key,json_encode($data));
       return $data;
    }
    /**
     * 更新库存、更新缓存
     * @return mixed
     */
    public function update()
    {
        //更新数据库,更新redis,分析数据库双写不一致的问题
        dump(Goods::where('goods_id',383)->decrement('stock',1));
    }
}

更新缓存的问题

假设用户够买了商品,那么我需要去及时的更新库存,默认库存放在缓存中
  1.当我们更新了数据库时候,删除缓存失败
      解决办法,删除缓存,再去更新数据库,写入到redis当中;
  2.并发场景下数据库缓存双写问题
      在并场景下,数据发生变更,A用户先删除缓存,然后打算修改数据库,还没有修改完成时,B用户请求过来了,查询缓存没有,然后请求数据库得到的是旧的数据;

MyAnswer博客

解决方案: 使用队列, 生产->消费

MyAnswer博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论