Redis的使用模式之计数器模式实例
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/123.html?1455853785
Redis是目前NoSQL领域的当红炸子鸡,它象一把瑞士军刀,小巧、锋利、实用,特别适合解决一些使用传统关系数据库难以解决的问题。打算写一系列Redis使用模式的文章,深入总结介绍Redis常见的使用模式,以供大家参考。
常见汇总计数器
汇总计数是系统常见功能,比如网站通常需要统计注册用户数,网站总浏览次数等等。使用Redis提供的基本数据类型就能实现汇总计数器,通过incr命令实现增加操作。
比如注册用户数,基本操作命令如下:
代码如下:
#获取注册用户数
gettotal_users
#注册用户数增加一位
incrtotal_users
按时间汇总的计数器
通常计数还要按时间统计,比如注册用户数需要按日统计,处理方法比较简单,把日期带入计数器key就可以。
还是注册用户计数的例子,基本操作命令如下:
代码如下:
#假定操作2014-07-06数据
#获取注册用户数
gettotal_users:2014-07-06
#2014-07-06注册用户数增加一位
incrtotal_users:2014-07-06
#设置48小时过期时间172800=48*60*60
expiretotal_users:2014-07-06172800
为计数器设置一个48小时的过期时间是为了节省计数器占用空间,毕竟redis是内存数据库,可以在过期前执行一个任务把计数器存入关系数据库。
速度控制
速度控制也是Redis一种常见的计数用途,比如有一个API服务,希望控制每一个IP每秒请求数不超过10次,可以用IP和时间秒作为key设置一个计数器,实现控制,伪代码如下所示:
代码如下:
#每秒最大请求数
MAX_REQUESTS_PER_SECOND=10
#检查ip请求限制
#@paramip
#@raise超过限制,抛出RuntimeError异常
defcheck_request_limitation_for_ip(ip)
time_tick=Time.now.to_i
key="#{ip}:#{time_tick}"
num=$redis.get(key).to_i
ifnum>MAX_REQUEST_PER_SECOND
raise'toomanyrequests'
else
$redis.incr(key)
$redis.expire(key,10)
end
end
使用Hash数据类型维护大量计数器
有时候需要维护大量计数器,比如每一个论坛主题的查看数,比如每一个用户访问页面次数,因为论坛主题和用户基数可能很大,直接基于论坛主题或用户ID生成计数器的话,占用Redis资源还是相当可观的,这时可以用Hash数据类型压缩所需资源。
比如,对应论坛主题查看计数,可以由模式
代码如下:
key:topic:<topic_id>:views
value:viewcount(integer)
转换为模式:
代码如下:
key:topic:views
value:hash
hashkey:<topic_id>
hashvalue:viewcount(integer)
总结:利用Redis实现计数器,可以简单高效实现各种计数功能