参考《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 + "");
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。