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内存数据库
- 更多的功能