Upload
vincent253
View
1.702
Download
1
Embed Size (px)
DESCRIPTION
服务端开发的瑞士军刀,Redis 常见使用模式分析 Redis 简介 Redis 的特点 从一道面试题说起 简单需求分析 基于关系数据库解决思路 问题升级 Redis 解决思路 1 Redis 解决思路 2 Redis 解决思路 3 对比上述几种解决思路 常见 Redis 使用模式 • 计数器 String • 最新列表 List • 关系集合 Set • 排行榜 Sorted Set • 属性表 Hash 更多的使用模式 • 跨服务器锁定 • 任务队列 • 缓存 总结 • Redis 一种提供多种类型(String List Hash Set Sorted Set)的 Key Value 内存数据库 • Redis 擅长解决服务端开发领域如计数,最新列表,排行榜等各种疑难杂症,开发必备
Citation preview
服 端 的瑞士 刀务 开发 军Redis 常 使用模式分析见薄荷 文威 谢 2014.7.20vincent @ rubychina. http://xiewenwei.net
Redis 介简
REmote DIctionary Server, remote data structure server
Key-Value 型 NoSQL 数据 ,支持 库 String, List, Hash, Set, Sorted Set 等丰富数据类型
内存数据 ,支持 库 RDB( 快照 ) 和 AOF( 日志 )持久化
支持 制,集群,复 LUA 脚本
Redis 的特点
利,非常快锋
小巧, 易上手简单
用,功能强大实
非常适合解决服 端 某些使用 系数务 开发 关据 常棘手 ,居家旅行必异 问题 备
从一道面 起试题说网站系 消息功能实现 统
管理 能 所有用 送系 消息,比如升员 给 户发 统提醒级
用 能 取消息状 ,如新消息条数户 获 态
用 能 看系 消息列表,能 看某一条户 查 统 够查消息 内容详细
管理 能了解某条消息 的用 及 数员 读过 户 总
需求分析简单
基于 系数据 解决思路关 库
升问题 级
假如用 数是千万 ,每 一条消息将要向 户 级 发users_messages 表插入上千万条 ,如果记录有几十条呢 ...
根据二八定律,活 用 是占少跃 户总数, users_messages 只放入活 用 ,跃 户记录
会 少到百万条 , 是很多这 减 记录 还 ...
状 只有已态 读 / 未 类,读两 users_messages 只放已 ,又可以 少很多读记录 减
Redis 解决思路 1
使用 set 数据类型, 每位用 建立已 为 户 读message id 集合
把 UsersMessages 转换为 key-value 存 , 储key: user:<id>:msgs value: 已 读 message id 集合
建立已 人数 读 counter, key: msg:<id>:counter, value: integer
Redis 解决思路 1
主要操作
消息发 : messages 表插入 1 条记录
取消息获 : smembers user:<id>:msgs
置已 消息:读 sadd user:<id>:msg msg_id
置已 消息 数:读 计 incr msg:<id>:counter
Redis 解决思路 2
把 UsersMessages 转换为 key-value 存 , 储key: msg:<id>:users value: 已 消息 读 user id 集合
通 过 scard msg:<id>:users 得已 消息数,不获 读需要 外 额 维护 counter
Redis 解决思路 2
主要操作
消息发 : messages 表插入 1 条记录
取消息获 : sismember msg:<id>:users user_id
置已 消息:读 sadd msg:<id>:users user_id
Redis 解决思路 3
利用 redis bit 特性,用一个位 为 1 表示 已为,把 读 user_id 整数 作 值 为 bit 位置
key: msg:<id>:bits value: long string
1 M bytes string 就可以存 800 多万用 某一户个消息状 , 度精 态 极 简
比上述几 解决思路对 种
基于 系数据 ,存 量巨大, 很慢关 库 储 访问
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 ,缺点:没法 置 设expire
数器:速度控制计
以 ip 和秒 合作组 为
key , 置 设 10 秒 期过
时间
每个 求取 数判断是请 计
否超 ,超 抛过阈值 过 异
常,没超 加过则 1
最新列表
最新注册用 列表户
key: rent_users
value: list
最新 表主论坛 发 题
key: rent_topics
value: list
lpush key 202
ltrim key 0 99
lrange key 0 10
系集合关
象 对 标签 Tag
用 注 系户关 关
判断违规词
sadd key “ruby”
scard key
sismember key “ruby”
smembers key
sinter key1 key2
排行榜
用 分榜户积
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
属性表
会 数据话
key: session_id
value: hash
用 特性表户
key: user:<id>:profile
value: hash
hset key name “ruby”
hget key name
hgetall key
更多的使用模式
跨服 器 定务 锁
任 列务队
存缓
总结
Redis 一 提供多 类型(种 种 String List Hash Set Sorted Set )的 Key Value 内存数据库
Redis 擅 解决服 端 域如 数,最新长 务 开发领 计列表,排行榜等各 疑 症, 必种 难杂 开发 备