Redis vs. SQL Server (MOT)
כבר זמן מה שאני מעוניין ללמוד על Redis, מבחינתי הדרך הטובה ביותר ללמוד על זה היא למצוא קשר ישיר למה שאני עושה היום ביום יום.
תחילה, מהו Redis –
Redis הינו מסד נתונים שעובד כ In – Memory בתצורת Key-Value.
המנוע הינו Open- Source מאוד נפוץ ששוקל כ700KB בלבד. ניתן להשתמש כמסד נתונים לכל דבר או כשגבת caching – שימוש עיקרי אצל חברות לטובת Session-State.
ההתקנה של Redis פשוטה מאד (הגרסא הרשמית מבוססות מערכות Linux. אך, קיימת גם גרסה על Windows
על Redis כבר שמעתי דיי מזמן ומשתמשים בזו לא מעט מלקוחותינו, אך מה שדחף אותי להתחיל ללמוד את הנושא הייתה, הרצאה ששמעתי בAzure Meetup שהתקיימה בפברואר 2017, לצערי עדיין לא העלו את ההקלטות, אבל ההרצאה הייתה מקרה לקוח שהסביר מדוע הם התחילו להשתמש עם Redis.
חגי (Hagai Luger), סיפר שבחברת הזנק שעבד, עבדו מול מסד נתונים ולא היה להם DBA, כך חיפשו פיתרון שיוכל לבצע Cashing, ולקבל פתרון לבעיית ביצועים בצורה קלה נוחה ופשוטה, ההטמעה הייתה קלה ופשוטה והביצועים היו מעולים.
אני רציתי לבצע השוואת ביצועים בין פיתרון מוצע ב - SQL Server.
לכן, השתמשתי עם הDemo של Microsoft, להדגמת שימוש והשוואת ביצועים בשרתי SQL Server 2014 ומעלה עם שימוש בIn – Memory.
ניתן ללמוד יותר ב2 הדגמות שבוצעו עם הDEMO –
בהדגמה של הDemo, מבדילים בין מצב הבסיס-
מצב בסיס – עבודה מול טבלה רגילה – aka Base Table.
מצב ראשון – הפיכת הטבלה לטבלה בזכרון – DURABILITY = SCHEMA_AND_DATA
מצב שני – שינו מצב הטבלה ל - DURABILITY = SCHEMA_ONLY
מצב שלישי – שינוי הפרוצדורה ל NATIVE_COMPILATION –(DLL)
מצב רביעי – שינוי DURABILITY(ACID) ברמת מסד הנתונים DELAYED_DURABILITY = FORCED
כעת נוסיף עוד 2 תהליכים כדי לחבר את Redis לDemo –
תהליך ראשון (מצב חמישי)-
פרויקט מקור - RediSQL
עבודה עם פרויקט קיים - RediSql–קליינט לעבודה מול Redis מ- SQL Server – מאמר בעברית
מה שהוספתי היו פרוצדורות שעטפו את הכלים של RediSQL ובצעם בלי שינוי באפליקציה היה אפשר לבדוק את העבודה עם Redis.
ניתן להוריד את הקוד - כאן
כמה בעיות בתהליך –
הוספתי מעבר בSQL כדי להגיע לRedis למרות שלא היה צורך בכך.
ניראה שSQL מנצח בענק – נוגד את מה שניסיתי להוכיח.
האפליקציה של מיקרוסופט דוגמת DMV של נגיעה בטבלאות, אשר עברתי דרך Redis לא הייתה שום נגיעה בטבלאות SQL Server כך הנתונים לא הציגו את המספרים הרלוונטים.
תהליך שני (מצב שישי)-
התחלתי לעבוד על האפליקציה של Microsoft לטובת ההוכחה,
שיניתי את האפליקציה שתדה לעבוד ב2 פלטפורמות – Redis + SQL Server. בעצם, פתחתי Class נוסף של TicketReservationDetail אשר הכיל פרטים על הישות.
והוספתי קישור לעבודה על Redis דרך StackExchange.Redis
שיניתי את הדגימה של Redis בגרף במקום לטרנזקציות לשניה לכמות פעולות בשניה בהנחה שכל פעולה מתבססת על פעולה בודדת בזמן נתון, הרי אני היחידי שמפעיל את השרת.
Single threaded nature of Redis
Redis uses a mostly single threaded design. This means that a single process serves all the client requests, using a technique called multiplexing. This means that Redis can serve a single request in every given moment, so all the requests are served sequentially. This is very similar to how Node.js works as well. However, both products are often not perceived as being slow. This is caused in part by the small amount of time to complete a single request, but primarily because these products are designed to not block on system calls, such as reading data from or writing data to a socket.
I said that Redis is mostly single threaded since actually from Redis 2.4 we use threads in Redis in order to perform some slow I/O operations in the background, mainly related to disk I/O, but this does not change the fact that Redis serves all the requests using a single thread.
מקור: https://redis.io/topics/latency
הפעולות התבססו על 2 אלמנטים פשוטים INSERT / SELECT – Set/Get
ניתן להוריד את האפליקציה + השינויים כאן.
מעבר לתצוגה בגרף שהראתה שינוי משמעותי בפעולות –
לבדיקת כמות הנתונים בSQL Server השתמשי בSSMS המוכר. ובשביל לדגום את כמות הרשומות בRedis השתמשתי ב Redis Desktop Manager
בדקתי את כמות הרשומות שנכנסו לטבלה לאחר כל הפעלה, לטובת SQL Server הקצאתי כפול מהזמן של הRedis.
SSMS- SQL Server - 8000 rows
Redis - 32599 keys = rows.
32 אלף בRedis אל מול 8 אלף בשרת SQL Server.