缓存策略:主动更新 + 超时剔除
设计思想:
代码实现:
/**
* 查询所有用户
*
* @return ResponseEntity<Object>
*/
@Override
public ResponseEntity<Object> listUser() {
// 从redis中根据key查询用户列表信息
String userListString = (String) redisTemplate.opsForValue().get(USER_LIST);
// 如果用户信息不为空 转化为List
if (userListString != null) {
List<Issa> issaList = JSONUtil.toList(userListString, Issa.class);
return ResponseEntity.ok(issaList);
}
// 查询所有用户信息
List<Issa> issas = userMapper.selectAll();
// 判断是否为空
if (StrUtil.isEmptyIfStr(issas)) {
return ResponseEntity.status(405).body("没有任何一个用户的信息");
}
// 转化为字符串
String issasStr = JSONUtil.toJsonStr(issas);
// 保存到redis中,并设置超时时间作为兜底方案
redisTemplate.opsForValue().set(USER_LIST, issasStr, 60, TimeUnit.SECONDS);
// ok
return ResponseEntity.ok(issas);
}
/**
* 注册
*
* @param issa 注册的参数
* @return ResponseEntity<Object>
*/
@Override
public ResponseEntity<Object> register(Issa issa) {
int user = userMapper.insertUser(issa);
// 判断注册成功与否
if (user != 1) {
return ResponseEntity.status(400).body("注册失败");
}
// 删除缓存
redisTemplate.delete(USER_LIST);
return ResponseEntity.ok("注册成功");
}
超时剔除:
向redis中添加缓存数据的时候设置TTL时间,到期后自动删除缓存,下次查询时更新缓存。这种机制维护成本不是很高,数据一致性同样无法做到很高的保证,因为设置之后数据的有效期就固定了,但是更新时间不固定,若数据在超时剔除之前发生更新然后查询,得到的则仍是更新之前的数据。
主动更新:
使用代码在修改数据库的同时更新缓存。这种策略能够保证很高的数据一致性,但是伴随而来的就是更高的维护成本,要在每一个更改语句后面加上redis缓存更新。
原文始发于微信公众号(步尔斯特):Redis使用 “主动更新” + “超时剔除” 缓存策略案例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/47890.html