参考《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 withscores1) "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 withscores1) "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:A1) "itemA"2) "1"3) "itemB"4) "2"local:1>hdel cart:A itemA"1"local:1>hgetall cart:A1) "itemB"2) "2"local:1>hmset cart:A itemB 3"OK"local:1>hgetall cart:A1) "itemB"2) "3"
实际
拜访页面及商品页
@Testpublic 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); }}
退出购物车
@Testpublic 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 + ""); }}