Redis分布式缓存

Redis实战之 分布式缓存 基于解决单机Redis存在的问题。 阅读详情

分布式缓存

– 基于Redis集群解决单机Redis存在的问题

单机的Redis存在四大问题:

在这里插入图片描述

1.Redis持久化

Redis有两种持久化方案:

  • RDB持久化
  • AOF持久化

1.1.RDB持久化

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

1.1.1.执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令
  • 执行bgsave命令
  • Redis停机时
  • 触发RDB条件时

1)save命令

执行下面的命令,可以立即执行一次RDB:

在这里插入图片描述

save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

2)bgsave命令

下面的命令可以异步执行RDB:

在这里插入图片描述

这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。

3)停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1  
save 300 10  
save 60 10000 

RDB的其它配置也可以在redis.conf文件中设置:

# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes

# RDB文件名称
dbfilename dump.rdb  

# 文件保存的路径目录
dir ./ 

1.1.2.RDB原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

在这里插入图片描述

1.1.3.小结

RDB方式bgsave的基本流程?

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB文件
  • 用新RDB文件替换旧的RDB文件

RDB会在什么时候执行?save 60 1000代表什么含义?

  • 默认是服务停止时
  • 代表60秒内至少执行1000次修改则触发RDB

RDB的缺点?

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
  • fork子进程、压缩、写出RDB文件都比较耗时

1.2.AOF持久化

1.2.1.AOF原理

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

在这里插入图片描述

1.2.2.AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率也可以通过redis.conf文件来配:

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

三种策略对比:

在这里插入图片描述

1.2.3.AOF文件重写

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

在这里插入图片描述

如图,AOF原本有三个命令,但是set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。

所以重写命令后,AOF文件内容就是:mset name jack num 666

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb 

1.3.RDB与AOF对比

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

在这里插入图片描述

2.Redis主从

2.1.搭建主从架构

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。

在这里插入图片描述

具体搭建流程参考《Redis集群.md》:

2.2.主从数据同步原理

2.2.1.全量同步

主从第一次建立连接时,会执行全量同步,将master节点的所有数据都拷贝给slave节点,流程:

在这里插入图片描述

这里有一个问题,master如何得知salve是第一次来连接呢??

有几个概念,可以作为判断依据:

  • Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
  • offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。

因此slave做数据同步,必须向master声明自己的replication id 和offset,master才可以判断到底需要同步哪些数据。

因为slave原本也是一个master,有自己的replid和offset,当第一次变成slave,与master建立连接时,发送的replid和offset是自己的replid和offset。

master判断发现slave发送来的replid与自己的不一致,说明这是一个全新的slave,就知道要做全量同步了。

master会将自己的replid和offset都发送给这个slave,slave保存这些信息。以后slave的replid就与master一致了。

因此,master判断一个节点是否是第一次同步的依据,就是看replid是否一致。

如图:

在这里插入图片描述

完整流程描述:

  • slave节点请求增量同步
  • master节点判断replid,发现不一致,拒绝增量同步
  • master将完整内存数据生成RDB,发送RDB到slave
  • slave清空本地数据,加载master的RDB
  • master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
  • slave执行接收到的命令,保持与master之间的同步

2.2.2.增量同步

全量同步需要先做RDB,然后将RDB文件通过网络传输个slave,成本太高了。因此除了第一次做全量同步,其它大多数时候slave与master都是做增量同步。

什么是增量同步?就是只更新slave与master存在差异的部分数据。如图:

在这里插入图片描述

那么master怎么知道slave与自己的数据差异在哪里呢?

2.2.3.repl_backlog原理

master怎么知道slave与自己的数据差异在哪里呢?

这就要说到全量同步时的repl_baklog文件了。

这个文件是一个固定大小的数组,只不过数组是环形,也就是说角标到达数组末尾后,会再次从0开始读写,这样数组头部的数据就会被覆盖。

repl_baklog中会记录Redis处理过的命令日志及offset,包括master当前的offset,和slave已经拷贝到的offset:

在这里插入图片描述

slave与master的offset之间的差异,就是salve需要增量拷贝的数据了。

随着不断有数据写入,master的offset逐渐变大,slave也不断的拷贝,追赶master的offset:

在这里插入图片描述

直到数组被填满:

在这里插入图片描述

此时,如果有新的数据写入,就会覆盖数组中的旧数据。不过,旧的数据只要是绿色的,说明是已经被同步到slave的数据,即便被覆盖了也没什么影响。因为未同步的仅仅是红色部分。

但是,如果slave出现网络阻塞,导致master的offset远远超过了slave的offset:

在这里插入图片描述

如果master继续写入新数据,其offset就会覆盖旧的数据,直到将slave现在的offset也覆盖:

在这里插入图片描述

棕色框中的红色部分,就是尚未同步,但是却已经被覆盖的数据。此时如果slave恢复,需要同步,却发现自己的offset都没有了,无法完成增量同步了。只能做全量同步。

在这里插入图片描述

2.3.主从同步优化

主从同步可以保证主从数据的一致性,非常重要。

可以从以下几个方面来优化Redis主从就集群:

  • 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
  • Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
  • 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
  • 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力

主从从架构图:

在这里插入图片描述

2.4.小结

简述全量同步和增量同步区别?

  • 全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。
  • 增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave

什么时候执行全量同步?

  • slave节点第一次连接master节点时
  • slave节点断开时间太久,repl_baklog中的offset已经被覆盖时

什么时候执行增量同步?

  • slave节点断开又恢复,并且在repl_baklog中能找到offset时

3.Redis哨兵

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。

3.1.哨兵原理

3.1.1.集群结构和作用

哨兵的结构如图:

在这里插入图片描述

哨兵的作用如下:

  • 监控:Sentinel 会不断检查您的master和slave是否按预期工作
  • 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主
  • 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端

3.1.2.集群监控原理

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

•主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。

•客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

在这里插入图片描述

3.1.3.集群故障恢复原理

一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

  • 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点
  • 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举
  • 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
  • 最后是判断slave节点的运行id大小,越小优先级越高。

当选出一个新的master后,该如何实现切换呢?

流程如下:

  • sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master
  • sentinel给所有其它slave发送slaveof 192.168.150.101 7002 命令,让这些slave成为新master的从节点,开始从新的master上同步数据。
  • 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点

在这里插入图片描述

3.1.4.小结

Sentinel的三个作用是什么?

  • 监控
  • 故障转移
  • 通知

Sentinel如何判断一个redis实例是否健康?

  • 每隔1秒发送一次ping命令,如果超过一定时间没有相向则认为是主观下线
  • 如果大多数sentinel都认为实例主观下线,则判定服务下线

故障转移步骤有哪些?

  • 首先选定一个slave作为新的master,执行slaveof no one
  • 然后让所有节点都执行slaveof 新master
  • 修改故障节点配置,添加slaveof 新master

3.2.搭建哨兵集群

具体搭建流程参考《Redis集群.md》:

3.3.RedisTemplate

在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。

下面,我们通过一个测试来实现RedisTemplate集成哨兵机制。

3.3.1.导入Demo工程

首先,我们引入课前资料提供的Demo工程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lwekx5Yz-1686663345542)(assets/image-20210725155124958.png)]

3.3.2.引入依赖

在项目的pom文件中引入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.3.3.配置Redis地址

然后在配置文件application.yml中指定redis的sentinel相关信息:

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.150.101:27001
        - 192.168.150.101:27002
        - 192.168.150.101:27003

3.3.4.配置读写分离

在项目的启动类中,添加一个新的bean:

@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

这个bean中配置的就是读写策略,包括四种:

  • MASTER:从主节点读取
  • MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
  • REPLICA:从slave(replica)节点读取
  • REPLICA _PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master

4.Redis分片集群

4.1.搭建分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

  • 海量数据存储问题

  • 高并发写的问题

使用分片集群可以解决上述问题,如图:

在这里插入图片描述

分片集群特征:

  • 集群中有多个master,每个master保存不同数据

  • 每个master都可以有多个slave节点

  • master之间通过ping监测彼此健康状态

  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点

具体搭建流程参考课前资料《Redis集群.md》:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s3o56u7v-1686663345542)(assets/image-20210725155806288.png)]

4.2.散列插槽

4.2.1.插槽原理

Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:

在这里插入图片描述

数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:

  • key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分
  • key中不包含“{}”,整个key都是有效部分

例如:key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。

在这里插入图片描述

如图,在7001这个节点执行set a 1时,对a做hash运算,对16384取余,得到的结果是15495,因此要存储到103节点。

到了7003后,执行get num时,对num做hash运算,对16384取余,得到的结果是2765,因此需要切换到7001节点

4.2.1.小结

Redis如何判断某个key应该在哪个实例?

  • 将16384个插槽分配到不同的实例
  • 根据key的有效部分计算哈希值,对16384取余
  • 余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

  • 这一类数据使用相同的有效部分,例如key都以{typeId}为前缀

4.3.集群伸缩

redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:

在这里插入图片描述

比如,添加节点的命令:

在这里插入图片描述

4.3.1.需求分析

需求:向集群中添加一个新的master节点,并向其中存储 num = 10

  • 启动一个新的redis实例,端口为7004
  • 添加7004到之前的集群,并作为一个master节点
  • 给7004节点分配插槽,使得num这个key可以存储到7004实例

这里需要两个新的功能:

  • 添加一个节点到集群中
  • 将部分插槽分配到新插槽

4.3.2.创建新的redis实例

创建一个文件夹:

mkdir 7004

拷贝配置文件:

cp redis.conf /7004

修改配置文件:

sed /s/6379/7004/g 7004/redis.conf

启动

redis-server 7004/redis.conf

4.3.3.添加新节点到redis

添加节点的语法如下:

在这里插入图片描述

执行命令:

redis-cli --cluster add-node  192.168.150.101:7004 192.168.150.101:7001

通过命令查看集群状态:

redis-cli -p 7001 cluster nodes

如图,7004加入了集群,并且默认是一个master节点:

在这里插入图片描述

但是,可以看到7004节点的插槽数量为0,因此没有任何数据可以存储到7004上

4.3.4.转移插槽

我们要将num存储到7004节点,因此需要先看看num的插槽是多少:

在这里插入图片描述

如上图所示,num的插槽为2765.

我们可以将0~3000的插槽从7001转移到7004,命令格式如下:

在这里插入图片描述

具体命令如下:

建立连接:

在这里插入图片描述

得到下面的反馈:

在这里插入图片描述

询问要移动多少个插槽,我们计划是3000个:

新的问题来了:
在这里插入图片描述

那个node来接收这些插槽??

显然是7004,那么7004节点的id是多少呢?

在这里插入图片描述

复制这个id,然后拷贝到刚才的控制台后:

在这里插入图片描述

这里询问,你的插槽是从哪里移动过来的?

  • all:代表全部,也就是三个节点各转移一部分
  • 具体的id:目标节点的id
  • done:没有了

这里我们要从7001获取,因此填写7001的id:

在这里插入图片描述

填完后,点击done,这样插槽转移就准备好了:

在这里插入图片描述

确认要转移吗?输入yes:

然后,通过命令查看结果:

在这里插入图片描述

可以看到:

在这里插入图片描述

目的达成。

4.4.故障转移

集群初识状态是这样的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUJHHqJe-1686663345545)(assets/image-20210727161152065.png)]

其中7001、7002、7003都是master,我们计划让7002宕机。

4.4.1.自动故障转移

当集群中有一个master宕机会发生什么呢?

直接停止一个redis实例,例如7002:

redis-cli -p 7002 shutdown

1)首先是该实例与其它实例失去连接

2)然后是疑似宕机:

在这里插入图片描述

3)最后是确定下线,自动提升一个slave为新的master:

在这里插入图片描述

4)当7002再次启动,就会变为一个slave节点了:

在这里插入图片描述

4.4.2.手动故障转移

利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:

在这里插入图片描述

这种failover命令可以指定三种模式:

  • 缺省:默认的流程,如图1~6歩
  • force:省略了对offset的一致性校验
  • takeover:直接执行第5歩,忽略数据一致性、忽略master状态和其它master的意见

案例需求:在7002这个slave节点执行手动故障转移,重新夺回master地位

步骤如下:

1)利用redis-cli连接7002这个节点

2)执行cluster failover命令

如图:

在这里插入图片描述

效果:

在这里插入图片描述

4.5.RedisTemplate访问分片集群

RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:

1)引入redis的starter依赖

2)配置分片集群地址

3)配置读写分离

与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:

spring:
  redis:
    cluster:
      nodes:
        - 192.168.150.101:7001
        - 192.168.150.101:7002
        - 192.168.150.101:7003
        - 192.168.150.101:8001
        - 192.168.150.101:8002
        - 192.168.150.101:8003
Redis分布式缓存的实现(一) 利用mybatis自身本地缓存结合redis实现分布式缓存 首先mybatis的二级缓存存在应用服务器上,这种缓存也叫本地缓存,但是本地缓存占用了这台服务器jvm的内存,而且,本地缓存会随着jvm的结束而消失,同时,他只是存在于当前的应用服务器本身,那么日后在集群分布式系统下面它不能做到共享,如果我们用了分布式缓存,任意一个请求在任意一台服务器上查询了相应的操作,都会把它放入redis中,日后所有的查询都会从我们的redis中获取,那么日后缓存的丢失与我们当前应用服务器的重启和断电没有任何影响。... 阅读详情

相关推荐

详细了解Redis分布式存储的常见方案

Redis提供了多种分布式存储方案,包括主从复制、哨兵模式和集群模式。这些方案各有优缺点,适用于不同的场景和需求。通过合理配置和使用这些方案,我们可以构建高性能、高可用性的Redis集群,满足大规模数据和高并发访问的需求。在Java实践中,我们可以使用Jedis库来方便地连接到Redis集群,并执行各种Redis命令。通过合理配置连接池和异常处理,我们可以确保应用的稳定性和性能。

huaqianzkh的专栏 1856

分布式缓存灵魂十连,你能坚持几个?

点击上方蓝色“方志朋”,选择“设为星标”回复“666”获取独家整理的学习资料!目录前言目前工作中用到的分布式缓存技术有redis和memcached两种,缓存的目的是为了在高并发系统中有效...

方志朋的博客 1566

基于redis分布式缓存实现

简单说明下,写此文章算是对自己近一段工作的总结,希望能对你有点帮助,同时也是自己的一点小积累。 一.为什么选择redis 在项目中使用redis做为缓存,还没有使用memcache,考虑因素主要有两点: 1.redis丰富的数据结构,其hash,list,set以及功能丰富的String的支持,对于实际项目中的使用有很大的帮忙。(可参考官网redis.io) 2.redis单点

haier_jiang的专栏 4万+

深入浅出分布式系统中的缓存架构

缓存,已经是一个老生常谈的技术了,在高并发读的情况下对于读服务来说可谓是抗流量的银弹。 高并发三大利器:缓存、限流、降级。 今天我们就来谈谈缓存。对于缓存,我的理解是让数据更接近于用户,目的是让用户的访问速度更快。 所以距离越接近用户的缓存,越快越有效!缓存的工作原理是先从缓存中获取数据,如果有数据则直接返回给用户,如果没有数据则从慢速设备上读取实际数据并且将数据放入缓存。 按照层级关系,我们来划分一下缓存,同时也是我们今天的大纲: 浏览器缓存 浏览器是我们网上冲浪的重要工具,为了能够让我们顺畅的冲浪,它

CRMEB小程序商城的博客 5663

利用MyBatis自身本地缓存结合Redis实现分布式缓存

一、Redis分布式缓存的实现 1、什么是缓存? 计算机内存中的一段数据。 2、内存中数据特点 读写快 断电立即丢失 3、缓存解决了什么问题? 提高网站吞吐量(请求响应)提高, 网站运行效率快 缓存的存在是用来解决数据库访问压力 4、既然缓存能提高效率, 所有项目中都加缓存吗? 使用缓存时一定是数据库中数据极少发生修改, 更多用于查询情况, 比如地址, 省, 市, 等 5、本地缓存和分布式缓存的区别? 本地缓存 : 存在应用服务器内存中数据称之为本地缓存(Local Cache) 分布式缓

Guizy 3460

分布式系统架构设计原理与实战:分布式缓存技术

1. 背景介绍 随着互联网的快速发展,用户数量和访问量不断增加,传统的单体应用已经无法满足高并发、高可用、高性能的需求。为了解决这些问题,分布式系统应运而生。分布式系统将原本集中式的应用拆分成多个独立的服务,通过网络进行通信和协作,从而提高系统的可扩展性、可用性和性能。在分布式系统中,分布式缓存技术是一种关键的解决方案,它可以有效地减轻数据库压力,提

AI天才研究院 1291

【分布式】Redis分布式缓存

本文介绍了什么是Redis分布式缓存,它的特点,多种实现方式区别,主从复制模式详解,cluster模式详解,具体使用等

qq_44845473的博客 3082

【STC32G12K128开发板】——搭建开发环境

Keil C251是美国Keil公司(该公司2005年被ARM公司收购)出品的针对251微控制器系列兼容单片机C语言软件开发系统。

qq_36139768的博客 1万+

如何使用Redis实现分布式缓存

核心流程:分布式缓存的核心是 “查缓存→查库→回写缓存”,所有服务共用同一个 Redis 实例,实现缓存共享;关键配置:Redis 连接要配置地址 / 密码 / 连接池,缓存必须设过期时间;避坑要点:必须处理缓存穿透、击穿、雪崩问题,修改数据时遵循 “先更库,再删缓存”(而非直接更缓存)。

weixin_53050448的博客 1211

【数据分析/商业分析】面试题整理——SQL专题

数据分析\商业分析—面试题整理 自己总结的SQL类的面试题 文章目录数据分析\商业分析—面试题整理1.新增用户2.活跃用户数量3.连续登录4.次(n)日留存5.每个科目下分数最高的两名学生

awater_17的博客 1859

px3 有感分析

px3 后续分析

qq_39707917的博客 3116

Spring Cloud 分布式缓存 Redis

Redis 在分布式缓存中的应用,为 Spring Cloud 微服务提供了强大的性能支持。通过 Spring Data Redis 和注解缓存,开发者可以快速实现高效的缓存管理。结合分布式锁、监控和优化策略,Redis 能满足各种复杂的业务需求。

Flying_Fish_roe的博客 799

打开电脑自动弹窗问题:无法为文件‘D:\Config.Msi\*.rbf‘设置文件安全。错误:5。请确认...如何解决?| 提供多种解决方案,亲测有效!

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 2914

SpringBoot使用Redis实现分布式缓存

springboot使用Redis实现分布式缓存 Redis实现主从复制 Redis集群的构建

不迁怒,不贰过。小知识,大智慧。 4586

SAP MM ME21N保存前检查增强

想在ME21N保存前做一些数据检查, 可以做一个增强功能,  运行 CMOD 新增,   增强接口 输入 MM06E005  (  EXIT_SAPMM06E_012 ) ,在 NCLUDE ZXM06U43 .  里写代码功能。  例子如下: *&---------------------------------------------------------------------*

heng0757的专栏 1万+

基于STM32的嵌入式平台实现EtherCAT主站

本文将介绍如何在基于STM32的嵌入式平台上构建EtherCAT主站,并提供相应的源代码。使用SOEM库提供的API函数,我们可以实现与EtherCAT从站设备的实时通信和数据交换。在STM32的代码中,使用SOEM库提供的API函数初始化EtherCAT主站。在SOEM库中,我们可以找到EtherCAT主站的实现代码和相关的API函数。使用SOEM库提供的API函数实现EtherCAT主站的功能,包括发送和接收EtherCAT数据帧、处理从站设备的状态等。确保连接正常并且设备能够相互通信。

CodeSageX的博客 2833

Redis 实现分布式缓存

Redis 作为一种高性能的内存数据库,在分布式缓存领域具有广泛的应用前景。通过合理的架构设计、数据存储策略、性能优化和安全可靠性措施,可以充分发挥 Redis 的优势,提高系统的性能和可扩展性。

果酱 の 博客 2011

【即插即用模块】卷积篇 | TCSVT 2025 | MFACB:多尺度膨胀融合,快速扩大感受野,多尺度特征精准捕捉!

本文提出了一种新型多尺度融合膨胀卷积模块MFACB,用于增强语义分割任务中的特征表达能力。该模块通过三分支串联膨胀卷积结构快速扩大感受野,采用双路径融合机制(基础信息路径+多尺度信息路径)实现高效上下文聚合。相比传统卷积块,MFACB在保持轻量化的同时显著提升了多尺度特征捕捉能力,实验表明其性能优于基础残差块。该模块支持自定义膨胀率和步长调整,可灵活嵌入不同网络阶段,适用于需要特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 311

分布式缓存redis

就是用户查询数据的时候,我们将数据从数据库中同步一份到内存中,客户端直接从内存中查询数据,减少了和数据库的交互次数,提高查询性能(内存读写很快),减轻数据库的压力,用户的体验感也会好。

weixin_47720577的博客 490

深入理解 HTTP 协议中的 Content-Type

是 HTTP 协议中的一个头部字段(Header),用于指示请求或响应中实体主体(body)的媒体类型(Media Type),也称为MIME 类型(Multipurpose Internet Mail Extensions)。

h a 6 6 6 c k 为 你解决复杂难题! 997

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Redis,分布式缓存演化之路

本文介绍了基于Redis的分布式缓存演化,探讨了分布式锁和缓存一致性问题及其解决方案。首先分析了本地缓存和分布式缓存的区别与优劣,接着深入讲解了分布式远程缓存带来的并发、缓存失效(穿透、雪崩、击穿)等问题及应对策略。文章还详细描述了如何使用Redis实现分布式锁,确保高并发场景下的数据一致性和系统稳定性。最后,通过双写模式和失效模式讨论了缓存一致性问题,并提出了多种解决方案,如引入Canal中间件等。希望这些内容能为读者在设计分布式缓存系统时提供有价值的参考。

qq_42969817的博客 975

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Redis高级篇 —— 分布式缓存

介绍了Redis持久化以及三种Reids集群方案:主从、哨兵、分片集群

weixin_49429082的博客 2605

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

分布式缓存Redis技术

Redis是一个以内存为核心的数据结构服务器,官方文档将其定位为面向caching与streaming的开源内存数据库。为数据库、搜索引擎和下游服务提供高命中率的热点缓存存储会话、验证码、令牌、购物车、临时状态等短生命周期数据实现计数器、排行榜、限流器、分布式锁、延迟队列和轻量消息能力通过复制、Sentinel与Cluster支撑高可用与横向扩展。

m0_50180963的博客 422

Redis-分布式缓存

redis 是非常热门的缓存选择。但是,如果只有一个 redis 节点,那么就会面临很多问题。所以,更好的做法是搭建 redis 集群,可以使用多个节点缓存数据。多节点 redis 其实就是分布式缓存。的不足:数据丢失:redis 是基于内存存储的,服务重启内存数据会丢失。并发能力有限:redis 是基于内存存储的,并发能力远远强于 mysql。但是,在单节点的情况下,redis 的并发能力依赖于物理机器的性能,也就是物理内存的读写速度和容量大小。

sdgfafg_25的博客 1628
上一篇: Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url问题
下一篇: Geometry-based Point Cloud Compression-White paper on G-PCC
CS-ZH
博客等级 码龄8年 21粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值