关于redis的一些思考和总结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ningmengbaby/article/details/92795945

 

目录

为什么单线程的redis快?

为什么选择redis?

持久化方式

集群 redis cluster

pipeline 管道

缓存一致性

缓存并发问题

缓存穿透问题

缓存雪崩问题


为什么单线程的redis快?

  • 纯内存操作
  • 单线程操作,避免了频繁的上下文操作
  • 采用了非阻塞I/O多路复用机制。

为什么选择redis?

速度快,可以持久化,支持数据类型更多。

单线程,一个瞬间只会执行一条命令,命令在排队执行。

持久化方式

rdb方式,把数据存储到磁盘中。每次备份会记录整个数据集。如果持久化的时候宕机会丢失数据。恢复数据快。耗时,会丢数据。

aof方式,把执行的命令写到文件中,增量式,文件大。将命令刷新到缓冲区,然后根据不同的策略把缓冲区的写到硬盘中。

always(IO开销大),everysecond(每秒执行一次,推荐),no。

集群 redis cluster

投票容错机制,分布式数据库,虚拟槽分区。一万六千多个槽,每一个节点负责一些槽,根据key使用crc16算法算出一个结果,然结果对16384取余。只有主节点有投票权和槽的管理权,读写请求。

pipeline 管道

可以同时发送多条命令。减少网络时间

缓存一致性

更新数据库成功 -更新缓存失败 - 数据不一致

更新缓存成功-更新数据库失败-数据不一致

更新数据库成功-淘汰缓存失败-数据不一致

淘汰缓存成功-更新数据库失败-查询缓存miss

缓存并发问题

当缓存中没有数据时,就需要-查询数据库-重建缓存-输出 ,

可能出现n个线程同时向数据库查询数据,造成数据库压力

解决方案:锁,一个线程从数据库查询然后放到redis中,其他线程直接从redis取即可

缓存穿透问题

高并发场景下某个key没有命中,从数据库获取,当数据为空的情况下查询了很多无用的数据,巨大的冲击和压力。

缓存空对象(空集合)

缓存的时效性,对空对象设置失效时间

命中不高但操作频繁的数据 避免频繁查询数据库

缓存雪崩问题

缓存的原因,大量请求到数据库,导致数据库崩溃整个系统崩溃。缓存并发,缓存穿透

设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩,大量请求访问数据库。

多级缓存:不同key设置不同的失效时间。

弄高可用集群。

展开阅读全文

没有更多推荐了,返回首页