【学习笔记】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个组中,然后分别对对应的组求交集。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值