记访问量从数据库转移到redis

小白一枚,曾经做访问量项目的时候经常会用到最简单的 “字段”+1 方式存储访问,这样无疑加重了数据库的工作量,并且数据也不够精确准确,在浏览扩展包教程发现了一个好东西并运用到了项目上面

awssat/laravel-visits

他的功能主要用于 区分IP访问次数就是我最需要的了!!!tag也是用于区别存储信息很重要的东西
考虑到扩展包升级之类的问题就把github地址放在上面了,升级后观看相关文档就可以了->github地址

  • 一个模型中支持多个统计字段(使用 tag 来区分);
  • 支持所有数据模型(不像有些扩展包只是 User 专用);
  • 支持区分 IP 访问次数,页面多刷几次查看数也不会增加(可配置);
  • 读取最多和最少访问量排序的模型列表;
  • 获取访问量最高的国家;
  • 获取月份、年份、全部统计访问量模型排序列表。

1.首先是使用composer安装扩展包

$ composer require awssat/laravel-visits

2.接下来发布配置文件

php artisan vendor:publish --provider="Awssat\Visits\VisitsServiceProvider"

3.因为是用redis存储访问量所以要确保redis正常运行

4.在config/database.php中新建一个redis配置专门用于存储访问

.
.
.
    'redis' => [

        'client' => 'predis',

        'default' => [
          .
          .
          .
        ],

        'laravel-visits' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 3, // anything from 1 to 15, except 0 (or what is set in default)
        ],
    ],
.
.
.

5.由于我做的是接口部分,所以这里基本上就大功告成了接下来就是使用visit()存储和读取了

接口存储部分$id为百科中每本书的ID increment()内可以填写累加的数量,默认为1 visit的第一个参数为每个模型的实例化
 //根据百科id获取百科详细信息
    public function getEncyclopedia($id)
    {
        $list=new Encyclopedium();
        //阅读量+1
        visits($list,$id)->increment();//这里$id为百科书籍ID,这样设置tag就能定位到每本书籍了
        return $list->where('id',$id)->first(['id','title','quarry','created_at','textarea'])->toarray();
    }
接口读取部分 循环中的$list[$k][‘id’]为每本书的id因为是展示列表所以在循环中读取并添加到数组当中
 //根据一级分类以及二级分类查找百科列表
    public function getEncyclopediaList($stage_id,$cate_id)
    {
        $list=new Encyclopedium();
        //访问量不再使用数据库字段改用redis缓存
        $list=$list->where(['encyclopedia_stage_id'=>$stage_id,'encyclopedia_cate_id'=>$cate_id])->get(['id','title','text'])->toarray();
        foreach ($list as $k=>$v) {
            $list[$k]['count_read']=visits(new Encyclopedium(),$list[$k]['id'])->count();
        }
        return $list;
    }

这样访问数量就搬到了redis中,下面进行数据隔离的操作

6.修改visit配置在config/visits.php实现ip隔离,默认情况下ip隔离也是开启的,只不过默认时间应该是15分钟,这样配置完成的话每天每个ip只记录一次的话会数据更精准一些,如果还有其他要求可以再新增一些redis配置然后在配置文件中添加相应配置,修改connection和remeber_ip就可以了,由于本人较懒,整张配置文件就直接放到上面了

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | Database Engine & Connection Name
    |--------------------------------------------------------------------------
    |
    | Supported Engines: "redis", "eloquent"
    | Connection Name: see config/database.php
    |
    */
    'engine' => 'redis',
    'connection' => 'laravel-visits',


    /*
    |--------------------------------------------------------------------------
    | Counters periods
    |--------------------------------------------------------------------------
    |
    | Record visits (total) of each one of these periods in this set (can be empty)
    |
    */
    'periods' => [
        'day',
        'week',
        'month',
        'year',
    ],

    /*
    |--------------------------------------------------------------------------
    | Redis prefix
    |--------------------------------------------------------------------------
    */
    'keys_prefix' =>  'visits',

    /*
    |--------------------------------------------------------------------------
    | Remember ip for x seconds of time
    |--------------------------------------------------------------------------
    |
    | Will count only one visit of an IP during this specified time.
    |
    */
    'remember_ip' => 24 * 60 * 60,

    /*
    |--------------------------------------------------------------------------
    | Always return uncached fresh top/low lists
    |--------------------------------------------------------------------------
    */
    'always_fresh' => false,


    /*
    |--------------------------------------------------------------------------
    | Ignore Crawlers
    |--------------------------------------------------------------------------
    |
    | Ignore counting crawlers visits or not
    |
    */
    'ignore_crawlers' => true,

    /*
    |--------------------------------------------------------------------------
    | Global Ignore Recording
    |--------------------------------------------------------------------------
    |
    | stop recording specific items (can be any of these: 'country', 'refer', 'periods', 'operatingSystem', 'language')
    |
    */
    'global_ignore' => ['country'],

];

这样整个访问量从数据库搬到redis的全部任务就完成了!!!

理想的光照不到现实的黑暗,明灯是黑夜中的奢侈品。如果你接受不了真实生活千疮百孔的消极,那么,请移步儿童区...
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4
李铭昕

显然还可以优化下,你现在 redis 读取是 N 次,可以改成1次

2年前 评论
working (楼主) 2年前
李铭昕 (作者) 2年前
working (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!