[Rate Limiter] Cache 存储

这里的key是 CallerId,Value是一个pair(Token Count,Last Update Time),请问这里的value怎么存储呢?因为Redis在存储Value的时候,应该只能存简单的类型,我们需要手动把这个进行序列化和反序列化? 还是有什么别的方法?

Value 可以是 complex type。Redis 已经帮你实现好了。

看来可以用 Redis data types | Redis 来实现 Token Count,Last Update Time 就保存在list 里面?

1 个赞

我的理解是应该用Redis hash data type来存。

为什么是hash而不是list呢?

我的理解list是用来存同一类的东西。这里需要的token_count=x, last_updated_time=y更像是一个object的两个field的信息, 所以Redis hash比较好。

Redis Hashes are maps between string fields and string values, so they are the perfect data type to represent objects (e.g. A User with a number of fields like name, surname, age, and so forth):

2 个赞

谢谢分享,看来这里是用hash更好一些

确实是 redis hash 更好

老师能否说一下data flow, rate limit server 接收到user request, 然后rate limit server 查询cache server, 得到当时的token数量和ts, 但是这里的caller ID 应该是Ip 之类的unique identifier 东西, 需要查询的时候, 直接把这个caller 要求的token 数量和保存的token 数量比较, true 就通过并且process, false 就reject

所以是不是这个当 这个key value pair 很快就会在redis 里过期, 这个过期时间应该是和bucket refill 的速率有关吧

还有就是之前提到的tokenbucket 的算法,返回 boolean, 但是我们cache 里存储的是token数量和TS, 这两者是怎么联系在一起的

取决于算法。
如果用 token bucket,每次查询的时候,看一下上次 TS 是什么时候,根据上次的 token 数量,以过去多久的时间,算出当前的 bucket token 数量。然后在比较这个 caller 需要的数量和当前有的数量哪个多。
token bucket 算法在课件里有贴代码,可以读一下。