常用缓存处理场景:
解决目标
避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。
解决问题的思路
1.将这个不存在的key预先设定一个值。比如,“NULL" 。
2.在返回这个“NULL"值的时候,客户端应用就可以认为这是不存在的key,客户端应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。
3.如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是“NULL" ,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。
解决问题的思路
1.客户端从缓存中根据KEY读取数据,
2.如果读到了数据则流程结束,如果没有读到数据(可能会有多个并发都没有读到数据),这时候使用缓存系统中的setNX方法设置一个值(这种方法类似加个锁)
3.没有设置成功的请求则sleep一段时间,设置成功的请求读取数据库获取值,如果获取到则更新缓存,流程结束
4.之前sleep的请求这时候唤醒后直接再从缓存中读取数据,此时流程结束。
解决问题的思路
1.如果缓存是因为网络问题没有更新成功数据,进入重试
2.如果依然没有更新成功则认为缓存系统出错不可用,这时候客户端会将数据的KEY插入到消息系统中,消息系统可以过滤相同的KEY,只需保证消息系统不存在相同的KEY
3.当缓存系统恢复可用的时候,依次从MQ中取出KEY值然后从数据库中读取最新的数据更新缓存。
方案分析
1.缓存系统做一个排序队列,比如1000个用户,系统会根据用户的访问时间更新用户信息的时间,越是最近访问的用户排名越排前
2.系统通过定时任务定期过滤掉排名最后的200个用户,然后再从数据库中随机取出200个用户加入队列。
3.请求每次到达的时候,会先从队列中获取用户信息,如果命中则根据userId,再从另一个缓存数据结构中读取用户信息,如果没有命中则说明该用户请求频率不高。