Redis服务器开发(Ruby China 上海7月20日)

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数据

面试题

实现网站系统消息

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

关系数据库解决

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

问题升级

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

Redis解决1

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

主要操作

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

Redis解决2

把usermessage转化为key-value存储

主要操作

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

Redis解决3

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

对比

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

常见Redis使用模式

  • string
  • list
  • set
  • sorted set
  • hash

计数器

  • 简单汇总计数,网站用户总数: 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
  • 速度控制:爬虫的冲击,对其访问进行控制:大于阈值抛出异常

最新列表

最新注册用户列表

  • key: rent_user
  • value: list

论坛最新发表主题

  • key: rent_topics
  • value: list

集合(set)

  • 对象标签tag
  • 用户关注关系
  • 违规词判断
  • 常见操作:
    • sadd key "ruby"
    • scard key
    • sismember key "rury"
    • smembers key
    • sinter key1 key2
  • Ruby使用正则表达式判断违规词 比较吃力

自动判断文章是否违规,为网警提供支持

sorted list

  • 用户积分榜 查排名
    • key: user_ranking
    • value: user_id -> score
  • 热门话题排行榜
    • key: topic_ranking
    • value: topic_id -> score
  • 常见操作

hash

  • 会话数据
    • key session_id
    • value hash
  • 用户特性表
    • key: user::profile
    • value: hash
  • 常见操作
    • hset key name "Ruby"
    • hget key name
    • hgetall key

更多

  • 跨服务器的锁定: 用户需要生成pdf,如果同时执行多次,资源消耗,存在冲突,所以加跨进程跨服务器的锁。内存共享的方式来实现这样的锁定。直接使用redis的key/value做一个锁定判断。
  • 任务队列:
  • 缓存:本身可以做 与memcache不相上下 还可以持久化 配置不同,限定总内存大小,设置LRU策略

总结

  • 多种类型的key value内存数据库
  • 更多的功能

你可能感兴趣的:(Redis服务器开发(Ruby China 上海7月20日))