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 实现计数器,可以简单高效实现各种计数功能

时间: 2024-07-29 05:05:16

Redis的使用模式之计数器模式实例的相关文章

C#对象为Null模式(Null Object Pattern)实例教程

本文以实例形式简单讲述了C#对象为Null模式(Null Object Pattern),分享给大家供大家参考.具体实现方法如下: 所谓的"对象为Null模式",就是要求开发者考虑对象为Null的情况,并设计出在这种情况下的应对方法. 以前面" "一文中的例子来说,在我们的客户端程序中只考虑了用户输入1,2,3的情况,如果用户输入其它数字,比如4,就没有一个对应的IBall接口实现类实例产生,于是会报如下的错: 为了应对这种情况,我们专门设计一个类,当用户输入1,2

Redis集群都有哪些模式

前言: 一,为什么要使用redis 1,解决应用服务器的cpu和内存压力 2,减少io的读操作,减轻io的压力 3,关系型数据库扩展性不强,难以改变表的结构 二,优点 1,nosql数据库没有关联关系,数据结构简单,扩展容易 2,数据读写快,能够每秒胜任几十万的并发,处理速度快 三,使用场景 1,数据高并发读写 2,海量数据读写 3,对不规则数据也就是扩展性要求高的数据 四,不适合场景 1,需要事务支持,虽然它也有事务但是没有关系型数据库的那么成熟吧 2,基于sql进行操作 好了扯远了,现在来讲

Springboot2.x整合Redis以及连接哨兵模式/集群模式

依赖: <!--spirngboot版本为2.x--><!-- 加载spring boot redis包,springboot2.0中直接使用jedis或者lettuce配置连接池,默认为lettuce连接池,这里使用jedis连接池 --><!-- 加载spring boot redis包 --><dependency> <groupId>org.springframework.boot</groupId> <artifact

3.redis单节点及主备模式

1.单节点模式 单节点模式的配置,使用redis通用配置即可. (1)启动命令: 1 /path/to/redis-server /path/to/redis-6379.conf 注:配置文件名称只是示例,一般一台机器不止启动一个redis实例,使用端口区分配置文件是比较好的方式 (2)关闭命令: 1 /path/to/redis-cli -h <host> -p <port> -a '<password>' shutdown save 注:建议不要直接kill进程,会

redis解决方案之三种集群模式的概念与部署

上篇文章为大家总结了redis命令并讲述了持久化,今天我们来看一下redis的三种集群模式:主从复制,哨兵集群,Cluster集群 本篇文章先介绍redis-cluster,然后再依次介绍它的哨兵集群与主从复制 一.Cluster集群模式概念 redis集群是一个分布式与容错的redis实现.在集群中不存在代理节点与中心节点.后期可以很好的将其进行扩展 此模式也解决了redis高可用与可扩展的问题.但是redis集群不支持需要同时处理多个Key的redis命令 因为执行这些命令需要在多个redi

实例上下文模式:会话模式

一.会话模式简介与示例代码   会话模式下,客户端和服务实例上下文.服务实例是一一对应关系,每一个客户端都在服务端都有自己对应的服务实例上下文.如下图所示                  服务端使用会话模式的条件: 1.使用支持会话模式的绑定,如WSHttpBinding.WS2007HttpBinding.NetTcpBinding.NetNamedPipeBinding. 不支持会话的绑定有 BasicHttpBinding.NetMsmqBinding.Msmq属于离线状态的绑定,交互使

抽象工厂模式(Abstract Factory)C#实例

抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 本实例描述了抽象工厂模式的一个使用场景.在动物世界弱肉强食,食肉动物会吃掉食草动物.这是动物世界的规律,因此在动物世界类中有Runfoodchain(运行食物链)方法.在动物世界里总是有食肉动物和食草动物这两个抽象成员.它们之所以是抽象成员是因为他们不是具体的一种动物.而食草动物与食肉动物的区别在

分组密码模式: CTR模式(计数器模式)

CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码,在CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流.最终的密文分组是通过将计数器加密得到的比特序列与明文分组进行XOR而得到的,如下图所示: 计数器的生成方法如下图所示: CTR模式和OFB模式一样,都属于流密码.如果我们将单个分组的加密过程拿出来,那么OFB模式和CTR模式之间的差异还是很容易理解的: CTR模式的加密: #include <STRING.H> #define IN #def

WCF实例上下文模式与并发模式对性能的影响

实例上下文模式 InstanceContextMode 控制在响应客户端调用时,如何分配服务实例.InstanceContextMode 可以设置为以下值: •Single – 为所有客户端调用分配一个服务实例. •PerCall – 为每个客户端调用分配一个服务实例. •PerSession – 为每个客户端会话分配一个服务实例. InstanceContextMode 的默认设置为 PerSession 并发模式ConcurrencyMode 控制一次允许多少个线程进入服务.Concurre