关于redis:redis-购物车

45次阅读

共计 3406 个字符,预计需要花费 9 分钟才能阅读完成。

参考《redis 实战》

需要

1、记录用户最初一次拜访的工夫,并统计用户的最新拜访记录
2、记录用户最近浏览过的商品,商品数量为 5
3、记录商品被拜访的次数,仅显 5 个热门数据
4、购物车增加移除商品

剖析

第一个需要

统计用户的最新拜访记录这种类型的,都能够用有序汇合来依据工夫进行排序。并且如果新增的 member 一样,则会更新 score,刚好能够更新最初一次的拜访工夫。比方上面的例子,通过 zadd 减少成员,通过 zrange 失去范畴内的值。

local:1>zadd score 1 zhangsan
"1"
local:1>zadd score 2 zhangsan
"0"
local:1>zadd score 2 lisi
"1"
local:1>zrange score 0 -1 withscores
1) "lisi"
2) "2"
3) "zhangsan"
4) "2"

第二个需要

因为仅保留最近浏览过的 5 个商品,所以能够用有序汇合来进行过滤。
比方上面的例子,通过 zremrangebyrank 移除,仅保留一个分值高的。

local:1>zadd score 1 zhangsan
"1"
local:1>zadd score 2 lisi
"1"
local:1>zremrangebyrank score 0 -2
"1"
local:1>zrange score 0 -1 withscores
1) "lisi"
2) "2"
local:1>

第三个需要

跟第三个需要雷同

第四个需要

购物车的商品及数量,能够当做键值对,拜访的人能够当做 key 来解决。用 hmset 进行保留或更新成员,通过 hdel 来移除成员。

local:1>hmset cart:A itemA 1
"OK"
local:1>hmset cart:A itemB 2
"OK"
local:1>hgetall cart:A
1) "itemA"
2) "1"
3) "itemB"
4) "2"
local:1>hdel cart:A itemA
"1"
local:1>hgetall cart:A
1) "itemB"
2) "2"
local:1>hmset cart:A itemB 3
"OK"
local:1>hgetall cart:A
1) "itemB"
2) "3"

实际

拜访页面及商品页

@Test
public void testLoginAndView() {
    String zhangsan = "zhangsan";
    System.out.println("张三登录网站");
    view(zhangsan, null);
    System.out.println("张三拜访商品");
    view(zhangsan, "itemA");
    view(zhangsan, "itemB");
    view(zhangsan, "itemC");
    view(zhangsan, "itemA");
    view(zhangsan, "itemB");
    view(zhangsan, "itemA");
    view(zhangsan, "itemD");
    view(zhangsan, "itemE");
    view(zhangsan, "itemF");
    view(zhangsan, "itemG");
    System.out.println("张三最初登录工夫:" + JedisUtils.zscore("lastTime:", zhangsan));
    System.out.println("张三最近浏览商品:" + JedisUtils.zrevrange("view:" + zhangsan, 0, -1));
    System.out.println("商品被浏览信息:" + JedisUtils.zrangeWithScores("item:", 0, -1));

    String lisi = "lisi";
    System.out.println("李四登录网站");
    view(lisi, null);
    System.out.println("李四拜访商品");
    view(lisi, "itemA");
    view(lisi, "itemB");
    view(lisi, "itemC");
    System.out.println("李四最初登录工夫:" + JedisUtils.zscore("lastTime:", lisi));
    System.out.println("李四最近浏览商品:" + JedisUtils.zrange("view:" + lisi, 0, -1));
    System.out.println("商品被浏览信息:" + JedisUtils.zrangeWithScores("item:", 0, -1));

    String wangwu = "wangwu";
    System.out.println("王五登录网站");
    view(wangwu, null);
    System.out.println("王五拜访商品");
    view(wangwu, "itemA");
    view(wangwu, "itemB");
    view(wangwu, "itemC");
    System.out.println("李四最初登录工夫:" + JedisUtils.zscore("lastTime:", wangwu));
    System.out.println("李四最近浏览商品:" + JedisUtils.zrange("view:" + wangwu, 0, -1));
    System.out.println("商品被浏览信息:" + JedisUtils.zrangeWithScores("item:", 0, -1));

    System.out.println("用户登录信息:" + JedisUtils.zrange("lastTime:", 0, -1));
}
private void view(String token, String item) {long timestamp = System.currentTimeMillis();
    // 更新最初拜访的工夫
    JedisUtils.zadd("lastTime:", timestamp, token);
    if (StringUtils.isNotEmpty(item)) {JedisUtils.zadd("view:" + token, timestamp, item);
        JedisUtils.zremrangeByRank("view:" + token, 0, -6);
        JedisUtils.zincrby("item:", 1, item);
        JedisUtils.zremrangeByRank("item:", 0, -6);
    }
}

退出购物车

@Test
public void testCart() {
    String zhangsan = "zhangsan";
    System.out.println("itemA 退出购物车 2 件");
    addCart(zhangsan, "itemA", 2);
    System.out.println("itemB 退出购物车 1 件");
    addCart(zhangsan, "itemB", 1);
    System.out.println("itemC 退出购物车 1 件");
    addCart(zhangsan, "itemC", 1);
    System.out.println("购物车信息:" + JedisUtils.hgetAll("cart:" + zhangsan));
    System.out.println("itemB 缩小 1 件");
    addCart(zhangsan, "itemB", -1);
    System.out.println("itemA 缩小 1 件");
    addCart(zhangsan, "itemA", -1);
    System.out.println("购物车信息:" + JedisUtils.hgetAll("cart:" + zhangsan));
}
private void addCart(String token, String item, int num) {List<String> list = JedisUtils.hmget("cart:" + token, item);
    if (JedisUtils.hexists("cart:" + token, item)) {num += Integer.valueOf(list.get(0));
    }
    if (num <= 0) {JedisUtils.hdel("cart:" + token, item);
    } else {JedisUtils.hset("cart:" + token, item, num + "");
    }
}

正文完
 0