IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> bitmap过滤海量重复数据 -> 正文阅读

[大数据]bitmap过滤海量重复数据

需求

从海量的帖子中推荐一页帖子在首页,尽量避免用户刷到相同的帖子;

需求分析

1.针对用户推荐帖子
2.避免重复数据
3.帖子数据量巨大

实现

1.考虑用redis 布隆过滤器,但是因为我们可以得到帖子id是唯一的,直接用id作为hash值写入redis的bitmap ;
我这边是用户只要两个月不需要看到重复的数据即可;如果是没有时间限制则去掉对应的时间限制

RedisAbstract 缓存抽象类

abstract class RedisAbstract
{
    protected $prefix = 'rds';

    protected $name = 'default';

    /**
     * 获取 Redis 连接
     * @return RedisData|mixed
     */
    protected function redis()
    {
        return \Yii::$app->redisData;
    }

    /**
     * 获取缓存 KEY
     *
     * @param string|array $key
     * @return string
     */
    protected function getCacheKey($key = '')
    {
        $params = [$this->prefix, $this->name];
        if (is_array($key)) {
            $params = array_merge($params, $key);
        } else {
            $params[] = $key;
        }

        return $this->filter($params);
    }

    /**
     * @param array $params
     * @return string
     */
    protected function filter(array $params = [])
    {
        foreach ($params as $k => $param) {
            $params[$k] = trim($param, ':');
        }

        return implode(':', array_filter($params));
    }

}

FilterRepeated 过滤器


class FilterRepeated extends RedisAbstract
{
    protected $month;
    protected $userId;
    protected $name = "post";

    protected $bucket;
    protected $prefix = 'bl';

    protected function __construct($userId, $month)
    {
        $this->userId = $userId;
        $this->month = $month;
        $keyArr = [$userId, $this->month];
        $this->bucket = $this->getCacheKey($keyArr);
    }
    
    /**
     * 实例化当月对象
     * @param $userId
     * @return FilterRepeated
     */
    public static function fromThisMonth($userId)
    {
        return new self($userId, date('y_m'));
    }

    /**
     * 实例上月对象
     * @param $userId
     * @return FilterRepeated
     */
    public static function fromLastMonth($userId)
    {
        return new self($userId, date('y_m', strtotime('-1 month')));
    }

    /**
     * userId 是否看过ID
     * @param $userId
     * @param $string
     * @return bool
     */
    public static function existsLastTwoMonth($userId, $string)
    {
        $flag = false;
        //当月是否有看过
        $thisMonth = self::fromThisMonth($userId);
        if ($thisMonth->exists($string)) {
            $flag = true;
        }
        //没看过的话,上月是否看过
        if (!$flag) {
            $lastMonthFilter = self::fromLastMonth($userId);
            if ($lastMonthFilter->exists($string)) {
                $flag = true;
            }
        }

        return $flag;
    }

    /**
     * @param int $id
     * @return mixed
     */
    public function add(int $id)
    {
        return $this->redis()->setbit($this->bucket, $id, 1);
    }

    /**
     * @param array $ids
     * @return mixed
     */
    public function addMulti(array $ids)
    {
        if (count($ids) > 0) {
            $this->redis()->multi();
            foreach ($ids as $id) {
                $this->redis()->setbit($this->bucket, $id, 1);
            }
            return $this->redis()->exec();
        }
    }

    /**
     * @param $postId
     * @return bool
     */
    public function exists($id)
    {
        $bit = $this->redis()->getbit($this->bucket, $id);
        if ($bit == 0) {
            return false;
        }
        return true;
    }

    /**
     * 返回多个验证结果
     * @param $ids
     * @return mixed
     */
    public function existMulti($ids)
    {
        $this->redis()->multi();
        foreach ($ids as $id) {
            $this->redis()->getbit($this->bucket, $id);
        }
        return  $this->redis()->exec();
    }

    /**
     * bucket 下所有的数据清除
     */
    public function flush()
    {
        $this->redis()->expire($this->bucket, 0);
    }
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:58:25  更:2022-05-10 12:00:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:15:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码