目录
memcache 和 redis 优劣 简称 M和R
这个有人背吗?自己查着背吧
M支持单一string类型,R支持string、list、hash、set、zset……
为什么需要缓存
提高mysq或是其他数据库的瓶颈。就单体来说,R可以10w的qps,但是mysql可能只有1w。把数据缓存到R则可以有更高的qps。qps:每秒查询数
R集群的两种模式
主从副本模式
读数据在slave读,写数据在master然后同步到slave
缺点:很清楚的看的出来单个机器的内存仍是限制。因为我们只是把访问压力分开了,没有扩展R的内存。这时候就像一个数据库放在一块内存里
切片模式
把一个数据放在多个内存里。
常用的切片规则是使用一致性哈希算法。
使用R的ip和编号算出hash值,然后余一个数比如‘%2^32’,比如落在以下几个点。
我们把数据存入R时,算出hash(key)%2^32看落在哪个区间。比如落在这里。
那么这个数据就会被缓存到slave2。
如果此时又有一个slave3落在了这里.那么之前再slave2的那条数据,就会迁移到slave3中。
缺点
可能出现数据倾斜的问题。如果是以下情况。大部分数据都落到slave1上。
解决:虚拟出slave1和slave2节点。使分配尽量均匀。
缓存穿透
概念:访问缓存不存在的数据,直接落在数据库上。
常用解决办法:字段检验。布隆过滤器。主要原理是利用hash算法缓存数据。但是存在误差。因为存在hash碰撞的问题。核心:存在的数据不一定存在。不存在的数据一定不存在。
降低错误率:可以扩大布隆过滤器的长度。或者增加hsah算法。如果布隆过滤器长度为10。我们用两个hash算法,则命中一个概率为十分之一,两个都命中相同的概率使十分之一乘十分之一就是一百分之一,碰撞概率极大降低。
缓存雪崩
概念:缓存大面积失效或者过期
解决方法:从R来说,设置永不过期;设置随机失效时间;热点数据在副本里设置不同的过期时间。
缓存击穿
概念:缓存过期的一瞬间,同时有大量的请求打进来
解决方案:
1、加互斥锁。在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存。
2、热点数据不过期