参考《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 + "");
    }
}

大军
847 声望183 粉丝

学而不思则罔,思而不学则殆