美文网首页技术干货程序员干货
Redis服务器开发(Ruby China 上海7月20日)

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

作者: 朱小虎XiaohuZhu | 来源:发表于2014-07-20 10:56 被阅读416次

    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:<id>:msg msg_id
    • 置已读消息计数

    Redis解决2

    把usermessage转化为key-value存储

    主要操作

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

    Redis解决3

    • redis bit特性,用0/1位来表示某个用户是否已经读过
    • 1Mbit 8000000位
    • key:mes:<id>: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:<id>: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日)

        本文链接:https://www.haomeiwen.com/subject/alestttx.html