Redis的使用模式之计数器模式实例

 更新时间:2015年03月23日 10:23:54   投稿:junjie  
这篇文章主要介绍了Redis的使用模式之计数器模式实例,本文讲解了汇总计数器、按时间汇总的计数器、速度控制、使用 Hash 数据类型维护大量计数器等内容,需要的朋友可以参考下

Redis 是目前 NoSQL 领域的当红炸子鸡,它象一把瑞士军刀,小巧、锋利、实用,特别适合解决一些使用传统关系数据库难以解决的问题。打算写一系列 Redis 使用模式的文章,深入总结介绍 Redis 常见的使用模式,以供大家参考。

常见汇总计数器

汇总计数是系统常见功能,比如网站通常需要统计注册用户数,网站总浏览次数等等。 使用 Redis 提供的基本数据类型就能实现汇总计数器,通过 incr 命令实现增加操作。

比如注册用户数,基本操作命令如下:

复制代码 代码如下:

 # 获取注册用户数
  get total_users
  # 注册用户数增加一位
  incr total_users

按时间汇总的计数器

通常计数还要按时间统计,比如注册用户数需要按日统计,处理方法比较简单,把日期带入计数器 key 就可以。

还是注册用户计数的例子,基本操作命令如下:

复制代码 代码如下:

# 假定操作 2014-07-06 数据
  # 获取注册用户数
  get total_users:2014-07-06
  # 2014-07-06 注册用户数增加一位
  incr total_users:2014-07-06
  # 设置 48 小时过期时间 172800 = 48 * 60 * 60
  expire total_users:2014-07-06 172800

为计数器设置一个 48 小时的过期时间是为了节省计数器占用空间,毕竟 redis 是内存数据库,可以在过期前执行一个任务把计数器存入关系数据库。

速度控制

速度控制也是 Redis 一种常见的计数用途,比如有一个 API 服务,希望控制每一个 IP 每秒请求数不超过 10 次,可以用 IP 和 时间秒作为 key 设置一个计数器,实现控制,伪代码如下所示:

复制代码 代码如下:

 # 每秒最大请求数
  MAX_REQUESTS_PER_SECOND = 10

  # 检查 ip 请求限制
  # @param ip
  # @raise 超过限制,抛出 RuntimeError 异常

  def check_request_limitation_for_ip(ip)
    time_tick = Time.now.to_i
    key = "#{ip}:#{time_tick}"
    num = $redis.get(key).to_i
    if num > MAX_REQUEST_PER_SECOND
      raise 'too many requests'
    else
      $redis.incr(key)
      $redis.expire(key, 10)
    end
  end

使用 Hash 数据类型维护大量计数器

有时候需要维护大量计数器,比如每一个论坛主题的查看数,比如每一个用户访问页面次数,因为论坛主题和用户基数可能很大,直接基于论坛主题或用户 ID 生成计数器的话,占用 Redis 资源还是相当可观的,这时可以用 Hash 数据类型压缩所需资源。

比如,对应论坛主题查看计数,可以由模式

复制代码 代码如下:

  key: topic:<topic_id>:views
  value: view count (integer)

转换为模式:

复制代码 代码如下:

 key: topic:views
  value: hash
    hash key: <topic_id>
    hash value: view count (integer)

总结:利用 Redis 实现计数器,可以简单高效实现各种计数功能。

相关文章

  • 如何使用Redis保存用户会话Session详解

    如何使用Redis保存用户会话Session详解

    这篇文章主要给大家介绍了关于如何使用Redis保存用户会话Session的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Redis配置外网可访问(redis远程连接不上)的方法

    Redis配置外网可访问(redis远程连接不上)的方法

    默认情况下,当我们在部署了redis服务之后,redis本身默认只允许本地访问。Redis服务端只允许它所在服务器上的客户端访问,如果Redis服务端和Redis客户端不在同一个机器上,就要进行配置。
    2022-12-12
  • Redis实现延迟队列的项目示例

    Redis实现延迟队列的项目示例

    延迟队列是Redis的一个重要应用场景,本文主要介绍了Redis实现延迟队列的项目示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Redis中秒杀场景下超时与超卖问题的解决方案

    Redis中秒杀场景下超时与超卖问题的解决方案

    当我们在linux中使用ab来模拟高并发秒杀时可能会遇到两种问题,“超时和超卖”,本文就详细介绍了Redis中秒杀场景下超时与超卖问题的解决方案,感兴趣的可以了解一下
    2022-05-05
  • mac下redis安装、设置、启动停止方法详解

    mac下redis安装、设置、启动停止方法详解

    这篇文章主要介绍了mac下redis安装、设置、启动停止方法详解,需要的朋友可以参考下
    2020-02-02
  • redis replication环形缓冲区算法详解

    redis replication环形缓冲区算法详解

    这篇文章主要介绍了redis replication环形缓冲区算法的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 深入解析Java中Redis的20个常用方法

    深入解析Java中Redis的20个常用方法

    随着互联网技术的不断发展,Java编程语言在计算机科学与技术中的应用日益广泛,本论文以"深入解析Java中Redis的20个常用方法"为主题,系统地探讨了Java在Redis数据库操作中的应用和实现,需要的朋友可以参考下
    2024-01-01
  • Java实现多级缓存的方法详解

    Java实现多级缓存的方法详解

    对于高并发系统来说,有三个重要的机制来保障其高效运行,它们分别是:缓存、限流和熔断,所以本文就来和大家探讨一下多级缓存的实现方法,希望对大家有所帮助
    2024-02-02
  • redis 主从备份及其主备切换的操作

    redis 主从备份及其主备切换的操作

    这篇文章主要介绍了redis 主从备份及其主备切换的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Redis瞬时高并发秒杀方案总结

    Redis瞬时高并发秒杀方案总结

    本文讲述了Redis瞬时高并发秒杀方案总结,具有很好的参考价值,感兴趣的小伙伴们可以参考一下,具体如下:
    2018-05-05

最新评论