bboyjing's blog

Redis学习笔记三【使用Redis构建Web应用】

本章将使用Redis构建一个简单的、完整的Web应用,整个包含如下内容:

  • 登录cookie
  • 购物车cookie
  • 缓存生成的网页
  • 缓存数据库行

登录和cookie缓存

这里我们采用令牌cookie的方式来存储用户登录信息,使用一个散列来存储登陆cookie令牌与已登陆用户之间的映射。要检查一个用户是否已经登陆,需要根据给定的令牌来查找与之对应的用户,并在用户已经登录的情况下,返回该用户的ID。

1
2
3
public String checkToken(String token) {
return (String) redisTemplate.opsForHash().get("login:", token);
}

查看令牌比较容易,更新令牌的操作比较复杂,包含如下一系列动作:

  • 记录登录令牌与登录用户关系
  • 记录最近登录用户
  • 记录用户浏览过的商品,只保留25个商品
1
2
3
4
5
6
7
8
9
10
11
12
public void updateToken(String token, String user, String item) {
long timestamp = System.currentTimeMillis() / 1000;
//记录登录用户令牌
redisTemplate.opsForHash().put("login:", token, user);
//记录最近登陆用户
redisTemplate.opsForZSet().add("recent:", token, timestamp);
if(!StringUtils.isEmpty(item)){
//记录用户浏览过的商品
redisTemplate.opsForZSet().add("viewed:" + token, item, timestamp);
redisTemplate.opsForZSet().removeRange("viewed:" + token, 0, -26);
}
}

示例仅用于演示大概功能,用户过期等功能就不赘述了。

使用Redis实现购物车

采用一个散列存储商品ID和数量之间的映射

1
2
3
4
5
6
7
public void addToCart(String token, String item, int count) {
if (count <= 0) {
redisTemplate.opsForHash().delete("cart:" + token, item);
} else {
redisTemplate.opsForHash().put("cart:" + token, item, String.valueOf(count));
}
}

网页缓存

直接采用String存储网页内容

1
2
3
4
5
6
7
8
9
10
11
12
public String cacheRequest(String request, Callback<String, String> callback) {
String pageKey = "cache:" + request.hashCode();
//获取网页缓存内容
String content = (String) redisTemplate.opsForValue().get(pageKey);
if (content == null && callback != null) {
content = callback.call(request);
//缓存网页内容并且设置过期时间
redisTemplate.opsForValue().set(pageKey, content);
redisTemplate.expire(pageKey, 300, TimeUnit.SECONDS);
}
return content;
}

数据行缓存

用缓存商品数量的例子来简单演示下

1
2
3
4
5
6
7
8
9
10
11
public void cacheData(){
redisTemplate.opsForValue().set("product:001",5);
while (true){
long stock = redisTemplate.opsForValue().increment("product:001", -1);
if(stock >= 0){
System.out.println("sold one product, remain " + stock);
}else{
break;
}
}
}

这一章拖了好久,心累,就写到这儿吧,算是了解了下Redis的基本用法。