Skip to content

Commit

Permalink
修复 bitcount 命令的链接
Browse files Browse the repository at this point in the history
  • Loading branch information
huangzworks committed Aug 11, 2012
1 parent 2590c0e commit b979a80
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions string/bitcount.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,24 @@ BITCOUNT

Bitmap 对于一些特定类型的计算非常有效。

假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 :ref:`SETBIT` 和 `BITCOUNT` 来实现。
假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 :ref:`SETBIT` 和 :ref:`BITCOUNT` 来实现。

比如说,每当用户在某一天上线的时候,我们就使用 :ref:`SETBIT` ,以用户名作为 ``key`` ,将那天所代表的网站的上线日作为 ``offset`` 参数,并将这个 ``offset`` 上的为设置为 ``1`` 。

举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 ``SETBIT peter 100 1`` ;如果明天 peter 也继续阅览网站,那么执行命令 ``SETBIT peter 101 1`` ,以此类推。

当要计算 peter 总共以来的上线次数时,就使用 `BITCOUNT` 命令:执行 ``BITCOUNT peter`` ,得出的结果就是 peter 上线的总天数。
当要计算 peter 总共以来的上线次数时,就使用 :ref:`BITCOUNT` 命令:执行 ``BITCOUNT peter`` ,得出的结果就是 peter 上线的总天数。

更详细的实现可以参考博文(墙外) `Fast, easy, realtime metrics using Redis bitmaps <http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/>`_ 。


性能
--------

前面的上线次数统计例子,即使运行 10 年,占用的空间也只是每个用户 10*365 比特位(bit),也即是每个用户 456 字节。对于这种大小的数据来说, `BITCOUNT` 的处理速度就像 :ref:`GET` 和 :ref:`INCR` 这种 O(1) 复杂度的操作一样快。
前面的上线次数统计例子,即使运行 10 年,占用的空间也只是每个用户 10*365 比特位(bit),也即是每个用户 456 字节。对于这种大小的数据来说, :ref:`BITCOUNT` 的处理速度就像 :ref:`GET` 和 :ref:`INCR` 这种 O(1) 复杂度的操作一样快。

如果你的 bitmap 数据非常大,那么可以考虑使用以下两种方法:

1. 将一个大的 bitmap 分散到不同的 key 中,作为小的 bitmap 来处理。使用 Lua 脚本可以很方便地完成这一工作。

2. 使用 `BITCOUNT` 的 ``start`` 和 ``end`` 参数,每次只对所需的部分位进行计算,将位的累积工作(accumulating)放到客户端进行,并且对结果进行缓存 (caching)。
2. 使用 :ref:`BITCOUNT` 的 ``start`` 和 ``end`` 参数,每次只对所需的部分位进行计算,将位的累积工作(accumulating)放到客户端进行,并且对结果进行缓存 (caching)。

0 comments on commit b979a80

Please sign in to comment.