学习笔记redis分布式缓存
Posted 棉花糖灬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记redis分布式缓存相关的知识,希望对你有一定的参考价值。
在高并发情况下,服务器的访问压力主要有两部分,一是服务器的处理压力,二是数据库的读写压力。数据库的读写压力可以使用redis来缓解,对于热点数据可以拷贝一份到redis中,当查询数据库时,先去redis中读取,如果没有再去数据库中查询。
1. redis集群的两种模式
- 主从备份模式:当写入数据时,只往主redis中写,然后再从主redis同步到从属redis,而在读取时从从属redis中读取。但由于该模式只有一个主redis,应对不了海量数据的存储和读写。
- 切片模式:将数据存储到不同切片的redis中,可以使用哈希算法来判断数据该往哪个切片写入,但当redis切片数发生变化时,则必须要调整数据存储的位置,从而会增加网络IO。可以使用哈希一致性算法来解决该问题。
2. 哈希一致性算法
比如设置一个大小为 2 32 2^32 232 的哈希环,对每台redis服务器,根据其IP和编号计算哈希值并对 2 32 2^32 232取余,即 h a s h ( I P + I D ) hash(IP + ID) % 2^32 hash(IP+ID),对得到哈希环上的一个映射位置(如图中红色圈)。同样的,对数据的key计算哈希值并对 2 32 2^32 232取余,即 h a s h ( k e y ) hash(key) % 2^32 hash(key),对得到哈希环上的一个映射位置(如图中绿色圈)。每一个数据在哈希环上顺时针找到离它最近的redis服务器并进行存储。当增加一台redis服务器时,只需要将处于该服务器和逆时针的前一台服务器的数据迁移到该服务器即可。当删除一台redis服务器时,只需要将该服务器上的数据迁移到顺时针的下一台服务器即可。
但该算法存在数据倾斜问题,数据倾斜即大量的数据在少量的服务器上存储,而其余服务器存储/计算的数据较少。可以让一台redis服务器虚拟成多个点,分布在哈希环中。
3. 缓存穿透
当客户端请求在一个不存在的数据库查询时,由于该数据库不存在,所以redis不会命中,一定会查询数据库,当该种查询数量较大时,则会影响数据库性能。
解决:当所请求的数据库是同一个时,可以将查询结果null写入到redis中,那么下次查询就会直接命中redis了。当所请求的数据库变化时,可以设置一个过滤器,判断该数据库ip是否合法。但当我们的数据库IP数量很多时又会消耗大量的内存和时间。解决该问题可以采用布隆算法。
4. 布隆算法
布隆算是用错误率来换取空间占用率。假设一个长度是n的二进制数组,对数据库IP取哈希值并对n取模,将数组的对应位置设为1,表示该IP存在。那么当一个IP进来时通过查看数组的对应位置是否是1,判断该IP是否存在。但这种算法存在误差,当查询结果是存在时,有可能实际并不存在,但当查询结果是不存在时,则一定不存在。为了降低错误率,可以增大数组长度,也可以采用多个哈希算法,将每个哈希算法值在数组中的位置都标为1,只有全为1时才表示该IP存在。
对于含有100亿条URL的两个文件求交集,可以先使用哈希算法分别将两个文件的每个URL映射到10000个组中,然后分别对对应的组求交集。
以上是关于学习笔记redis分布式缓存的主要内容,如果未能解决你的问题,请参考以下文章
Redis学习笔记25——缓存异常:如何解决缓存和数据库的数据不一致问题?
Redis学习笔记25——缓存异常:如何解决缓存和数据库的数据不一致问题?
Redis个人笔记:Redis应用场景,Redis常见命令,Reids缓存击穿穿透,Redis分布式锁实现方案,秒杀设计思路,Redis消息队列,Reids持久化,Redis主从哨兵分片集群