我们活动存储都用的是redis,落地用mysql,这样就会面对一个问题:如何清理过期活动用过的key。同事搞个一个脚本:每天去扫码有无过期的活动,如果有就去slave redis实例中用scan扫描出活动所有的相关key,然后挨个清理。有一天redis发生了主备切换,这个脚本就去主redis上扫描去了,引起了告警。这种scan方式不是很好,我们在想是不是搞成一个日志服务,将这些key都记录下来,等到活动结束后直接看这些日志文件,对照着日志文件清理就行了,但是不去重的记录每个redis key的话,每天的数据量会很多,所以就有了如何去重的思考。

1.先记录,定期汇总
这种方式是记录下每条key的访问日志,暂时不做去重处理,第二天或者活动结束后进行一次整体的去重处理,这样异步的去重在不是很重要的场景还是可以使用一下的。
2.本地存储
比如使用本机memcache进行判重,如果在memcache中存在的就不写入日志文件中了,该方法的缺点是:日志系统肯定不是单机的,如果用单机memcache的话后续还是存在多机汇总的问题。使用本机sqlite也是一样的情况。
3.使用redis
redis目前有主从模式和集群模式,能够解决单机的问题,redis在去重这个问题上是个不错的方案,不过就是比较浪费内存,不过每个Key设置过期时间的话还好。
4.使用leveldb
leveldb和redis的原理差不多,不过成本较redis要低些。
5.布隆过滤器
在容忍一定概率错误的情况下,布隆过滤器是非常好的去重组件,极具性价比,不过布隆过滤器有个非常大的缺点:一旦初始化就不能删除数据,这样随着时间的增长,出错的概率就变高了。当然可以用多个布隆过滤器,不过这样比较费。使用前最好能估计好使用的容量。
6.布谷鸟过滤器
与布隆过滤器类似,解决了布隆过滤器的一些问题。
7.bitmap
bitmap比较适合整形数据的去重,也非常的节省资源。
8.多阶hash
非常牛的利器
可以根据实际情况选用不同的方式。