关于推荐中的过滤

Posted 小小她爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于推荐中的过滤相关的知识,希望对你有一定的参考价值。

数据量大的情况下使用布隆过滤器,可以采用的方案包括:

方案1: 直接将布隆过滤器的value存起来

因为布隆过滤器的value比较大,那么可以选择的key-value存储就要支持value比较大,显然redis不是好的选择,因为redis是单线程,容易阻塞,另外,value大的情况下,容易导致集群的负载不均衡,那么可以选择的有hbase和Rocksdb 

针对hbase来说,支持多版本比较好,高并发读取的性能其实并不是特别好

Rocksdb 只是引擎,现在虽然有Rocksdb Secondary Instance的解决方案,但是还不是集群方案,也不是很好的选择

360的pika是基于Rocksdb引擎做的集群方案,兼容redis协议,是一个不错的选择。

布隆过滤器的value在参数设置完成后,其实对应的长度是固定限制的,是否可以分段缓存呢,进而得出方案2:

方案2: 将布隆过滤器的value进行分段存储

采用熟悉的redis存储,比如:用户a的布隆过滤器的value,假设长度为M,可以分为4段,每段m/4,对应的key为:usera:filter:0 ,usera:filter:1,usera:filter:2,usera:filter:3

这样读取的时候,直接可以通过mget一次性读取4个key,最终组装成一个value,这样解决了大value的问题

当然,整个解决方案的前提是布隆过滤器是标注的算法,是固定长度的,不能选择不固定长度的变种

进一步想? 是否有开源的直接提供解决的方案呢,见方案3:

方案3:采用redis的插件

文档可以参考: https://redislabs.com/redis-best-practices/bloom-filter-pattern/

未测试

既然可以在服务端实现,那么是否有现成的基于客户端的封装呢,见方案4

方案4:Redisson实现布隆过滤器

Redisson中实现了一个基于redis的布隆过滤器

另外,guava中也提供了一个本地的api来进行布隆过滤器的实现

参考文档:

https://www.cnblogs.com/ysocean/p/12594982.html   Redis详解(十三)------ Redis布隆过滤器

redis bloom-filterhttps://redislabs.com/redis-best-practices/bloom-filter-pattern/ 

https://www.cnblogs.com/-wenli/p/13702695.html 布隆过滤器

https://www.modb.pro/db/32203   TendisX 冷热混合存储(Redis) 如何做 Bloom Filter 的选型:
https://zhuanlan.zhihu.com/p/147527659 简单的rocketdb集群: Rocksdb Secondary Instance  

以上是关于关于推荐中的过滤的主要内容,如果未能解决你的问题,请参考以下文章

构建协同过滤/推荐系统

推荐系统召回策略—基于协同过滤召回

数据归档,冷热数据分离

RACSignal 冷信号和热信号底层实现分析

RACSignal 冷信号和热信号底层实现分析

RACSignal 冷信号和热信号底层实现分析