Redis 实战
1、Navigation Session
需求:用户60秒内访问的N个网站页面,或许包含当前 TA 正在看或者感兴趣的东西。由此可以推荐对应的广告,使得用户更容易对投放的广告感兴趣。
利用Redis可以简单实现:
MULTI
RPUSH pagewviews.user:<userid> http://.....
EXPIRE pagewviews.user:<userid> 60
EXEC
2、Redis 缓存常用数据
图片:String,hash 数据类型
3、拼团活动缓存
需求:热门商品会有拼团,进行促销或者引流。特点是:推广阶段会有大量的人去创建拼团,等团的人数满了,才算商品购买成功,这一期间会频繁查询数据库,看团是否满。
为了减轻数据库的压力,可以将拼团信息存放在Redis 缓存中。
- activityId 拼团活动id
- activityCount 设置的成团人数
- memberId 用户id
开团会创建一个拼团活动,这时会去数据库把拼团商品的成团人数activityCount设定查出来,同时生成一个activityId,使用哈希表的数据结构将拼团活动id和人数存放在groupPurchasing哈希表中。
如何确定某个用户是否参加了某个拼团活动呢?以 activityId 作为Set集合的key,用户的memberId 作为value。当用户创建了一个拼团的活动时,利用集合的数据结构:以活动id为key,memberId为value,利用集合的特性防止用户重复参团。这样有新的用户参团的时候,检查拼团活动的状态就直接去缓存中查找就行。
- groupPurchasing 哈希表:
hset groupPurchasing activityId activityCount
- Set 集合:
SADD activityId memberId
判断该用户是否重复参团:
SISMEMBER activityId memberId
成功参团后,将剩余所需参团人数减1:
HINCBY groupPurchasing activityId -1
当团满人,所有人都成功付款的时候,将拼团信息从groupPurchasing哈希表中删除
HDEL groupPurchasing activityId
上述只是讲了核心实现方法,还有其他的细枝末节没有讲到。
//TODO 拼团的核心逻辑
4、次数限制器 Rate Limiter
需求:限制单个IP地址一秒内访问服务器API资源的次数为10次
应用场景:当系统的能力有限,无法对外界提供更多服务的时候,限流就是一个很好的解决方法。
比如活动抢票的时候,有时候返回的界面是:“活动太火爆,请稍后再试”,这种可以通过在前端简单设置随机算法就可以实现。
在一些UCG社区,一些风控策略,比如用户单位时间的点赞次数,转发次数等会受到限制。
在一些裂变活动中,为了防止羊毛党,也会设置参与活动次数相关的限制等。
总结就是:控制用户行为。
4.1、实现方法一:利用计数器,
利用计数器对每个IP在访问的那一秒内的访问次数进行计数。
使用MULTI 和EXEC 组合(原子操作),保证在每一次API访问的时候设置自增和过期时间。
缺点:依赖Redis实例的时间戳。
/**
* @方法: LIMIT_API_CALL
* @param ip 访问者的ip地址
*/
FUNCTION LIMIT_API_CALL(ip)
// 当前时间
ts = CURRENT_UNIX_TIME()
// 生成 key
keyname = ip+":"+ts
current = GET(keyname)
//判断当前ip在ts时的访问次数
IF current != NULL AND current > 10 THEN
ERROR "too many requests per second"
ELSE
MULTI
// 访问次数自增
INCR(keyname,1)
// 设置过期时间 10s
EXPIRE(keyname,10)
EXEC
PERFORM_API_CALL(