手机验证码场景
redis里面存储过期时间。通过校验redis里面存储的值来校验验证码是否过期或者是否正确。
image.png
校验逻辑
image.png
延伸
邮件的激活也是类似,通过下发一个随机的激活码,但是这个激活码具有时效性。是天然的redis的使用场景
Redis作为缓存数据库
这里涉及到一个问题缓存中的数据如何和DB的数据进行同步呢(MySQL和Redis的双写一致性)
- 先更新缓存再更新数据库
如果更新缓存成功但是数据库失败,会造成脏数据,绝对不可取 - 先更新数据库在更新缓存
在高并发情况下,线程A更新数据库成功,但是还没有更新缓存。线程B这时候更新数据库,并且更新了缓存。这时候线程A再更新缓存。造成线程B对缓存的更新丢失了 -
先删除缓存,再更新数据库
这种避免了缓存更新丢失的情况,但在高并发情况下依然会有不一致情况。
image.png
可以是使用延迟双删的方式来解决。
public void write(String key,Object data){
redis.delKey(key);
db.updateData(data);
Thread.sleep(1000);
redis.delKey(key);
}
-
先更新数据库,再删除缓存
image.png
public void write(String key,Object data){
db.updateData(data);
redis.delKey(key);
Thread.sleep(1000);
redis.delKey(key);
}
网友评论