Redis实战笔记-购物网站

2019-03-27  本文已影响0人  Captain_tu

会话维持

  1. 使用Token维护用户登陆状态,作为用户操作凭证。

  2. 更新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 将剩余商品的浏览次数减半

  3. 检查Token
    hget login:token 根据token获取登陆用户,如果为空,说明未登陆或者登陆已过期

  4. 清理过期会话,保持同时在线人数,最多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,避免短时间大量请求堵塞数据库。

我们维护两个有序集合来实现这个功能。

  1. 创建任务 id, delay
    zadd delay: delay id 延时列表,分值为缓存更新的间隔时间
    zadd schedule: timestamp id 任务列表,分值为下一次缓存更新的时间

  2. 定时任务,更新缓存
    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 将这条数据的下次更新放入任务队列,分值为当前时间+延时的时间

上一篇下一篇

猜你喜欢

热点阅读