5-2 对象缓存

对象级缓存

一、token缓存

下面是通过token开获取缓存的,被UserArgumentResolver所调用。getByToken只对应一个用户,在用户的登陆成功的同时就存入了redis数据库当中了。

MiaoshaUser user = redisService.get(MiaoshaUserKey.token, token, MiaoshaUser.class);

getByToken方法只是在UserArgumentResolver类的resolveArgumen方法中被调用了,获取token不易,该方法中经过代码对token进行了获取。主要是在自动注入user的时候用到。

二、id缓存。(getById()通过id来获取对象,获取的同时将数据放入缓存(redis))。

getById在两个方法中被调用。login()和updatePassword()。login方法中从mysql数据库的miaosha_user表中查找指定手机号的用户。updatePassword是取出指定id的用户并进行密码的更改。

对应MiaoshaUserService中的如下代码:

//改造一下这个方法(根据id获取miaoshaUser)
public MiaoshaUser getById(Long id){ //函数名和MiaoshaUserDao中的方法名一样即可,即getById()
//取缓存
MiaoshaUser miaoshaUser = redisService.get(MiaoshaUserKey.getById, "" + id, MiaoshaUser.class);//通过id来获取对象
if(miaoshaUser != null ){
return miaoshaUser;
}
//取数据库(则这时缓存当中没有数据
miaoshaUser = miaoshaUserDao.getById(id);
if(miaoshaUser != null){//从数据库中取出来之后,需要放到redis中,即缓存中。
redisService.set(MiaoshaUserKey.getById, "" + id, miaoshaUser);//将数据写入缓存当中
}
return miaoshaUser;
}

public boolean updatePassword(long id, String passwordNew){
//获取user
MiaoshaUser miaoshaUser = getById(id);
if(miaoshaUser == null){
throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);

}

                //先更新数据库

MiaoshaUser toBeUpdate = new MiaoshaUser();
toBeUpdate.setId(id);
toBeUpdate.setPassword(MD5Util.formPassToDBPass(passwordNew, miaoshaUser.getSalt()));
miaoshaUserDao. updatePassword( toBeUpdate);
//后处理缓存
miaoshaUser.setPassword(toBeUpdate.getPassword());
redisService. delete(MiaoshaUserKey.token, "" + id);//token对一个登陆和本次登陆成功之后后续的访问进行标记,更改密码之后重新登陆,所以要删除更改密码之前的token
redisService. set(MiaoshaUserKey.getById, "" + id, miaoshaUser);//一个id可以标记一个用户,这毋庸置疑,所以不需要删除
return true;

}


MiaoshaUserDao:

@Update("update miaosha_user set password = #{password} where id= #{id}")//只更新了这些,不更新的不需要往里面传

public void updatePassword(MiaoshaUser toBeUpdate);

RedisService:

/*
* 删除key对应的条目
* */
public <T> boolean delete(KeyPrefix prefix, String key){
Jedis jedis = null;
try{
jedis = jedisPool.getResource();
//生成真正的key
String realKey = prefix.getPrefix() + key;
long ret = jedis.del(realKey);
return ret > 0;
}finally{
returnToPool(jedis);
}
}

猜你喜欢

转载自blog.csdn.net/jiuweideqixu/article/details/80460312
5-2