成都创新互联网站制作重庆分公司

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::views
 value: view count (integer)

转换为模式:

代码如下:

 key: topic:views
 value: hash
   hash key:
   hash value: view count (integer)

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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:Redis的使用模式之计数器模式实例-创新互联
分享地址:http://cxhlcq.com/article/pijcj.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部