广告
返回顶部
首页 > 资讯 > 数据库 >Redis实现唯一计数的3种方法分享
  • 821
分享到

Redis实现唯一计数的3种方法分享

种方法Redis 2022-06-04 17:06:04 821人浏览 泡泡鱼
摘要

唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每

唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每天有数百万的人访问,数据量相当大;二是通常还希望扩展计数的维度,比如除了需要每天的 UV,还想知道每周或每月的 UV,这样导致计算十分复杂。

在关系数据库存储的系统里,实现唯一计数的方法就是 select count(distinct <item_id>),它十分简单,但是如果数据量很大,这个语句执行是很慢的。用关系数据库另外一个问题是插入数据性能也不高。

Redis 解决这类计数问题得心应手,相比关系数据库速度更快,消耗资源更少,甚至提供了 3 种不同的方法。

1.基于 set

Redis 的 set 用于保存唯一的数据集合,通过它可以快速判断某一个元素是否存在于集合中,也可以快速计算某一个集合的元素个数,另外和可以合并集合到一个新的集合中。涉及的命令如下:

SISMEMBER key member  # 判断 member 是否存在

SADD key member  # 往集合中加入 member

SCARD key   # 获取集合元素个数

基于 set 的方法简单有效,计数精确,适用面广,易于理解,它的缺点是消耗资源比较大(当然比起关系数据库是少很多的),如果元素个数很大(比如上亿的计数),消耗内存很恐怖。

2.基于 bit

Redis 的 bit 可以用于实现比 set 内存高度压缩的计数,它通过一个 bit 1 或 0 来存储某个元素是否存在信息。例如网站唯一访客计数,可以把 user_id 作为 bit 的偏移量 offset,设置为 1 表示有访问,使用 1 MB的空间就可以存放 800 多万用户的一天访问计数情况。涉及的命令如下:

SETBIT key offset value  # 设置位信息

GETBIT key offset        # 获取位信息

BITCOUNT key [start end] # 计数

BITOP operation desTKEy key [key ...]  # 位图合并

基于 bit 的方法比起 set 空间消耗小得多,但是它要求元素能否简单映射为位偏移,适用面窄了不少,另外它消耗的空间取决于最大偏移量,和计数值无关,如果最大偏移量很大,消耗内存也相当可观。

3.基于 HyperLogLog

实现超大数据量精确的唯一计数都是比较困难的,但是如果只是近似的话,计算科学里有很多高效的算法,其中 HyperLogLog Counting 就是其中非常著名的算法,它可以仅仅使用 12 k左右的内存,实现上亿的唯一计数,而且误差控制在百分之一左右。涉及的命令如下:

PFADD key element [element ...]  # 加入元素

PFCOUNT key [key ...]   # 计数

这种计数方法真的很神奇,我也没有彻底弄明白,有兴趣可以深入研究相关文章。

redis 提供的这三种唯一计数方式各有优劣,可以充分满足不同情况下的计数要求。

您可能感兴趣的文档:

--结束END--

本文标题: Redis实现唯一计数的3种方法分享

本文链接: https://www.lsjlt.com/news/11725.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis实现唯一计数的3种方法分享
    唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每...
    99+
    2022-06-04
    种方法 Redis
  • Redis生成全局唯一ID的实现方法
    目录简介:特性:生成规则: ID生成类:测试类:简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性高性能安全性高可用递增性 生成规则:...
    99+
    2022-11-13
  • php实现分页功能的3种方法
    1. 使用数据库的LIMIT语句实现分页功能。这种方法是最常见的,通过在SQL语句中添加LIMIT子句来指定每页显示的记录数和偏移量...
    99+
    2023-08-14
    php
  • Java中实现String字符串分割的3种方法
    目录Java中实现String字符串分割的3种方法方法1:split(string) 方法方法2:substring方法方法3:StringTokenizer方法扩展:JAVA 截取...
    99+
    2023-05-20
    java string字符串分割 java 字符串分割
  • linux shell实现随机数几种方法分享(date,random,uuid)
    在日常生活中,随机数实际上经常遇到,想丢骰子,抓阄,还有抽签。呵呵,非常简单就可以实现。那么在做程序设计,真的要通过自己程序设计出随机数那还真的不简单了。现在很多都是操作系统内核会提供相应的api,这些原始...
    99+
    2022-06-04
    随机数 几种方法 shell
  • Redis实现分布式锁的五种方法详解
    目录1. 单机数据一致性2. 分布式数据一致性3. Redis实现分布式锁3.1 方式一3.2 方式二(改进方式一)3.3 方式三(改进方式二)3.4 方式四(改进方式三)3.5 方式五(改进方式四)3.6 小结在单体应...
    99+
    2022-06-14
    Redis 分布式锁
  • Redis实现分布式锁的几种方法总结
    Redis实现分布式锁的几种方法总结 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问...
    99+
    2022-06-04
    分布式 几种方法 Redis
  • Redis优雅地实现延迟队列的方法分享
    目录前言使用依赖配置配置文件demo代码执行效果原理分析队列创建生产者消费者整个流程总结思考前言 工作中常常会遇到这样的场景,如订单到期未支付取消,到期自动续费等,我们发现延迟队列非常适合在这样的场景中使用。常见的延迟队...
    99+
    2023-02-26
    Redis实现延迟队列 Redis延迟队列
  • Redis实现分布式锁的五种方法是什么
    本文小编为大家详细介绍“Redis实现分布式锁的五种方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis实现分布式锁的五种方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2022-10-19
  • 两种方法实现mysql分组计数,范围汇总
    第一种:常规操作 SELECT SUM(ddd) AS count_days, CASE WHEN aa.days >= 1 AND aa.days < 3 THEN '1-3' ...
    99+
    2022-05-29
    MySQL 分组计数 MySQL 范围汇总
  • redis五种数据结构的底层实现方法
    本篇内容主要讲解“redis五种数据结构的底层实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis五种数据结构的底层实现方法”吧!实现方法:1、每种数据结构都有自己底层的内部编码实现...
    99+
    2023-06-20
  • Android时分秒计时器的两种实现方法
    可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器。这个东西其实实现起来非常简单。 只需要用一个控件Chronometer,是的,...
    99+
    2022-06-06
    方法 计时器 Android
  • Android实现不同apk间共享数据的方法(2种方法)
    本文实例讲述了Android实现不同apk间共享数据的方法。分享给大家供大家参考,具体如下: Android给每个APK进程分配一个单独的用户空间,其manifest中的use...
    99+
    2022-06-06
    方法 数据 apk Android
  • redis实现缓存分页数据的方法
    这篇文章将为大家详细讲解有关redis实现缓存分页数据的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。几种思路:每页数据分别使用一个key缓存,各自设置过期时间,在数...
    99+
    2022-10-18
  • PHP实现Redis数据库分片的方法
    Redis是一款高性能的NoSQL数据库,而分片是一种常用的数据分布式处理方法,可以提高数据库的性能和扩展性。本文将介绍如何使用PHP实现Redis数据库分片。Redis分片概述Redis分片是将一个大的Redis数据库拆分成多个较小的Re...
    99+
    2023-05-17
    PHP Redis数据库 分片 (Sharding)
  • PHP实现Redis数据库分表的方法
    随着互联网业务的发展,数据量的增长已成为一种趋势。在这个背景下,分表是解决大数据存储问题的一种常见方法。分表可以将一张大表拆分成多个小表,从而达到分散数据存储,提高查询效率的目的。Redis是一个高性能、内存存储的数据结构服务器,其中分表同...
    99+
    2023-05-15
    PHP 分表 Redis数据库
  • Servlet实现共享数据JavaWeb组件的几种方法
    目录一、Servlet简介二、Servlet的运行过程Servlet组件:多个Servlet之间共享数据实现方案转发与重定向全局作用域对象Servlet JavaWeb三大组件包括,...
    99+
    2022-11-12
  • C语言实现倒置字符串的两种方法分享
    目录前言一、题目二、思路讲解 三、代码实现四、代码总结五、第二种方法倒置字符串六、总结 前言 今天在牛客网上刷了一道题,我感觉挺有意义的,现在我就分享给大家,并且...
    99+
    2022-11-13
    C语言 倒置字符串方法 C语言倒置字符串 C语言 字符串
  • php怎么统计数组中特定字符串的数量?两种方法分享
    在PHP编程中,经常需要查找数组中有多少个特定的字符串。本文将介绍如何使用PHP内置函数来查找数组中特定字符串的数量。在PHP中,有多种方法可以查找数组中的字符串。我们可以使用循环遍历数组并计数,也可以使用PHP内置函数来实现。下面分别介绍...
    99+
    2023-05-14
    php数组 php
  • JS实现数组扁平化的方法分享
    目录过程什么是扁平化方法一:flat方法二:递归前言 当我们遇到一个 树形结构的数据,或者 多层嵌套 的数组,如果想拿到数组项的 某一个 字段值,操作起来将会很麻烦,这个时候就需要我...
    99+
    2023-05-16
    JS实现数组扁平化 JS数组扁平化 JS数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作