剖析【OC】中深复制与浅复制

在OC编程中,常常会用到对对象的复制,然后操作副本对象。然而对与应该选择何种对象复制的方式,复制后副本对象操作会不会影响原始对象等问题,我们往往没有过多考虑,而是凭借经验在编码。接下来就对OC中对象复制机制进行剖析,通过对复制机制的研究可以在编码中对对象的复制更加游刃有余。

首先,在OC中复制分为深复制与浅复制,一个比较认可的定义是:

深复制:复制对象引用与对象本身。
浅复制:只复制对象引用。

2641798-03dca550cc87313d.png

那么哪些操作才是浅复制,哪些操作是深复制?

所有的对象间赋值操作都是浅复制,仅仅复制了引用。如 CopyStr = Str1,这里CopyStr和Str1指向的同一内存地址,改变两者之间任何一个值,另一个都会随之改变。

试例代码:

void assignTest()
{
    printf("-----Assign Test-----\n\n");
    
    NSString *str1 = @"Hello";
    NSString *str2 = str1;
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str2 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str2);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str2);
    printf("\n");
    
    NSMutableString *str3 = [NSMutableString stringWithString:@"Hello"];
    NSMutableString *str4 = str3;
    [str3 appendString:@" World"];
    [str4 appendString:@"!"];
    printf("orignalStr : %s\n",[str3 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str4 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str3);
    printf("copyStr value address: %p\n",str4);
    printf("orignalStr pointer address: %p\n",&str3);
    printf("copyStr pointer address: %p\n",&str4);
    printf("\n");
    
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Hello", nil];
    NSMutableArray *arr2 = arr1;
    [arr1 addObject:@"World"];
    [arr2 addObject:@"!"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr2);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr2);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr2);
    printf("\n");
}

输出结果:

-----Assign Test-----


orignalStr : Hello
copyStr : Hello
orignalStr value address: 0x100002060
copyStr value address: 0x100002060
orignalStr pointer address: 0x7fff5fbff7a8
copyStr pointer address: 0x7fff5fbff7a0


orignalStr : Hello World!
copyStr : Hello World!
orignalStr value address: 0x1002005c0
copyStr value address: 0x1002005c0
orignalStr pointer address: 0x7fff5fbff798
copyStr pointer address: 0x7fff5fbff790


2016-08-22 11:35:20.312 CopyDemo[2046:72936] orignalArray : (
** Hello,**
** World,**
** "!"**
)
2016-08-22 11:35:20.313 CopyDemo[2046:72936] copyArray : (
** Hello,**
** World,**
** "!"**
)
orignalArray value address: 0x100406910
copyArray value address: 0x100406910
orignalArray pointer address: 0x7fff5fbff788
copyArray pointer address: 0x7fff5fbff780


通过上面结果我们可以看到,value的地址都是一样的,而pointer的地址是不一样的,这就说明了赋值操作是浅复制,只是生成两份对象的引用,而对象本身还是同一份。原对象值和副本对象的值操作是相互影响的。


**那么OC中如何实现深复制呢? **

OC中深复制是通过copy与mutableCopy方法实现(但不是都能达到深复制的目的),通过copy复制后的副本都是不可变的,通过mutableCopy复制后的副本都是可变的。如初始对象为NSString与NSMutableString,通过copy后副本都是NSString,而通过mutableCopy后都是NSMutableString。
接下来分两种情况讨论copy与mutableCopy:

初始对象不可变(如NSString、NSArray等)

调用copy方法也是浅复制,等同于直接赋值,因为复制过后的副本和原来的对象都是不可变的,所以调用copy本质就是赋值操作,复制了引用,但是都指向同一内存地址。
调用mutableCopy是深复制,副本成为了可变对象,但是操作副本,对初始对象的值不会产生影响。

试例代码:

void constCopyTest()
{
    printf("-----ConstCopy Test-----\n\n");
    
    printf("-NSString Copy-\n");
    NSString *str1 = @"Hello";
    NSString *str2 = [str1 copy];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str2 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str2);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str2);
    printf("\n");
    
    NSMutableString *str3 = [str1 mutableCopy];
    [str3 appendString:@" World!"];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str3 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str3);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str3);
    printf("\n");
    
    printf("-NSArray Copy-\n");
    NSArray *arr1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Hello"], nil];
    NSArray *arr2 = [arr1 copy];
    [[arr1 objectAtIndex:0] appendString:@" World!"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr2);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr2);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr2);
    printf("\n");
    
    NSMutableArray *arr3 = [arr1 mutableCopy];
    [arr3 addObject:@"World"];
    [[arr1 objectAtIndex:0] appendString:@" + str1"];
    [[arr3 objectAtIndex:0] appendString:@" + str3"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr3);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr3);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr3);
    printf("\n");
}

输出结果:

-----ConstCopy Test-----


-NSString Copy-
orignalStr : Hello
copyStr : Hello
orignalStr value address: 0x100002060
copyStr value address: 0x100002060
orignalStr pointer address: 0x7fff5fbff7a8
copyStr pointer address: 0x7fff5fbff7a0


orignalStr : Hello
copyStr : Hello World!
orignalStr value address: 0x100002060
copyStr value address: 0x1004074d0
orignalStr pointer address: 0x7fff5fbff7a8
copyStr pointer address: 0x7fff5fbff798


-NSArray Copy-
2016-08-22 11:35:20.314 CopyDemo[2046:72936] orignalArray : (
** "Hello World!"**
)
2016-08-22 11:35:20.314 CopyDemo[2046:72936] copyArray : (
** "Hello World!"**
)
orignalArray value address: 0x1001016b0
copyArray value address: 0x1001016b0
orignalArray pointer address: 0x7fff5fbff790
copyArray pointer address: 0x7fff5fbff788


2016-08-22 11:35:20.314 CopyDemo[2046:72936] orignalArray : (
** "Hello World! + str1 + str3"**
)
2016-08-22 11:35:20.314 CopyDemo[2046:72936] copyArray : (
** "Hello World! + str1 + str3",**
** World**
)
orignalArray value address: 0x1001016b0
copyArray value address: 0x100300000
orignalArray pointer address: 0x7fff5fbff790
copyArray pointer address: 0x7fff5fbff780


输出结果可以看到,通过copy方法复制后的副本对象的value地址和原对象是一样的,所以针对不可变对象是用copy方法是浅复制。而mutableCopy方法复制后,副本对象的value和pointer地址都和原对象不一样了,说明mutableCopy方法是深复制。

初始对象可变(如NSMutableString、NSMutableArray等)

调用copy方法是深复制,因为这里副本是不可变的,所以只考虑初始对象改变。因为是深复制,初始对象无论怎么改变,副本的值都是不变的。
调用mutableCopy也是深复制,复制过后,副本与初始对象之间的改变都是独立不影响的,如初始对象str = “example”,str+” append1”,副本str+” append2”,最终输出结果会是初始对象为”example append1”,副本为”example append2”。

试例代码:

void mutableCopyTest()
{
    printf("-----MutableCopy Test-----\n\n");
    
    printf("-NSString Copy-\n");
    NSMutableString *str1 = [NSMutableString stringWithString:@"Hello"];
    NSString *str2 = [str1 copy];
    [str1 appendString:@" World"];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str2 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str2);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str2);
    printf("\n");
    
    NSMutableString *str3 = [str1 mutableCopy];
    [str1 appendString:@" + str1"];
    [str3 appendString:@" + str3"];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str3 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str3);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str3);
    printf("\n");
    
    printf("-NSArray Copy-\n");
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"Hello"], nil];
    NSArray *arr2 = [arr1 copy];
    [[arr1 objectAtIndex:0] appendString:@" World!"];
    [arr1 addObject:@"Word"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr2);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr2);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr2);
    printf("\n");
    
    NSMutableArray *arr3 = [arr1 mutableCopy];
    [arr1 addObject:@"+arr1"];
    [arr3 addObject:@"+arr3"];
    [[arr1 objectAtIndex:0] appendString:@" + str1"];
    [[arr3 objectAtIndex:0] appendString:@" + str3"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr3);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr3);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr3);
    printf("\n");
}

输出结果:

-----MutableCopy Test-----


-NSString Copy-
orignalStr : Hello World
copyStr : Hello
orignalStr value address: 0x100300080
copyStr value address: 0x6f6c6c654855
orignalStr pointer address: 0x7fff5fbff7a8
copyStr pointer address: 0x7fff5fbff7a0


orignalStr : Hello World + str1
copyStr : Hello World + str3
orignalStr value address: 0x100300080
copyStr value address: 0x100300320
orignalStr pointer address: 0x7fff5fbff7a8
copyStr pointer address: 0x7fff5fbff798


-NSArray Copy-
2016-08-22 11:35:20.314 CopyDemo[2046:72936] orignalArray : (
** "Hello World!",**
** Word**
)
2016-08-22 11:35:20.314 CopyDemo[2046:72936] copyArray : (
** "Hello World!"**
)
orignalArray value address: 0x100300000
copyArray value address: 0x100300b00
orignalArray pointer address: 0x7fff5fbff790
copyArray pointer address: 0x7fff5fbff788


2016-08-22 11:35:20.314 CopyDemo[2046:72936] orignalArray : (
** "Hello World! + str1 + str3",**
** Word,**
** "+arr1"**
)
2016-08-22 11:35:20.314 CopyDemo[2046:72936] copyArray : (
** "Hello World! + str1 + str3",**
** Word,**
** "+arr3"**
)
orignalArray value address: 0x100300000
copyArray value address: 0x100300e40
orignalArray pointer address: 0x7fff5fbff790
copyArray pointer address: 0x7fff5fbff780


通过输出结果可以看到,对于可变对象,调用copy与mutableCopy方法都是深复制,因为副本的value和pointer地址都与原对象不同。

注:对于网上某些解释说NSArray/NSMutableArray NSDictionary/NSMutableDictionary只有浅复制,这里认为对于对象本身来说调用mutableCopy或对于可变对象调用copy都是深复制,只能说对于数组和字典这种复合结构深复制操作只是作用到外层对象,内部如果还有可变对象,仅仅就是引用的复制。(上面的例子中对于数组的第一个元素的操作可以很清楚的看出来。即使是对数组的深复制,然而改变第一个可变字符串,无论是副本数组还是原数组的第一个字符串都改变了。)

完整代码:

//
//  main.m
//  CopyDemo
//
//  Created by Jiao Liu on 6/23/16.
//  Copyright © 2016 ChangHong. All rights reserved.
//

#import <Foundation/Foundation.h>

void mutableCopyTest()
{
    printf("-----MutableCopy Test-----\n\n");
    
    printf("-NSString Copy-\n");
    NSMutableString *str1 = [NSMutableString stringWithString:@"Hello"];
    NSString *str2 = [str1 copy];
    [str1 appendString:@" World"];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str2 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str2);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str2);
    printf("\n");
    
    NSMutableString *str3 = [str1 mutableCopy];
    [str1 appendString:@" + str1"];
    [str3 appendString:@" + str3"];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str3 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str3);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str3);
    printf("\n");
    
    printf("-NSArray Copy-\n");
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"Hello"], nil];
    NSArray *arr2 = [arr1 copy];
    [[arr1 objectAtIndex:0] appendString:@" World!"];
    [arr1 addObject:@"Word"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr2);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr2);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr2);
    printf("\n");
    
    NSMutableArray *arr3 = [arr1 mutableCopy];
    [arr1 addObject:@"+arr1"];
    [arr3 addObject:@"+arr3"];
    [[arr1 objectAtIndex:0] appendString:@" + str1"];
    [[arr3 objectAtIndex:0] appendString:@" + str3"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr3);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr3);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr3);
    printf("\n");
}

void constCopyTest()
{
    printf("-----ConstCopy Test-----\n\n");
    
    printf("-NSString Copy-\n");
    NSString *str1 = @"Hello";
    NSString *str2 = [str1 copy];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str2 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str2);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str2);
    printf("\n");
    
    NSMutableString *str3 = [str1 mutableCopy];
    [str3 appendString:@" World!"];
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str3 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str3);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str3);
    printf("\n");
    
    printf("-NSArray Copy-\n");
    NSArray *arr1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Hello"], nil];
    NSArray *arr2 = [arr1 copy];
    [[arr1 objectAtIndex:0] appendString:@" World!"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr2);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr2);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr2);
    printf("\n");
    
    NSMutableArray *arr3 = [arr1 mutableCopy];
    [arr3 addObject:@"World"];
    [[arr1 objectAtIndex:0] appendString:@" + str1"];
    [[arr3 objectAtIndex:0] appendString:@" + str3"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr3);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr3);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr3);
    printf("\n");
}

void assignTest()
{
    printf("-----Assign Test-----\n\n");
    
    NSString *str1 = @"Hello";
    NSString *str2 = str1;
    printf("orignalStr : %s\n",[str1 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str2 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str1);
    printf("copyStr value address: %p\n",str2);
    printf("orignalStr pointer address: %p\n",&str1);
    printf("copyStr pointer address: %p\n",&str2);
    printf("\n");
    
    NSMutableString *str3 = [NSMutableString stringWithString:@"Hello"];
    NSMutableString *str4 = str3;
    [str3 appendString:@" World"];
    [str4 appendString:@"!"];
    printf("orignalStr : %s\n",[str3 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("copyStr : %s\n",[str4 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("orignalStr value address: %p\n",str3);
    printf("copyStr value address: %p\n",str4);
    printf("orignalStr pointer address: %p\n",&str3);
    printf("copyStr pointer address: %p\n",&str4);
    printf("\n");
    
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Hello", nil];
    NSMutableArray *arr2 = arr1;
    [arr1 addObject:@"World"];
    [arr2 addObject:@"!"];
    NSLog(@"orignalArray : %@",arr1);
    NSLog(@"copyArray : %@",arr2);
    printf("orignalArray value address: %p\n",arr1);
    printf("copyArray value address: %p\n",arr2);
    printf("orignalArray pointer address: %p\n",&arr1);
    printf("copyArray pointer address: %p\n",&arr2);
    printf("\n");
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        assignTest();
        constCopyTest();
        mutableCopyTest();
    }
    return 0;
}

本文最早发布于长虹软服公众号,有兴趣的朋友可以去看一下:
剖析【OC】中深复制与浅复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL主从复制的优势与劣势如下: 优势: 1. 数据备份和恢复:主库的数据可以异步或同步复制到从库,可以在从库上进行备份,以防止数据丢失或误删,从库数据可以用于故障恢复或数据分析。 2. 读写分离:通过在从库上进行读操作,可以减轻主库的压力,提高查询效率和响应速度。 3. 提高可用性:主库出现故障时,可以快速地将从库提升为新的主库,以保证系统的连续性。 4. 分布式部署:通过多个从库的部署,可以分散负载和提高系统的可扩展性。 劣势: 1. 数据同步延迟:从库的数据与主库的数据存在一定的延迟,可能导致读取到的数据不是最新的,需要根据业务需求进行合理的配置。 2. 增加系统复杂性:主从复制需要对系统进行额外的配置和管理,需要增加维护的工作量,可能会增加系统的复杂性和风险。 3. 安全问题:如果从库被恶意攻击或篡改,可能会对系统的数据完整性和安全性造成威胁,需要进行必要的安全措施。 ### 回答2: MySQL主从复制是一种常见的数据库复制方式,它的优势和劣势如下: 优势: 1. 提高系统的可用性:主从复制可以实现数据的实时备份和故障转移。当主数据库发生故障时,可以切换到从数据库继续提供服务,从而减少系统的停机时间。 2. 分担主数据库的读取压力:读取操作是数据库服务器的瓶颈之一,通过主从复制可以将读取操作分摊到从数据库上,减轻主数据库的负载,提高整个系统的性能。 3. 支持负载均衡:通过配置多个从数据库,可以实现负载均衡,将查询请求分布到不同的从数据库上,提高系统的并发处理能力。 4. 方便数据分析和报表生成:从数据库可以用于数据分析、生成报表等读取操作,而不会对主数据库的性能造成影响。 劣势: 1. 数据延迟:由于主从复制是异步进行的,从数据库的数据与主数据库的数据之间存在一定的延迟,可能会导致读取到的数据不是最新的。若应用需要实时数据,可能会受到一定的影响。 2. 配置复杂:主从复制需要进行一系列的配置和参数调优,包括主从服务器的网络连接、复制账户、二进制日志等设置,对于非专业人士来说,可能会有一定的难度。 3. 数据一致性难以保证:在主从复制过程中,由于网络异常等原因,可能会导致数据同步失败或数据丢失,从而造成主从数据的不一致。需要通过监控和维护来确保数据的一致性。 综上所述,MySQL主从复制有着多方面的优势,可以提高系统的可用性、分担主数据库的读取压力,支持负载均衡等。然而,在应用时需要注意数据延迟、配置复杂和数据一致性等劣势。 ### 回答3: MySQL主从复制是一种将数据从一个MySQL数据库服务器复制到另一个服务器的技术。它具有以下优势和劣势: 优势: 1. 高可用性:主从复制通过将数据复制到从服务器实现冗余备份,一旦主服务器发生故障,可以快速切换到从服务器,确保数据可用性和系统的连续性。 2. 负载均衡:通过将部分读操作分发给从服务器,可以减轻主服务器的负担,提高整个系统的性能和吞吐量。 3. 数据备份:通过在从服务器上进行数据复制,可以实现数据备份和恢复功能,保护数据免受意外删除、错误操作或其他灾难性事件的影响。 4. 分析和报告:通过在从服务器上执行查询,可以实现数据的实时分析和报告,而不会影响主服务器的性能。 劣势: 1. 数据延迟:由于主从服务器之间存在一定的延迟,因此从服务器上的数据可能不是实时更新的。在某些实时性要求较高的应用中,这可能会造成数据不一致的问题。 2. 单点故障:尽管主从复制提供了故障切换功能,但仍然存在单点故障的风险。如果主服务器和所有从服务器同时发生故障,将导致整个系统不可用。 3. 配置和管理:主从复制需要合理的配置和管理,包括确保从服务器与主服务器保持同步、处理复制错误和冲突等问题。这需要额外的人力资源和技术支持。 4. 复制冲突:如果在主从服务器上同时进行写操作,可能会发生冲突。这需要开发者正确处理和解决复制冲突,以保持数据的一致性。 总体而言,MySQL主从复制是一种强大的数据库复制技术,可以提高系统的可用性、性能和可靠性,但需要仔细配置和管理,以克服潜在的问题和风险。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值