会话维持
-
使用Token维护用户登陆状态,作为用户操作凭证。
-
更新Token
hset login: token userId
将登陆的用户Id和token用hash做映射
zadd recent: timestamp token
将token放入到最近操作的有序集合中,以当前时间戳作为分数
zadd viewed:Token timestamp ItemId
将最新访问的商品Id加入到该用户的最近访问商品有序集合中
zremrangebyrank viewed:Token 0 -26
删除该用户最近访问的商品的比较老的记录,保持只记录25个历史足迹
zincrby viewd: item -1
将当前浏览的商品的分值减一,这样访问次数越多的商品的分值就会越小
zremrangebyrank viewed: 0 -20001
定期将20000名以后(分值从大到小的后20000名)的商品删除
zinterstore viewed: 1 viewed: weights 0.5
将剩余商品的浏览次数减半 -
检查Token
hget login:token
根据token获取登陆用户,如果为空,说明未登陆或者登陆已过期 -
清理过期会话,保持同时在线人数,最多500w,下列操作可以创建为定时任务,定时执行
zcard recent:
获取当前在线人数,判断如果人数大于500w,则清理长时间没有更新token的用户
zrange recent: 0 100
获取最久没更新的token,100为 min(在线人数-500w, 100)
del viewed:Token
循环删除过期用户的浏览历史
hdel login: Token
循环删除过期用户的token-user绑定
zrem recent: token
循环删除token
购物车
使用cookie做保存购物车的问题,每次http请求都会带着cookie,一旦购物车数量比较大,那么请求和处理速度都会有影响。另外还需要解析cookie中的商品,判定其是否仍然有效。
hset cart:token item counts
将item加入购物车,数量为counts
hdel cart:token item
如果counts为0,则删除购物车中的这个商品
del cart:token
在上边清理会话中,同时清理掉这个会话的购物车
通过将会话cookie和购物车cookie 放入到redis中,可以利用这些数据,进行商品的统计分析
页面缓存
一般上,很多商品页面,一旦该商品创建后,就几乎不会再修改了。通过【数据+模版】生成静态页面并缓存的方式,可以有效减少动态生成页面的时间,大大提高访问速度。
Laravel中,可以创建一个中间件,给可以缓存的路由加上这个中间件。在中间件中,将第一次动态生成的页面存到redis中,并给这个缓存加上过期时间。下次请求先访问缓存,缓存失效或不存在的情况下,才再次动态生成。
get cacheName
根据一定规则(可以是Url),获取redis中缓存的结果,如果不存在,再去访问数据库,并将结果存入redis
set cacheName cacheResult
将结果存入redis
expire cacheName 60
缓存1分钟
秒杀
秒杀商品页面和普通商品页面最大的不同,就是秒杀商品有购买的时间和库存的限制。这两个数据不能通过上一步中【页面缓存】的方式显示。
我们可以通过ajax请求的方式,动态获取库存和秒杀时间,这两个数据可以放入到redis,避免短时间大量请求堵塞数据库。
我们维护两个有序集合来实现这个功能。
- 一个有序集合key为要缓存的数据的id,如商品id,分值为时间戳,代表什么时候应当重新从数据库将最新的数据加载数据到redis
- 一个有序集合key也是要缓存的数据的id,分值为延时时间,代表每隔多久缓存一次。如果这个值小于0,则不应该继续缓存这个数据,应当将其从redis删除。
-
创建任务 id, delay
zadd delay: delay id
延时列表,分值为缓存更新的间隔时间
zadd schedule: timestamp id
任务列表,分值为下一次缓存更新的时间 -
定时任务,更新缓存
zrange schedule: 0 0 withscores
从任务列表中获取最新要更新的任务,如果这个任务的更新时间还没有到,就sleep一段时间,从新检查
zscore delay: id
获取这个任务的缓存更新间隔时间,如果这个间隔时间小于0,说明不需要再缓存这个数据,将这个数据从redis删除
zrem delay: id
删除时间间隔
zrem schedule: id
删除任务调度
del inv:id
删除缓存的数据set inv:id
如果间隔时间大于0,就从数据库查出最新的数据,放入redis中
zadd schedule: timestamp+delay id
将这条数据的下次更新放入任务队列,分值为当前时间+延时的时间
网友评论