`
zhaomengsen
  • 浏览: 207276 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

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

阅读更多
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/123.html?1455853785
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使用实例

    在本"Redis使用实例"中,我们将深入探讨Redis的基本概念、常见操作以及如何在实际项目中应用。以下是对Redis的一些关键知识点的详细介绍: 1. **Redis基本概念**: - **键值对(Key-Value)存储**:Redis的核心...

    Redis实现高并发计数器

    此外,这里还提到了其他相关文章,如Redis的计数器模式实例、唯一计数的实现方法、防止刷单的计数器策略、Spring结合Redis实现访问计数器、基于Redis的PHP计数器类、Docker部署SpringBoot项目集成Redis做访问计数...

    PHP基于Redis计数器类

    本话题聚焦于如何使用PHP与Redis结合,实现一个自增计数器类,确保在并发环境下计数的准确性和唯一性。 首先,我们来看`RedisCounter.class.php`这个文件,它很可能包含了自定义的RedisCounter类。这个类通常会封装...

    redis实例

    【标题】:“Redis实例” ...10. **实战应用**:在缓存、计数器、发布订阅、限流、分布式锁等场景中使用Redis的最佳实践。 以上是对Redis实例可能涉及的知识点的详细解析,具体内容需参考提供的PPT资源进行深入学习。

    C# 控制台 redis实例

    在Redis中,还可以利用`Keys`命令查找特定模式的键,但要注意避免在生产环境中频繁使用,因为这可能导致性能问题。可以使用`Scan`命令替代,它以迭代方式安全地查找键。 此外,Redis支持事务(Transactions)和Lua...

    springboot+redis集群实例,linux 安装redis集群

    2. **安装Redis**:使用包管理器(如`apt-get`或`yum`)安装Redis服务器。 3. **配置Redis**:修改配置文件`redis.conf`,开启集群模式,设置端口、密码和其他参数。 4. **启动Redis服务**:通过命令启动Redis服务,...

    redis哨兵模式配置文件

    在哨兵模式下,多个Sentinel实例协同工作来监控主Redis实例和其从属节点的状态,确保在主节点故障时能够无缝地切换到一个从节点,从而保证服务的连续性。下面我们将深入探讨Redis Sentinel的配置文件以及如何设置和...

    Redis使用lettuce和jedis.pdf

    对于高可用性的Redis部署,通常会使用哨兵模式,通过配置RedisSentinelConfiguration实现。哨兵模式下,客户端连接到多个哨兵节点,并通过它们来发现主节点和从节点。Spring Data Redis的配置包括设置哨兵节点的主机...

    Redis新手学习使用介绍

    Redis是一种高性能的键值对数据存储系统,常用于缓存、消息队列、计数器等多种场景。作为新手,理解其基本概念、安装部署、数据类型以及操作命令是入门的关键。 首先,我们要了解Redis的基本概念。Redis是Remote ...

    redis和redisdesktop

    6. **发布/订阅**:Redis的pub/sub(发布/订阅)模式可以实现消息传递,让多个客户端订阅同一个主题,当有新消息发布时,所有订阅者都能收到。 接下来,我们讨论RedisDesktop工具的使用: 1. **界面友好**:Redis...

    redis 开发和使用规范 (最详细)

    1. 应该根据应用场景的需求选择合适的部署模式,比如单实例、主从复制或者集群。 2. 要重视数据备份,定期执行快照存储,确保数据安全。 3. 在使用自助服务时,要注意权限控制,防止误操作对系统造成影响。 ### ...

    计数器PHP实例代码

    总结来说,这个PHP计数器实例是一个基础的实现,展示了如何使用文本文件存储和处理数据,以及如何在PHP中进行简单的数据读写和操作。在实际项目中,我们需要根据需求对这个基础模型进行扩展和优化,以适应更复杂和高...

    C++使用redis的实例详解

    C++使用Redis的实例详解 该资源主要介绍了C++使用Redis的实例详解的相关资料,通过本文,希望帮助大家理解掌握这部分内容。 知识点1:hiredis简介 hiredis是Redis数据库的C接口,目前只能在Linux下使用,几个基本...

    redis实现实例

    在本实例中,我们将探讨如何使用Redis实现一个简单的应用,包括安装Redis、配置Java客户端Jedis以及处理连接超时问题。 首先,Redis的安装是整个过程的基础。在描述中提到的是Redis 3.0.2版本,这是一个稳定且广泛...

    Redis单机部署6.2.6版本

    这涉及到多个Redis实例的配置,以及使用`redis-trib.rb`工具进行集群初始化。 以上就是Redis单机部署的基本流程,但实际部署中还需要考虑如资源限制、监控、备份恢复等多方面因素。随着业务的发展,可能需要进一步...

    Redis使用以及文档笔记

    2. 连接Redis:创建Jedis实例,通过设置IP地址和端口号连接到Redis服务器。 3. 执行命令:使用Jedis对象的方法执行各种Redis操作,如`set`、`get`、`hset`、`hget`等。 4. 事务处理:Jedis也支持事务,可以通过`...

    Redis获取某个前缀的key脚本实例

    在Python中,我们可以使用`redis`库来方便地操作`SCAN`命令。`scan_iter`函数是一个迭代器,可以用来遍历匹配特定模式的所有key。以下是一个简单的Python脚本实例,用于统计并输出指定前缀的key数量: ```python #!...

    RedisPlus3.2免安装下载

    首先,Redis是一个高性能的键值存储系统,广泛应用于缓存、消息队列、计数器等多个领域。RedisPlus作为其增强版,不仅保留了原生Redis的所有特性,还添加了一些实用功能,如图形化界面管理、监控、报警等功能,使得...

Global site tag (gtag.js) - Google Analytics