首页 > 其他分享 >分布式缓存

分布式缓存

时间:2023-07-17 09:57:28浏览次数:29  
标签:文件 缓存 Redis redis 主从 RDB 节点 分布式

单点redis的问题

  • 数据丢失问题:Redis是内存存储,服务重启可能会丢失数据。解决:数据持久化
  • 并发能力问题:单节点并发能力不足。解决:主从集群,读写分离。
  • 故障恢复:需要自动的故障恢复手段。解决:Redis哨兵,实现健康检测和自动恢复。
  • 存储能力问题:单节点Redis难以满足海量数据存储。解决:搭建分片集群,利用插槽机制动态扩容。

Redis持久化

RDB持久化

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

快照文件称为RDB文件,默认是保存在当前运行目录。

RDB执行时机:

  1. Redis停机时会执行一次RDB。 (save命令由Redis主进程来执行RDB,会阻塞所有命令;bgsave命令则开启子进程执行RDB,是异步的,避免主进程受到影响)
  2. Redis内部有触发RDB的机制,可以在redis.conf文件中找到。

异步持久化bgsave原理

RDB方式bgsave的基本流程?

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

fork采用的是copy-on-write技术:
当主进程执行读操作时,访问共享内存;
当主进程执行写操作时,则会拷贝一份数据,执行写操作。

 

RDB会在什么时候执行?save 60 1000代表什么含义?
默认是服务停止时执行。也可以配置config文件触发执行。
save 60 1000代表60秒内至少执行1000次修改则触发RDB
RDB的缺点?
RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
fork子进程、压缩、写出RDB文件都比较耗时

 

AOF持久化

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

 

 

RDB和AOF比较

 

 

Redis主从(解决并发问题)

搭建主从架构

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
因为根据经验,对Redis的操作大部分都是读,写操作占少数,所以在集群中采用读写分离,同时以少量主节点和大量从节点搭配,大大提升Redis的读取性能。主节点需要注意的就是数据同步如何同步给从节点。

 

在同一台服务器上搭建集群的步骤:
1、安装Redis,默认安装在/www/server/redis目录下。
2、在同一台服务器上开启3个redis实例,模拟主从集群,端口为7001、7002、7003。
3、准备实例和配置。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。在/tmp/目录下分别创建了7001、7002、7003三个子目录。# 创建目录 mkdir 7001 7002 7003
4、检查原始/www/server/redis/redis.conf文件中,持久化模式保持为默认的RDB模式,AOF保持关闭状态。
5、然后将/www/server/redis/redis.conf文件拷贝到/tmp/7001、/tmp/7002、/tmp/7003三个目录中
6、修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置都修改为自己所在目录
7、虚拟机本身有多个IP,为了避免将来混乱,需要在redis.conf文件中指定每一个实例的绑定ip信息(这里直接将ip全部设置为云服务器ip)
8、由于我的数据库设置了数据库,在后续开启主从关系会出现主节点使用info replication查到的connected_slaves是0的情况。因此需要在从节点的配置文件中添加一行masterauth 自己的密码

主从数据同步原理

全量同步

主从第一次同步是全量同步

 

 

增量同步

 Redis哨兵

 slave节点宕机恢复后可以找master节点同步数据,那master节点宕机怎么办?

 哨兵

 

 

 

 

 

RedisTemplate的哨兵模式

 引入依赖

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

在配置文件application.yml中指定sentinel相关信息

spring:
  redis:
    password: 1234 #如果Redis有密码市一定要配置密码
    sentinel:
      master: mymaster #指定master名称
      nodes: # 指定Redis集群信息
        - ip地址:27001
        - ip地址:27002
        - ip地址:27003

配置主从读写分离(在启动类中)

 

@SpringBootApplication
public class RedisDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisDemoApplication.class, args);
    }

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

 

 

Redis分片集群(增强存储能力)

 

 

 

 

 

 

 

标签:文件,缓存,Redis,redis,主从,RDB,节点,分布式
From: https://www.cnblogs.com/szhNJUPT/p/17549138.html

相关文章

  • Java开发大型互联网-架构师必须掌握的分布式技术
    Java开发大型互联网-架构师必须掌握的分布式技术摘要:在当今互联网行业,随着用户量和业务的不断增长,大型互联网系统的设计和开发已经成为了一项头等重要的任务。作为架构师,要能够应对这样的挑战,就必须掌握一些关键的分布式技术。本文将介绍Java开发大型互联网系统时,架构师必须要掌......
  • 高级java高并发,高性能,分布式,高可用,负载均衡,系统架构实战
    提到锁,大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧。帮助大家减小锁颗粒度,提高并发能力。初级技巧-乐观锁乐观锁使用的场景是,读不会冲突,写会冲突。同时读的频率远大于写。悲观锁的实现: 悲观的认为所......
  • 对安装Linux的服务器进行缓存清除
    对安装Linux的服务器进行缓存清除原创 二河小鱼 人文历史与科学技术 2023-07-1118:10 发表于江西收录于合集#服务器99个#Linux运维101个#清除缓存1个安装Linux的服务器缓存过高导致服务器运行速度慢第一步,查看当前服务器中Linux系统的状态。命令:free-h编......
  • 缓存
    缓存缓存,是一种减少I/O读写和CPU计算,以提升性能的手段。缓存的使用主要用在需要频繁读某些不变动,或者变动较少的数据的场景。一般使用场景是:应用中使用缓存,需要读数据时,先去缓存中查询。缓存中没有的话,再查数据库,查到数据后返回结果,并将结果写到缓存中。缓存分类本地缓存......
  • Redis分布式锁问题
    通过SET原子操作来设置key和过期时间//加锁//如果key不存在,那么设置它的值,否则什么也不做SETNXlock1//10s后自动过期EXPIRElock10//2者合一,一条命令保证原子性执行SETlock1EX10NX问题1:无法评估准确的加锁时间(自动续期)问题2:客户端1释放了客户端2持有的锁(保存和判断......
  • 微服务或分布式场景,如何设计和使用分布式锁
    光谈论方式的话,太多了,数据库、jvm内存、redis、zookeeper都可以,最常用的是基于redis实现的redission框架 核心原理众多博客讲的很清楚,面试说个大概应该没问题了第一点,用的reids的setex命令,因为这个命令是原子操作,不会在设置锁的过程中出现意外第二点,锁过期问题,redission的解......
  • 实现concurrentHashMap与redis两级缓存
    一、实现concurrentHashMap与redis两级缓存以下是一种使用ConcurrentHashMap和Redis实现两级缓存的示例代码:importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cache.annotation.CacheEvict;importorg.springframework.cache.ann......
  • 如何使用C#中的Lambda表达式操作Redis Hash结构,简化缓存中对象属性的读写操作
    Redis是一个开源的、高性能的、基于内存的键值数据库,它支持多种数据结构,如字符串、列表、集合、散列、有序集合等。其中,Redis的散列(Hash)结构是一个常用的结构,今天跟大家分享一个我的日常操作,如何使用Redis的散列(Hash)结构来缓存和查询对象的属性值,以及如何用Lambda表达式树来简化......
  • 如何提高缓存命中率
    这种问题的话,肯定是要提前设置好缓存的第二要有相对严格的双写一致策略,只要数据库数据发生变化,就要主动更新缓存,可以用binlog,代码层面可以用读写锁限制写的请求第三要使用定时任务固定刷新第四要有判空操作,一般的缓存使用,如果不存在的key,可能会前往db进行查询,可以打破这一规则,......
  • 聊聊我认为的分布式、集群实现关键点
    基于常见的中间件(Mysql、ElasticSearch、Zookeeper、Kafka、Redis)等分布式集群设计的机制,自己总结了在在集群设计过程中需要考虑的通用问题。节点通信机制主节点的增加、删除、通信机制。路由算法即数据路由到哪个节点的策略机制。在集群内有多个节点,数据该路由到哪个节点存......