美文网首页
Redis实战笔记-购物网站

Redis实战笔记-购物网站

作者: Captain_tu | 来源:发表于2019-03-27 16:57 被阅读0次

    会话维持

    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,避免短时间大量请求堵塞数据库。

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

    • 一个有序集合key为要缓存的数据的id,如商品id,分值为时间戳,代表什么时候应当重新从数据库将最新的数据加载数据到redis
    • 一个有序集合key也是要缓存的数据的id,分值为延时时间,代表每隔多久缓存一次。如果这个值小于0,则不应该继续缓存这个数据,应当将其从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 将这条数据的下次更新放入任务队列,分值为当前时间+延时的时间

    相关文章

      网友评论

          本文标题:Redis实战笔记-购物网站

          本文链接:https://www.haomeiwen.com/subject/jbszvqtx.html