分布式缓存:redis

前言

微服务时代,分布式缓存的应用就是必然的

redis集群

目前可以知道的redis实现的集群方式是有两种的,一种是主从复制,一种是分片

主从复制

这种模式的特点是:

  • 读写分离 主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

每个主机和从机都拥有相同的数据

cluster集群(分片)

这种方式实现的集群就是每个机器都是主机

在分布式存储系统中,数据需要分散存储在多台设备上,数据分片(Sharding)就是用来确定数据在多台存储设备上分布的技术。
数据分片要达到三个目的:

  • 分布均匀,即每台设备上的数据量要尽可能相近;
  • 负载均衡,即每台设备上的请求量要尽可能相近;
  • 扩缩容时产生的数据迁移尽可能少。

数据分片方法
数据分片一般都是使用Key或Key的哈希值来计算Key的分布,常见的几种数据分片的方法如下:

  • 划分号段。这种一般适用于Key为整型的情况,每台设备上存放相同大小的号段区间,如把Key为[1, 10000]的数据放在第一台设备上,把Key为[10001, 20000]的数据放在第二台设备上,依次类推。这种方法实现很简单,扩容也比较方便,成倍增加设备即可,如原来有N台设备,再新增N台设备来扩容,把每台老设备上一半的数据迁移到新设备上,原来号段为[1, 10000]的设备,扩容后只保留号段[1, 5000]的数据,把号段为[5001, 10000]的数据迁移到一台新增的设备上。此方法的缺点是数据可能分布不均匀,如小号段数据量可能比大号段的数据量要大,同样的各个号段的热度也可能不一样,导致各个设备的负载不均衡;并且扩容也不够灵活,只能成倍地增加设备。
  • 取模。这种方法先计算Key的哈希值,再对设备数量取模(整型的Key也可直接用Key取模),假设有N台设备,编号为0~N-1,通过Hash(Key)%N就可以确定数据所在的设备编号。这种方法实现也非常简单,数据分布和负载也会比较均匀,可以新增任何数量的设备来扩容。主要的问题是扩容的时候,会产生大量的数据迁移,比如从N台设备扩容到N+1台,绝大部分的数据都要在设备间进行迁移。
  • 检索表。在检索表中存储Key和设备的映射关系,通过查找检索表就可以确定数据分布,这里的检索表也可以比较灵活,可以对每个Key都存储映射关系,也可结合号段划分等方法来减小检索表的容量。这样可以做到数据均匀分布、负载均衡和扩缩容数据迁移量少。缺点是需要存储检索表的空间可能比较大,并且为了保证扩缩容引起的数据迁移量比较少,确定映射关系的算法也比较复杂。
  • 一致性哈希。一致性哈希算法(Consistent Hashing)在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot Spot)问题,该方法的详细介绍参考此处 http://blog.csdn.net/sparkliang/article/details/5279393。一致性哈希的算法简单而巧妙,很容易做到数据均分布,其单调性也保证了扩缩容的数据迁移是比较少的。

现在比较常用的分片方式注主要是取模和一致性哈希算法,而且一致性哈希是目前比较完善的算法。
一致性哈希算法简单来说就是存在一个哈希环,然后将redis服务器哈希计算后放到哈希环中,同时将所要存储的对象至也进行哈希计算后放到哈希环中,然后顺时针寻找最近的一个服务器存储

Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

缓存三大问题

缓存击穿、缓存穿透、缓存雪崩。详解

缓存击穿

设置null值缓存太粗暴了,
因此很多时候最好的实现方式是设置一个过滤器

  • 例如:将数据库所有的数据的键值存到map中,当redis中没有的数据需要到数据库中查找的时候,首先进行过滤

但是这种方式,浪费了大量的内存,很不划算,所以出现了布隆算法 - 布隆过滤器

简单来说,就是设置一个类似位图结构的数组,然后将数据库中的键值经过哈希取模运算得到的值在相应数组的下标设置为1,因此需要查询一个数据的时候也经过相同的运算取出数组中相应下标的值。如果为1则代表该值可能存在,如果为0那么改值一定不存在。
因此布隆过滤器有一个特点:判断该值存在则不一定存在,判断该值不存在则一定不存在

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值