黑马点评笔记

登录功能

基于session的登录功能

图片描述 但是使用session功能要保证使用同一台Tomcat进行处理,当使用Tomcat集群的时候,要保证几台Tomcat之间的session同步,这个情况需要付出比较大的代价,所以我们选择将手机–验证码、token–用户信息存入redis中,其中前者使用string类型,后者使用HashMap模式,将用户信息存成多个k-v方便检索

使用Redis完成登录验证的规则如下: 图片描述

缓存使用

为了提高速度我们可以使用redis缓存来完成部分查询功能 图片描述

具体代码实现如下:

@Override
public Result queryById(Long id) {
String key = CACHE_SHOP_KEY + id;
//从redis中查询店铺缓存
String shopJson = stringRedisTemplate.opsForValue().get(key);
//判断缓存是否存在
if(StrUtil.isBlank(shopJson)){
//如果缓存存在,则直接返回缓存数据
Shop shop = JSONUtil.toBean(shopJson,Shop.class);
return Result.ok(shop);
}
//如果缓存不存在,则查询数据库
Shop shop = this.getById(id);
if(shop == null){
return Result.fail("店铺不存在");
}
//数据库里有,存入redis
stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop));
//返回店铺信息
return Result.ok(shop);
}

缓存更新策略

我们选择使用删除缓存策略——更新数据库是让缓存失效,等查询时再重新更新缓存,并将缓存和数据库操作放在同一个事务

接下来我们来讨论应该先删缓存还是先更新数据库: 图片描述 明显右侧的线程一之间的间隔比较小,所以发生的情况比较少,我们采取先操作数据库,再删除缓存