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