24
的瑞士 开发 Redis 使用模式分析 薄荷 文威 2014.7.20 vincent @ rubychina. http://xiewenwei.net

Redis 常见使用模式分析

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

Page 1: Redis 常见使用模式分析

服 端 的瑞士 刀务 开发 军Redis 常 使用模式分析见薄荷 文威 谢 2014.7.20vincent @ rubychina. http://xiewenwei.net

Page 2: Redis 常见使用模式分析

Redis 介简

REmote DIctionary Server, remote data structure server

Key-Value 型 NoSQL 数据 ,支持 库 String, List, Hash, Set, Sorted Set 等丰富数据类型

内存数据 ,支持 库 RDB( 快照 ) 和 AOF( 日志 )持久化

支持 制,集群,复 LUA 脚本

Page 3: Redis 常见使用模式分析

Redis 的特点

利,非常快锋

小巧, 易上手简单

用,功能强大实

非常适合解决服 端 某些使用 系数务 开发 关据 常棘手 ,居家旅行必异 问题 备

Page 4: Redis 常见使用模式分析

从一道面 起试题说网站系 消息功能实现 统

管理 能 所有用 送系 消息,比如升员 给 户发 统提醒级

用 能 取消息状 ,如新消息条数户 获 态

用 能 看系 消息列表,能 看某一条户 查 统 够查消息 内容详细

管理 能了解某条消息 的用 及 数员 读过 户 总

Page 5: Redis 常见使用模式分析

需求分析简单

Page 6: Redis 常见使用模式分析

基于 系数据 解决思路关 库

Page 7: Redis 常见使用模式分析

升问题 级

假如用 数是千万 ,每 一条消息将要向 户 级 发users_messages 表插入上千万条 ,如果记录有几十条呢 ...

根据二八定律,活 用 是占少跃 户总数, users_messages 只放入活 用 ,跃 户记录

会 少到百万条 , 是很多这 减 记录 还 ...

状 只有已态 读 / 未 类,读两 users_messages 只放已 ,又可以 少很多读记录 减

Page 8: Redis 常见使用模式分析

Redis 解决思路 1

使用 set 数据类型, 每位用 建立已 为 户 读message id 集合

把 UsersMessages 转换为 key-value 存 , 储key: user:<id>:msgs value: 已 读 message id 集合

建立已 人数 读 counter, key: msg:<id>:counter, value: integer

Page 9: Redis 常见使用模式分析

Redis 解决思路 1

主要操作

消息发 : messages 表插入 1 条记录

取消息获 : smembers user:<id>:msgs

置已 消息:读 sadd user:<id>:msg msg_id

置已 消息 数:读 计 incr msg:<id>:counter

Page 10: Redis 常见使用模式分析

Redis 解决思路 2

把 UsersMessages 转换为 key-value 存 , 储key: msg:<id>:users value: 已 消息 读 user id 集合

通 过 scard msg:<id>:users 得已 消息数,不获 读需要 外 额 维护 counter

Page 11: Redis 常见使用模式分析

Redis 解决思路 2

主要操作

消息发 : messages 表插入 1 条记录

取消息获 : sismember msg:<id>:users user_id

置已 消息:读 sadd msg:<id>:users user_id

Page 12: Redis 常见使用模式分析

Redis 解决思路 3

利用 redis bit 特性,用一个位 为 1 表示 已为,把 读 user_id 整数 作 值 为 bit 位置

key: msg:<id>:bits value: long string

1 M bytes string 就可以存 800 多万用 某一户个消息状 , 度精 态 极 简

Page 13: Redis 常见使用模式分析

比上述几 解决思路对 种

基于 系数据 ,存 量巨大, 很慢关 库 储 访问

redis 基于 user 的 message id 集合,操作 redis 次数少,需要 外 额 维护 message counter ,【推荐使用】

redis 基于 message 的 user id 集合,需要遍 历 messages ,操作 redis 次数 多较

redis 基于 message 的 user bits , 化存极简,操作稍微麻 一点储 烦

Page 14: Redis 常见使用模式分析

常 见 Redis 使用模式

数器 计 String

最新列表 List

系集合 关 Set

排行榜 Sorted Set

属性表 Hash

Page 15: Redis 常见使用模式分析

数器计

数,如网站用 数简单汇总计 户总

incr total_users, get total_users

按 的 数器,如每日注册用时间汇总 计 户

key: users:20140719

expire users:20140719 172800

Page 16: Redis 常见使用模式分析

数器计使用 Hash 大批量 数,如用 记录 计 户 Page View Click

key: users:page_clicks

value:

hash key: user_id

value: clicks

点: 省内存, 少 优 节 减 key ,缺点:没法 置 设expire

Page 17: Redis 常见使用模式分析

数器:速度控制计

以 ip 和秒 合作组 为

key , 置 设 10 秒 期过

时间

每个 求取 数判断是请 计

否超 ,超 抛过阈值 过 异

常,没超 加过则 1

Page 18: Redis 常见使用模式分析

最新列表

最新注册用 列表户

key: rent_users

value: list

最新 表主论坛 发 题

key: rent_topics

value: list

lpush key 202

ltrim key 0 99

lrange key 0 10

Page 19: Redis 常见使用模式分析

系集合关

象 对 标签 Tag

用 注 系户关 关

判断违规词

sadd key “ruby”

scard key

sismember key “ruby”

smembers key

sinter key1 key2

Page 20: Redis 常见使用模式分析

排行榜

用 分榜户积

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

Page 21: Redis 常见使用模式分析

属性表

会 数据话

key: session_id

value: hash

用 特性表户

key: user:<id>:profile

value: hash

hset key name “ruby”

hget key name

hgetall key

Page 22: Redis 常见使用模式分析

更多的使用模式

跨服 器 定务 锁

任 列务队

存缓

Page 23: Redis 常见使用模式分析

总结

Redis 一 提供多 类型(种 种 String List Hash Set Sorted Set )的 Key Value 内存数据库

Redis 擅 解决服 端 域如 数,最新长 务 开发领 计列表,排行榜等各 疑 症, 必种 难杂 开发 备

Page 24: Redis 常见使用模式分析

Thanks. Q&A薄荷 聘,热 [email protected], QQ: 5511595

Web 前端工程师

工程运维 师

Android 工程师