学习笔记redis分布式缓存

棉花糖灬 棉花糖灬     2022-12-12     790

关键词:

在高并发情况下,服务器的访问压力主要有两部分,一是服务器的处理压力,二是数据库的读写压力。数据库的读写压力可以使用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个组中,然后分别对对应的组求交集。

docker学习笔记总结(代码片段)

...ckermysql的中文问题9.docker安装redis10.docker之mysql主从复制11.分布式存储之哈希取余算法(基于redis集群缓存场景)12.分布式存储之一致性哈希算法(基于redis集群缓存场景)13.分布式存储之哈希槽分区(基于redis集群缓存场景)1.卸载docker服... 查看详情

分布式缓存技术redis学习——redis简介以及linux上的安装

...)的一种,NoSQL是以Key-Value的形式存储数据。当前主流的分布式缓存技术有redis,memcached,ssdb,mongodb等。既可以把redis理解为理解为缓存技术,因为它的数据都是缓存在内从中的;也可以理解为数据库,因为redis可以周期性的将数据... 查看详情

分布式缓存技术redis学习系列——redis高级应用(集群搭建集群分区原理集群操作)

本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看《详细讲解redis数据结构(内存模型)以及常用命令》《redis高级应用(主从、事务与锁、持久化)》本文我们继续学习redis的... 查看详情

redis学习笔记10:redis缓存穿透和雪崩

        Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那... 查看详情

redis个人笔记:redis应用场景,redis常见命令,reids缓存击穿穿透,redis分布式锁实现方案,秒杀设计思路,redis消息队列,reids持久化,redis主从哨兵分片集群

...,Redis应用场景,Redis常见命令,Reids缓存击穿穿透,Redis分布式锁实现方案,秒杀设计思路,Redis消息队列,Reids持久化,Redis主从哨兵分片集群Redis常见数据结构及高级数据结构使用场景,Redis应用场景,Redis常见命令,Reids缓存... 查看详情

分布式缓存技术redis学习系列----深入理解springredis的使用

关于springredis框架的使用,网上的例子很多很多。但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与springredis丰富的api大相径庭,真是浪费了这么优秀的一个框架。Spring-data-redis为spring-data... 查看详情

redis学习笔记26——缓存异常:如何解决缓存雪崩击穿穿透问题?

缓存雪崩缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般有两个原因导致:1、缓存中有大量数据同时过期解决方法... 查看详情

redis学习笔记26——缓存异常:如何解决缓存雪崩击穿穿透问题?

缓存雪崩缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般有两个原因导致:1、缓存中有大量数据同时过期解决方法... 查看详情

redis学习笔记23——旁路缓存:redis是如何工作的?(代码片段)

计算机系统中,默认有两种缓存:CPU里面的末级缓存,即LLC,用来缓存内存中的数据,避免每次从内存中存取数据;内存中的高速页缓存,即pagecache,用来缓存磁盘中的数据,避免每次从磁盘中... 查看详情

redis学习笔记23——旁路缓存:redis是如何工作的?(代码片段)

计算机系统中,默认有两种缓存:CPU里面的末级缓存,即LLC,用来缓存内存中的数据,避免每次从内存中存取数据;内存中的高速页缓存,即pagecache,用来缓存磁盘中的数据,避免每次从磁盘中... 查看详情

redis学习笔记—集群(rediscluster)(代码片段)

RedisCluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的目的数据分布Redis数据分区RedisCluser采用虚... 查看详情

redis学习笔记30——如何使用redis实现分布式锁?(代码片段)

以前使用过的锁都是本地锁,但是,Redis属于分布式系统,当有多个客户端需要争抢锁时,我们必须要保证,这把锁不能是某个客户端本地的锁。否则的话,其它客户端是无法访问这把锁的,当然也就... 查看详情

redis学习笔记30——如何使用redis实现分布式锁?(代码片段)

以前使用过的锁都是本地锁,但是,Redis属于分布式系统,当有多个客户端需要争抢锁时,我们必须要保证,这把锁不能是某个客户端本地的锁。否则的话,其它客户端是无法访问这把锁的,当然也就... 查看详情

redis学习笔记27——缓存被污染了怎么办(代码片段)

在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。这种情况,就是缓存污染。我们应用Redis缓存时... 查看详情

redis学习笔记(代码片段)

...度(Redis+memecache)文档型数据库MongoDB——MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档。MongoDB是一个介于关系型数据库和非关系型数据库中间的产品。MongoDB是非关系型数据库中功能最 查看详情

redis_nosql入门学习笔记(代码片段)

目录NoSQL简介NoSQL四种分类分布式基础之CAP和BASE理论集中式和分布式分布式系统设计理论CAPBASE理论Redis简介常见命令五大数据类型持久化之RDB持久化之AOF事务主从复制NoSQL简介NoSQL=NotOnlySQL,意即“不仅仅是SQL”。泛指非关... 查看详情

尚硅谷redis学习笔记--redis应用问题解决(代码片段)

1.缓存穿透1.1问题描述key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有&#x... 查看详情

redis学习笔记2:了解redis入门

...c;其具备如下特性:基于内存运行,性能高效支持分布式, 查看详情