36
Redis 使用案例探索 Remote Dictionary Server Bruce Wang

Redis use cases

Embed Size (px)

Citation preview

Redis 使用案例探索Remote Dictionary Server

Bruce Wang

Agenda

• 基本数据结构和功能• Use Case • Redis 使用注意事项

基本数据结构和功能

• String• Keys• List• Set• Sorted Set• Hash

String

1. Blob 可以放在 String 类型的 Cache 中2. String 可以做 Append 操作3. String Key 中可以存 Integer 类型的值

Keys

1. Key 可以设置超时时间2. Key 可以做正则匹配

List

List

1. 左右插入链表2. 截取链表3. 读取链表

Set

Set1. Set 元素惟一性2. Set 集合运算

Sorted Set

Sorted Set

1. 按排名按 Score 增序倒序获取元素

2. 更改元素 Score

Hash

Hash

1. 设置 Hash K-V2. 获取 Hash K-V

USE CASE

• 排重• 计数器• List 应用• Set 应用• Sorted Set 应用• Hash 应用• Other

Use Case 排重

1. SETNX 命令

排重 - 秒杀系统

每个 Item 的值只会有一次写入的机会

Setnx $itemId $winnerId

Use Case 计数器

1. INCR, INCRBY, DECR, DECRBY, HINCRBY 命令

计数器应用

1. ID 生成器2. Web 分析3. 防 DDOS 攻击4. API 访问率控制

计数器 - ID 生成器

1. 逻辑中心化 & 部署上分布式2. 可根据不同的 DC 做不同的步长3. 处理某个类型的 Seq 必定落在固定的 Instance 上, 由 Redis

Server 的单进程机制保证惟一性

Incrby Seq:$ObjectType $step

计数器 -Web 分析

1. 可多样化统计用户行为

Incr view:$pageId

Incr view:$pageId: $timeFrame

Incr logon:$userId

Incr logon:$userId:$timeFrame

计数器 -Anti-DDOS , API 访问率控制

1. 可根据不同需求设置统计时间片和最大 hit 的阀值

$Count = Incr hitCount:$user:$API_idif(count==0) expire hitCount:$user:$API_id $timeFrameElse If (hitCount$user > 阀值 ) 拒绝服务Else 响应服务

List-LOGGER 收集

使用 List• App 客户端: Lpush logger:$appid:serverId $log• Logger Server: Worker 轮询 Ltrim logger:$appid 0

99 write to NFS, HDFS….

Logger 其他方案—使用 Blob• App 客户端 : append logger:$appId:$serverId $log• Logger Server: Worker 轮询 ogger:$appId:$serverId

$log

Set 应用

1. 社区好友2. 随机推荐

Set- 社区好友

Sadd friend:$userId1 $userASadd friend:$userId1 $userBSadd friend:$userId2 $userCSadd friend:$userId2 $userA

Sadd onlineUser $userA

共同好友 SInter friend:$userId1 $friend:$userId1在线好友 Sinter friend:$userId1 onlineUser

Set- 随机推荐

• 随机推荐好友Srandmember recommandFriendsSet:$userId

• 随机推荐热图Srandmember recommandPhotosSet:$hotPhotos

Use Case - Sorted Set 使用

1. 排行榜2. GEO 相关搜索3. 最近浏览页面

Sorted Set – 排行榜

Sorted Set - GEO 搜索

附近搜索1. 经纬度 64 位 Hash

Hash 值的特点: 越近的地点 Hash 值前面相同的位越大海底捞 (120.2E ,30.3N) 14326455945304181035外婆家 (121.3E, 31.1N) 14326502174498709381

2. Zadd resturant:set $hash $resturant3. 获取推荐餐馆 zrangebyScore resturant:set ($userLocationHash - $offset)

($userLocationHash + $offset)

Sorted Set – 最近浏览页面

• 页面浏览:Zadd recentPageView:$User $timestamp page1Zadd recentPageView:$User $timestamp page2

• 获取最近浏览 10 个页面 : zrevrange recentPageView:$User 0 10 withscores

Hash– 购物车购物车添加商品:

Hincrby $cartId $productId $number获取商品 : Hgetall $cartId

Use Case - Other

1. Session Storage2. 公平调度器

其他– Session 存储

•登录: Set $SessionKey $anyValue•每次访问: Expire $sessionKey $timeFrame

•登录: Set $SessionKey $anyValue•每次访问: Expire $sessionKey $timeFrame

其他– 公平调度器

1. Worker•Worker: ZADD worker:nodes $load $hostname•Worker: BLPOP $hostname

2. Client•Work client: Zrange worker:nodes 0 2•Work Client: LPUSH $hostname $task

其他– 优先级 Queue

1. Producer: Lpush $queueName anyValueZadd task:$queueName $priority $task

Zincrby task:$queueName $task $incrNum

2. Subscriber:Blpop $queueNameTask = Zrevrange task:$queueName 0 1Sadd $subscriberName $Task

Execute taskSrem t $subscriberName $Task

Redis 使用注意事项

•Use Hash VS encoded object

•Key 可能分布在不同的 Redis Instance 中

•不要使用 Redis 做它不擅长的事情

•Expire 与内存最大值

•Expire when rename key

We Provide

The Best !