Distributed caching

Đơn giản, cơ bản

http://www.codeproject.com/KB/web-cache/MyCache.aspx

Chia sẻ kinh nghiệm MongoDB

a. @Lê: NoSQL anh làm bên CouchDB, trong ngữ cảnh của anh (Mozilla platform) thì cá nhân thấy CouchDB tốt hơn MongoDB. Nhưng anh đánh giá cao MongoDB, tiếc là không muốn mạo hiểm.
Cơ chế memory-mapped file khiến MongoDB có vấn đề về kích thước file dữ liệu lưu trữ, tốt hơn nên dùng MongoDB trên nền 64 bit, giải pháp khéo léo cho 32 bit hiển nhiên có. 1 vấn đề nhỏ khác là vài báo cáo về việc corrupt dữ liệu nhưng không đáng quan tâm.
Mô hình bên nhóm Le tương tự bên anh nên anh nghĩ MongoDB là chọn lựa phù hợp trong các hệ NoSQL, đủ nhỏ để xài nhưng đủ mạnh để ứng dụng.

Sau cùng là Lê có thể yên tâm xài!

b. 1 vài kinh nghiệm của anh hy vọng có thể giúp Le:
– Quên Join, RDM, SQL, quên hết. Tìm hiểu NoSQL, map/reduce, như học 1 hệ mới. Tránh so sánh NoSQL và RDBMS, sẽ tệ không kém so sánh .NET và PHP. Không thằng nào mạnh hơn nói chung, chỉ mạnh hơn trong ngữ cảnh phù hợp.
Hàm ý đừng ráng “convert” SQL qua bên này, mà thể hiện cùng mục đích trong ngữ cảnh NoSQL. Le sẽ đụng vụ này trong quá trình chuyển đổi, việc ráng “convert” là thảm họa.
Không convert, mà làm lại với suy nghĩ về NoSQL trong đầu!
Cũng có vài giải pháp “chắp vá”, làm cầu nối giúp Le chuyển đổi nhanh. Tin anh đi, và kết quả là thảm họa về perf. , đại ý là thà xài cái cũ có khi nhanh hơn . Đơn giản vì NoSQL không phải là chiếc đũa thần.
Anh đùa nhưng là sự thật. Tin hay không thì tùy, Le giao vụ này cho 1 thằng không biết gì về RDBMS, nó sẽ làm nhanh hơn 1 thằng có kiến thức dày đặc.
– Về phân tán, là 5/5, MongoDB 5 phần, còn lại là khéo léo sử dụng phù hợp là 5 phần. Hiểu như không thể bằng việc gõ vài lệnh là nó phân tán, là viễn tưởng. Bản chất là phân tán nhưng phải tính phân tán cái gì và như thế nào.

Anh nói với kinh nghiệm làm product thực sự, không phải viết demo!

Trừ khi Le thực sự quyết tâm. Ngược lại, anh tính dựa trên điều kiện của bên team Le thì cân nhắc áp dụng các giải pháp phân tán cho chính SQL Server.

c. Em cũng hiểu cái gì cũng có cái giá của nó . Nhưng em xác định đây là thời điểm bọn em cẩn cải tổ, hay nôm na là đập và xây lại hoàn toàn trước khi có thể nó sẽ lớn và sa và đám lầy, chuyển đổi cũng tệ mà không chuyển cũng tệ. Em cũng cân nhắc một số giải pháp phân tán trên chính nền SQL – RDBMS, nhưng ngẫm lại đằng nào cũng phải đi theo xu thế NoSQL một khi nó có cơ hội lớn lên.

Cho nên cũng quyết tâm lần này là đập đi hoàn toàn kiến trúc, nền tảng kỹ thuật hiện tại và xây một nền tảng mới với kiến trúc mới là điều cần thiết nếu muốn LoanTin.Com đi xa hơn

Version 3 sẽ là sự chuẩn bị kỹ càng và chuyên nghiệp tất cả trước khi thực sự bước vào cuộc chiến giành giựt thị phần nội dung số ở Việt Nam

http://www.loantin.com/tn-POoAmFY4Vb/mongodb-mot-giai-phap-nosql-de-luu-tru-du-lieu-lon-cho-cac-site-mang.htm

Redis vs Memcached

1. Google Keyword “Redis cho distributed caching”

http://systoilet.wordpress.com/2010/08/09/redis-vs-memcached/

2. Redis Là CSDL nó được lưu vào file khi redis server được khởi động CSDL sẽ được load lên Ram.Nó cũng lưu dữ liệu như memcache.chi tiết 
http://code.google.com/p/redis/

Phỏng vấn 2 mẫu thiết kế Abstract Factory và Factory Pattern

Interview Abstract Factory and Factory Method (Design Patterns)

Nguyễn Thoại: Chà chà, chào hai anh, đây là lần đầu tiên blog của iem phỏng vấn hai anh, hai anh cảm thấy thế nào.

Factory Method: Tôi ko biết sao hay bị gộp chúng với cha Abstract Factory. Đều là factory pattern không có nghĩa chúng tôi không được có những buổi phỏng vấn riêng.:bbpcaycu:

Nguyễn Thoại: Ấy ấy, đừng tự ái, em muốn phỏng vấn cả hai anh cùng nhau để giúp đọc giả phân biệt được ai là ai. Hai anh có nhiều điểm giống nhau, và em có nghe vài phàn nàn rằng người ta thỉnh thoảng bị rối và không thể phân biệt được 2 người.

Abstract Factory: Ừ đúng đấy, đã có lúc tôi bị nhầm lẫn là cha Factory Method, và tôi biết ổng cũng bị giống như tôi. Hai tụi tôi đều giỏi trong việc giảm sự phụ thuộc giữa chương trình với những cài đặt cụ thể; nhưng mỗi người chúng tôi lại có những cách làm riêng nên thỉnh thoảng dân lập trình lại cảm thấy rối và không thể xác định được phải dùng cách nào.:bbpcuoi3:

Factory Method: Ấy, người ta vẫn phân biệt được tôi mà. Nói chung, tôi dùng các lớp để tạo ra products, còn cha dùng những đối tượng; hai cách đó hoàn toàn khác nhau nhé.

Nguyễn Thoại: Ừ em có tìm hiểu về hai anh rồi mà vẫn còn rối đây này, anh có thể nói thêm về khoản này không, anh Factory Method?:big_smile:

Factory Method: Ok, Cả cha Abstract Factory và tôi đều tạo ra các products, các objects, đó là việc chúng tôi phải làm. Nhưng tôi làm nhờ vào sự kế thừa (inheritance) …

Abstract Factory: … còn tôi làm nhờ vào sự kết hợp các đối tượng.

Factory Method: Đúng thía, nghĩa là nếu muốn tạo ra các đối tượng bằng cách Factory Method, người ta cần phải extend một lớp và override lại hàm tạo “factory method”.

Nguyễn Thoại: …rồi factory method sẽ làm cái gì?

Factory Method: Tất nhiên là tạo ra 1 object roài, anh đã từng viết bài về tôi mà giờ còn hỏi hả. Ý tưởng của tôi, Factory Method Pattern, là sẽ sử dụng các lớp con để sinh ra 1 đối tượng mong muốn. Bằng cách đó, người dùng sẽ chỉ cần biết đến lớp trừu tượng như gia cầm, và các lớp con cụ thể sẽ lo về các kiểu gà, kiểu vịt, kiểu ngan. Vì vậy, nói theo cách khác, tôi giúp chương trình độc lập với các kiểu (type) cụ thể đó.:bbpskien:

Abstract Factory: Ý tưởng của tôi cũng giống giống vậy đó, nhưng chỉ là làm theo một cách khác…

Nguyễn Thoại: Tiếp đi anh Abstract Factory … vừa rồi anh có đề cập đến cách kết hợp các đối tượng?

Abstract Factory: Ờ,cách của tôi thế này: Tôi tạo ra một kiểu trừu tượng (abstract type) để dùng vào việc tạo ra một nhóm những products khác. Khi đó, những lớp con của kiểu trừu tượng sẽ xác định cách tạo ra các products này. Để áp dụng được ý tưởng của tôi, bạn phải tạo ra một instance của một trong các lớp con trên (instance này là 1 factory) và đưa nó vào chỗ cần thiết trong code. Vì thế, giống như Factory Method, những nơi sử dụng factory của tôi sẽ hoàn toàn độc lập với những produtcts cụ thể.

Nguyễn Thoại: Oh yè, tôi biết rồi, một lợi ích nữa của cách này là anh đã nhóm các products tương tự nhau lại, có đúng không?

Abstract Factory: Đúng roài cưng à.:bbpchao:

Nguyễn Thoại: Bây giờ người ta cần bổ sung thêm một product nữa vô nhóm các products mà anh có thể tạo ra. Vậy không cần phải thay đổi gì hết huh?

Abstract Factory: Hèm, trường hợp này thì tôi phải thay đổi chút ít, nhiều người không thích lắm ở điểm này.

Factory Method: hĩ hĩ:bbpcuoi3:

Abstract Factory: Cười gì cha nội?:bbpbuon:

Factory Method: Cười chứ sao ko cười, làm vậy quá mất công chứ gì nữa. Cha thay đổi có nghĩa là người dùng phải đi mà đổi tất cả các lớp con roài? (các lớp con ở đây là các factories)

Abstract Factory: Đúng, nhưng cần phải làm như vậy vì tôi có khả năng tạo ra nhiều kiểu product khác nhau, trong khi người ta xài cách của anh khi họ cần tạo ra một kiểu product nào đó thôi, vì thế anh không có cồng kềnh như tôi, anh chỉ cần một method duy nhất.:bbpnodo:

Nguyễn Thoại: Anh Abstract Factory bớt nóng, tôi nghe đồn rằng anh thường sử dụng nhiều hàm factory method theo cách của anh Factory Method để tạo các đổi tượng bên trong những factories của anh, điều đó có đúng ko?

Abstract Factory: Đúng đó em, anh thừa nhận điêu này. Những lớp factory con thường dùng các factory method để tạo các products tương ứng. Trong trường hợp này, các factory method được dùng thuần túy để tạo ra các products.

Factory Method: … còn tôi dùng hàm factory method để tạo ra product cụ thể mà người ta muốn, người dùng sẽ không biết cái gì được tạo ra, họ chỉ cần gọi hàm.

Nguyễn Thoại: Dường như hai anh làm rất tốt công việc của mình. Tôi chắc rằng đọc giả đã có được lựa chọn của mình. Sau cùng, những factories của 2 anh quả thật rất hữu ích, đọc giả của tôi sẽ sử dụng chúng trong các tình huống thích hợp nhất. Các anh đều đóng gói (encapsulate) quá trình tạo ra đối tượng để giúp chương trình độc lập và giảm phụ thuộc với những kiểu cụ thể, việc làm này thật đáng tuyên dương. Cám ơn hai anh, hai anh có lời gì trước khi chào tạm biệt đọc giả không ạ?:bbpbtay:

Abstract Factory: Cám ơn. Hãy nhớ đến tôi, Abstract Factory, và sử dụng tôi bất cứ khi nào bạn cần cùng một lúc tạo ra nhiều loại products, và khi bạn muốn chắc chắn những nơi sử dụng sẽ không cần biết đến những lớp cụ thể khi cần làm việc này.:bbpskien:

Factory Method: Còn tôi là Factory Method, hãy sử dụng tôi để làm cho chương trình của bạn độc lập với những lớp cụ thể mà bạn cần tạo 1 đối tượng, hoặc khi bạn không biết sau này sẽ cần đến những lớp con nào nữa. Khi cần sử dụng tôi, hãy tạo tạo ra subclass (1 factory implement 1 kiểu abstract) và implement factory method cho chính bạn.:bbpraroi:

(Page 158-162 of Head First – Design Pattern)

Abstract Factory and Factory Method (Design Patterns)

A More Efficient Method for Paging Through Large Result Sets

I. SQL Server 2008 paging methods
http://stackoverflow.com/questions/4358253/sql-server-2008-paging-methods

II. SQL Server 2005 Paging – The Holy Grail
http://www.sqlservercentral.com/articles/T-SQL/66030/

III.  Paging option 

1. ROW_NUNMBER()  mới trong SQL Server 2005
http://stackoverflow.com/questions/1078956/which-paging-method-sql-server-2008-for-best-performance
http://www.4guysfromrolla.com/articles/031506-1.aspx
2. SET ROWCOUNT  (Cách nhanh nhất với dữ liệu lớn)
http://www.4guysfromrolla.com/webtech/042606-1.shtml
3. CURSORS
4. Temporary table
5. Sub query
6. other

DECLARE @maxRow int;
SET @maxRow = 100;
SET ROWCOUNT @maxRow
SELECT e.*, d.[Name] as DepartmentName
FROM @TempItems t
INNER JOIN Employees e ON
e.EmployeeID = t.EmployeeID
INNER JOIN Departments d ON
d.DepartmentID = e.DepartmentID
WHERE ID >= @startRowIndex

SET ROWCOUNT 0 (very important)

GO

Enterprise Library in CodeProject

1. Using the Microsoft Enterprise Library Data Access Application Block – Part I
http://www.codeproject.com/KB/architecture/MS-EntLib-DataAccess1.aspx
2. Exploring Caching: Using Caching Application Enterprise Library 4.1
http://www.codeproject.com/KB/web-cache/CachingApplicationBlock.aspx
3. Using Microsoft Enterprise Library Data Access Application Block – Part II
http://www.codeproject.com/KB/architecture/MS-EntLibrary-DataAccess2.aspx (Doc tu IDataReader ngon)

C# Micro Performance Testing Class

public class PerformanceTester
{
    public TimeSpan TotalTime { getprivate set; }
    public TimeSpan AverageTime { getprivate set; }
    public TimeSpan MinTime { getprivate set; }
    public TimeSpan MaxTime { getprivate set; }
    public Action Action { getset; }
    public PerformanceTester(Action action)
    {
        Action = action;
        MaxTime = TimeSpan.MinValue;
        MinTime = TimeSpan.MaxValue;
    }
    /// <summary>
    /// Micro performance testing
    /// </summary>
    public void MeasureExecTime()
    {
        var sw = Stopwatch.StartNew();
        Action();
        sw.Stop();
        AverageTime = sw.Elapsed;
        TotalTime = sw.Elapsed;
    }
    /// <summary>
    /// Micro performance testing
    /// </summary>
    /// <param name="iterations">the number of times to perform action</param>
    /// <returns></returns>
    public void MeasureExecTime(int iterations)
    {
        Action(); // warm up
        var sw = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            Action();
        }
        sw.Stop();
        AverageTime = new TimeSpan(sw.Elapsed.Ticks/iterations);
        TotalTime = sw.Elapsed;
    }
    /// <summary>
    /// Micro performance testing, also measures
    /// max and min execution times
    /// </summary>
    /// <param name="iterations">the number of times to perform action</param>
    public void MeasureExecTimeWithMetrics(int iterations)
    {
        TimeSpan total = new TimeSpan(0);
        Action(); // warm up
        for (int i = 0; i < iterations; i++)
        {
            var sw = Stopwatch.StartNew();
            Action();
            sw.Stop();
            TimeSpan thisIteration = sw.Elapsed;
            total += thisIteration;
            if (thisIteration > MaxTime) MaxTime = thisIteration;
            if (thisIteration < MinTime) MinTime = thisIteration;
        }
        TotalTime = total;
        AverageTime = new TimeSpan(total.Ticks/iterations);
    }
}

Here is how you can use it.

//usage
var tester = new PerformanceTester(() => SomeMethod());
tester.MeasureExecTimeWithMetrics(1000);
Console.Writeline(string.Format("Executed in {0} milliseconds", tester.AverageTime.TotalMilliseconds));