Redis实战笔记-购物网站

会话维持

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358