More Related Content
Similar to Redis 常见使用模式分析 (20)
Redis 常见使用模式分析
- 1. 服 端 的瑞士 刀务 开发 军
Redis 常 使用模式分析见
薄荷 文威谢 2014.7.20
vincent @ rubychina.
http://xiewenwei.net
- 2. Redis 介简
REmote DIctionary Server, remote data structure
server
Key-Value 型 NoSQL 数据 ,支持库 String,
List, Hash, Set, Sorted Set 等丰富数据类型
内存数据 ,支持库 RDB( 快照 ) 和 AOF( 日志 )
持久化
支持 制,集群,复 LUA 脚本
- 4. 从一道面 起试题说
网站系 消息功能实现 统
管理 能 所有用 送系 消息,比如升员 给 户发 统
提醒级
用 能 取消息状 ,如新消息条数户 获 态
用 能 看系 消息列表,能 看某一条户 查 统 够查
消息 内容详细
管理 能了解某条消息 的用 及 数员 读过 户 总
- 7. 升问题 级
假如用 数是千万 ,每 一条消息将要向户 级 发
users_messages 表插入上千万条 ,如果记录
有几十条呢 ...
根据二八定律,活 用 是占少跃 户总
数, users_messages 只放入活 用 ,跃 户记录
会 少到百万条 , 是很多这 减 记录 还 ...
状 只有已态 读 / 未 类,读两 users_messages
只放已 ,又可以 少很多读记录 减
- 8. Redis 解决思路 1
使用 set 数据类型, 每位用 建立已为 户 读
message id 集合
把 UsersMessages 转换为 key-value 存 ,储
key: user:<id>:msgs value: 已读 message id
集合
建立已 人数读 counter, key: msg:<id>:counter,
value: integer
- 9. Redis 解决思路 1
主要操作
消息发 : messages 表插入 1 条记录
取消息获 : smembers user:<id>:msgs
置已 消息:读 sadd user:<id>:msg msg_id
置已 消息 数:读 计 incr msg:<id>:counter
- 10. Redis 解决思路 2
把 UsersMessages 转换为 key-value 存 ,储
key: msg:<id>:users value: 已 消息读 user id 集
合
通过 scard msg:<id>:users 得已 消息数,不获 读
需要 外额 维护 counter
- 11. Redis 解决思路 2
主要操作
消息发 : messages 表插入 1 条记录
取消息获 : sismember msg:<id>:users user_id
置已 消息:读 sadd msg:<id>:users user_id
- 12. Redis 解决思路 3
利用 redis bit 特性,用一个位为 1 表示 已为
,把读 user_id 整数 作值 为 bit 位置
key: msg:<id>:bits value: long string
1 M bytes string 就可以存 800 多万用 某一户
个消息状 , 度精态 极 简
- 13. 比上述几 解决思路对 种
基于 系数据 ,存 量巨大, 很慢关 库 储 访问
redis 基于 user 的 message id 集合,操作
redis 次数少,需要 外额 维护 message
counter ,【推荐使用】
redis 基于 message 的 user id 集合,需要
遍历 messages ,操作 redis 次数 多较
redis 基于 message 的 user bits , 化存极简
,操作稍微麻 一点储 烦
- 15. 数器计
数,如网站用 数简单汇总计 户总
incr total_users, get total_users
按 的 数器,如每日注册用时间汇总 计 户
key: users:20140719
expire users:20140719 172800
- 16. 数器计
使用 Hash 大批量 数,如用记录 计 户 Page View
Click
key: users:page_clicks
value:
hash key: user_id
value: clicks
点: 省内存, 少优 节 减 key ,缺点:没法 置设
expire
- 17. 数器:速度控制计
以 ip 和秒 合作组 为
key , 置设 10 秒 期过
时间
每个 求取 数判断是请 计
否超 ,超 抛过阈值 过 异
常,没超 加过则 1
- 19. 系集合关
象对 标签 Tag
用 注 系户关 关
判断违规词
sadd key “ruby”
scard key
sismember key “ruby”
smembers key
sinter key1 key2
- 20. 排行榜
用 分榜户积
key: user_ranking
value: user_id -> score
排行榜热门话题
key: topic_ranking
value: topic_id -> score
zadd key 10 101
zincrby key 1 101
zrange key 0 10
zrank key 101
zscore key 101
- 23. 总结
Redis 一 提供多 类型(种 种 String List Hash
Set Sorted Set )的 Key Value 内存数据库
Redis 擅 解决服 端 域如 数,最新长 务 开发领 计
列表,排行榜等各 疑 症, 必种 难杂 开发 备