redis:
缓存击穿:对于访问过期的key查询数据时,加锁,保证只有一个线程去底层获取数据,并返回结果缓存
缓存穿透:对于访问不存在的key时给出空结果并缓存,或引入布隆过滤器将数据提前缓存在布隆过滤器中
缓存雪崩:对于key采用随机过期时间,避免大量的key在同一时间失效导致数据库承载过高
持久化机制:
AOF:以追加 命令行记录的方式记录完整的日志 优点:能够完整恢复数据 缺点:恢复备份效率低
RDB:以二进制的方式定时本分数据 优点:恢复备份效率高 缺点:存在备份时间临界区有丢失数据的可能
AOF + RDB:定时备份数据以二进制的方式写入文件,增量以命令行的记录方式追加到文件当中
数据类型:
string : 字符串(操作命令:set get append setrange getrange strlen)
数值(操作命令:incr) 理解待加深
bitmap
list: 理解待加深
hash: 理解待加深
set: 理解待加深
sorted_set 理解待加深
缓存的更新机制:
被动更新:有效期到后,再次写入; 客户端查询数据时,从数据库中获取,写入缓存。 在缓存有效期(t)内,所有查询走缓存,所有写入走数据库。
使用场景:对数据的准确性,实时性要求不高的场景,如博客的浏览访问量
主动更新:
1:更新缓存,更新数据库 数据不一致的风险比较高,一般不采用
2:更新数据库,更新缓存 并发请求会出现数据不一致;修改数据库再经过大量计算得出缓存值,浪费性能,如缓存还没使用,更加浪费
3:删除缓存,更新数据库 一般不采用;
(1):读的效率一般比写的效率要高,当还未执行更新数据库,缓存有可能会被再次写入,最终导致数据不一致。
(2):延迟双删,更新数据库后再休眠一段时间后再次删除缓存,导致系统吞吐量下降
(3):借用中间件,消息队列,重发消息 ,系统外订阅:canal,binlog 二次删除key,与业务代码解耦
4:更新数据库,删除缓存 经常采用的方式; 如果写的效率高于读的效率则可能出现数据不一致的问题,但读的效率一般要高于写的效率,极端情况可再增加延迟双删处理