Asp.Net 网站优化 数据库优化措施 使用主从库

软件设计

 

上一篇中我们配置好了主从库,现在我们尝试在程序中使用主从库。

主从库之间是一种发布订阅的关系,发布者和订阅者之间并非实时同步的,通常会有几分钟的延时,更有甚者会有几个小时的延时。所以我们需要通过合理的使用来避开有延时这个问题。

我们希望主库尽可能的少参与查询,来提高写的及时性;同时要让从库在不影响读出数据的准确及时的前提下尽可能的分担主库的压力。

主从两个库需要在配置文件中配置两个连接字符串,CONN_Master和CONN_Slave。我们需要设定一些规则决定当前的查询应该从主库查还是需要从从库查。这个规则没有定式,只能根据业务需要来确定。下面我举几个例子来说明:

1. 以豆瓣读书书的详细页为假定场景,你可以点击这里看下页面的结构(我不是豆瓣的技术,在这里只是拿这个页面举例)
我们来分析呈现这个页面需要的数据和这些数据的实效性要求
1) 书的详细信息 时效性要求:要求及时
2) 豆瓣成员的常用标签 实效性:不需要很及时
3) 喜欢读这本书的人也喜欢读的书 属于分析数据,不需要很及时
4) 最新书评 要求及时
5) 读这本书的几个用户 及时性不高
6) 喜欢这本书的人常去的小组 属于分析数据不需要很及时
从上面的分析可以看出只有1),4)两项数据需要从主库读,而2),3),5),6)为非及时数据从从库读取即可。当然我们可以对这些实效性不高的数据做缓存处理。

2. 以论坛帖子列表页面为假定场景,玩论坛的人都喜欢顶贴,把自己的帖子顶到第一页让更多的人关注,而对于50页之后的帖子则反读的人很少;我们可以根据这个业务逻辑特征来决定在用户访问前50页帖子列表数据时从主库读,而当用户访问超过50页之后的数据时则从从库进行查询。

3. 以订单为例,通常超过三个月的订单就不会再有变化了,假定我们把订单号设计为日期格式时,根据订单号去查询订单时就可以根据订单号来决定该访问主库还是从库。

举了几个适用的场景,我们以第三个场景为例,写一段简单的示意代码看下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//orderNo 的格式为 20100528120105000001 即yyyyMMddHHmmss + 序号
public OrderInfo GetOrder(string orderNo) {
    string connString = ConnStringGetter.GetForOrder(orderNo);
    using (SqlConnection conn = new SqlConnection(connString))
    {
        ...
    }
}
 
public class ConnStringGetter
{
    public static string GetForOrder(string orderNo) {
        int year = int.Parse(orderNo.Substring(0,4));
        int money = int.Parse(orderNo.Substring(4,2));
        int date = int.Parse(orderNo.Substring(6,2));
        DateTime orderTime = new DateTime(year, money, date);
 
        TimeSpan ts = DateTime.Now - orderTime;
//根据订单的时间决定使用主库还是从库
        if (ts.TotalDays > 30) return ConfigurationManager.ConnectionStrings["CONN_Slave"].ConnectionString;
        return ConfigurationManager.ConnectionStrings["CONN_Master"].ConnectionString;
    }
}

正确的使用主从库,可以很好的提升系统的性能。使用主库还是从库的选择权决定在业务逻辑的手里。

相关随笔:Asp.Net 网站优化 数据库优化措施 使用主从库(上)

我的微博地址是:http://weibo.com/yukaizhao 我会把一些技术心得碎片写到微博中,欢迎关注。
摘要: 周末参加了@淘宝技术嘉年华 主办的技术沙龙, 感觉收获颇丰。这里我把淘宝下单高并发解决方案的个人理解分享一下。我不是淘宝技术人员,本文只是写自己的理解阅读全文
posted @ 2012-04-23 13:06 玉开 阅读(3097) | 评论 (24) 编辑
 
摘要: 主从库之间是一种发布订阅的关系,发布者和订阅者之间并非实时同步的,通常会有几分钟的延时,更有甚者会有几个小时的延时。所以我们需要通过合理的使用来避开有延时这个问题阅读全文
posted @ 2010-06-03 09:50 玉开 阅读(3165) | 评论 (25) 编辑
 
摘要: 在csdn上看到一位朋友的一篇文章,标题是“构架师已死”,结合最近一段的工作,想呼唤一下,让架构师复活吧!阅读全文
posted @ 2007-04-27 15:11 玉开 阅读(4052) | 评论 (39) 编辑
 
摘要: 我们在开发系统的时候,经常会遇到系统需要权限控制,而权限的控制程度不同有不同的设计方案。阅读全文
posted @ 2007-04-15 15:58 玉开 阅读(24997) | 评论 (104) 编辑
 
 
posted @ 2007-04-09 08:45 玉开 阅读(2284) | 评论 (21) 编辑
 
 
摘要: 相信大家对三层开发都已经耳熟能详,可是我却发现新公司的既有代码中有一些违背分层开发思想的东西,现在与大家分享这些错误,我们共勉之。 

如果有人觉得对三层开发拿捏得不是太准,请参照李天平的文章:分层开发思想与小笼包,这篇文章用隐喻说明分层开发,是非常好的一篇文章。 

阅读全文
posted @ 2007-03-08 15:34 玉开 阅读(9224) | 评论 (134) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/2467187.html