use redis bitmap for label system

用redis来存储标签和用户的对应关系.
key: 标签
value: 每个用户一个比特位, 1表示有该标签属性, 0 表示没有该标签属性.

操作逻辑例如:

1. 取出带有某几个标签的用户.

比特与操作, 取出最终结果为1的比特位置.

例如

postgres=# select bit '10' & bit '11';

 ?column? 

----------

 10

(1 row)

2. 取出不带某个标签的用户.

以上结果与比特异或操作, 

postgres=# select bit '10' & (bit '10' # bit '11');

 ?column? 

----------

 00

(1 row)

建立用户和比特位置的对应关系.

用户ID, 比特位置

通过对应关系取出用户ID.

分库方案 : 

假设总共不会超过20万个标签.

内存为256GB

x为用户数, (1000000*x)/8为消耗的内存字节数.

256GB可以存储约1000万用户.

(1000000*x)/8=256*1024*1024*1024

x=10995115

那么如果我们有10亿用户的话, 需要100台这样的服务器来支撑.

每台服务器存储20万个标签, 1000万个用户, 每个键值需要1374389字节.

对于带权重的标签, 本方案不合适.

本方案只适合布尔逻辑值的标签.

如果资源紧张的话, 可以考虑PostgreSQL的解决方案.

PostgreSQL存储持久化数据, 并将redis的比特位操作函数移植到PostgreSQL.

在PostgreSQL中使用大对象存储用户比特位的信息. 

必须注意, PostgreSQL的多版本并发控制, 更新会产生新的版本. 所以必须搞清楚大对象的操作会不会产生多版本, 如果产生多版本, 那么是不是仅仅产生chunk的多版本. 应该尽量避免多版本的产生, 否则PostgreSQL可能不适合用于此场景.

大对象的操作接口如下 : 

http://www.postgresql.org/docs/9.4/static/largeobjects.html

[参考]

1. http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/

2. http://redis.io/commands

时间: 2024-10-31 13:31:20

use redis bitmap for label system的相关文章

C#中使用byte[]数据,生成Bitmap

/// <summary> /// 使用byte[]数据,生成256色灰度 BMP 位图 /// </summary> /// <param name="originalImageData"></param> /// <param name="originalWidth"></param> /// <param name="originalHeight"><

Windows下Redis中RedisQFork位置调整

  redis-server.exe redis.windows.conf 使用上面命令启动redis服务的时候报了以下错误信息:   The Windows version of Redis allocates a memory mapped heap for sharing with the forked process used for persistence operations. In order to share this memory, Windows allocates from

Guarding Against CSRF Vulnerability in Redis

Abstract: What is Redis CSRF vulnerability and how can we guarantee the security of Redis? Redis's CSRF vulnerability was exposed in February 2017, and the author of Redis has fixed the vulnerability in the latest release of Redis 3.2.7. This article

“System.ArgumentException”类型的未经处理的异常出现在 mscorlib.dll 中。 其他信息: 实例方法的委托不能具有空“this

问题描述 本人在做数据库课设,没有学过C#,只学过C和C++,做一个简易聊天室今天在连接数据库时,调试出了问题,而错误列表没有出,不知何处下手,求C#大神帮忙以下是代码namespace登录界面{partialclassForm1{///<summary>///必需的设计器变量.///</summary>privateSystem.ComponentModel.IContainercomponents=null;///<summary>///清理所有正在使用的资源.//

bitmap 类保存成的图片,背景是黑色的如何变成白色背景

问题描述 就是bitmap.save("f:\a.jpe");后生成的图片是黑色背景如何变成白色 解决方案 解决方案二:贴出上下文代码g.Clear(System.Drawing.Color.White);bitmap.Save(filename,System.Drawing.Imaging.ImageFormat.Jp);解决方案三:创建一个具有btimap宽高的临时图片tempBitmap,Graphicsg=Graphics.FromImage(tempBitmap);g.Cle

CentOS7/RHEL7安装Redis步骤详解

方法一:使用命令安装(前提是已经安装了EPEL). 安装redis: yum -y install redis 启动/停止/重启 Redis 启动服务: 1 systemctl start redis.service 停止服务: systemctl stop redis.service 重启服务: systemctl restart redis.service 检查状态: [root@idoseek ~]# systemctl status redis.service redis.service

将MVC Movie范例程序整合Azure Redis Cache上

最近公开预览的 Azure Redis Cache 很容易就能整合进您的 Azure 网站应用程序中,这里我将 MVC Movie 范例程序整合 Azure Redis Cache 然后部署到 Azure 网站服务(Websites)上,大约只花了 15 分钟左右. 在导入快取(cache)之后,程序的速度比起纯用数据库来说快了将近 100 倍,因为经常被存取的数据就可以直接从快取中取得,而不必再到数据库中捞数据,如此一来你也可以降低数据库的存取次数,让数据查询的动作变得更迅速. 接下来我会说明

centos7安装redis

方法一:使用命令安装(前提是已经安装了EPEL). 安装redis: yum -y install redis 启动/停止/重启 Redis 启动服务: 1 systemctl start redis.service 停止服务: systemctl stop redis.service 重启服务:  systemctl restart redis.service 检查状态:  [root@idoseek ~]# systemctl status redis.service redis.servi

Android全屏截图的方法,返回Bitmap并且保存在SD卡上

Android全屏截图的方法,返回Bitmap并且保存在SD卡上 今天做分享,需求是截图分享,做了也是一个运动类的产品,那好,我们就直接开始做,考虑了一下,因为是全屏的分享,所有很自然而然的想到了View的getDrawingCache()方法来获取Bitmap,看到网上有人说截取不了WebView上的图片,倒是没有去尝试,因为我们的应用不需要,不过有时间还是要去试试,占占坑,这篇博客只是记录一下知识点,没什么技术含量 我们写个小Sample就好了 activity_main.xml <?xml