Redis的使用模式之计数器模式实例,Redis服务器开

作者: 数据库信息  发布:2019-12-18

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

Redis服务器开发(talk abstract)

薄荷网 谢文威

Redis简介

REmote disctionary server remote data structure server

  • key-value nosql data base, string list hash set sorted set 丰富的数据类型
  • 内存数据库,RDB和AOF
  • 复制,集群 Lua

常见汇总计数器

Redis特点

  • 快 110k读 50k写
  • 简单,命令简单易上手
  • 使用,功能强大
    适合服务端开发使用Relational数据

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

面试题

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

实现网站系统消息

  • 管理员发送消息给全体用户
  • 用户获取消息状态,新消息条数
  • 系统消息列表
  • 读某个系统消息的内容

复制代码 代码如下:

关系数据库解决

  • User.id name
  • Message.id title body created_at state
  • UserMessage.id user_id message_id created_at updated_at stat

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

问题升级

  • 千万级用户,每个消息都要向user_message插入数据
  • 2/8定律:不是所有人的消息放入user_message,只放入活跃用户记录,减少10%。还是很多
  • 已读未读,只放已读的,不妨未读

按时间汇总的计数器

Redis解决1

  • set数据类型,为每个用户建立已读的message id集合
  • key为user_id
    ...

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

主要操作

  • 发消息
  • 获取消息
  • 置已读消息 sadd user:<id>:msg msg_id
  • 置已读消息计数

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

Redis解决2

把usermessage转化为key-value存储

复制代码 代码如下:

主要操作

  • 发消息
  • 获取消息
  • 置已读消息 在集合中

# 假定操作 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

Redis解决3

  • redis bit特性,用0/1位来表示某个用户是否已经读过
  • 1Mbit 8000000位
  • key:mes:<id>:bits value: long string

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

对比

redis基于user的message id集合 操作redis次数较少,需要额外维护message counter
redis基于message的user id集合 需要便利messages,操作redis次数少
redis基于message的user bits, 极简化存储,操作稍微麻烦一点

速度控制

常见Redis使用模式

  • string
  • list
  • set
  • sorted set
  • hash

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

计数器

  • 简单汇总计数,网站用户总数: incr total_users, get total_users

  • 按照时间汇总的计数器,如每日注册用户

    • key users:20140719
    • expire users:20140719 172800
  • Hash记录大批量计数,如用户Page View Click

    • key: users:page_clicks
    • value:
      • hash key: user_id
      • value: clicks
  • 速度控制:爬虫的冲击,对其访问进行控制:大于阈值抛出异常

本文由金沙澳门官网发布于数据库信息,转载请注明出处:Redis的使用模式之计数器模式实例,Redis服务器开

关键词: 金沙澳门官网