RediSql–קליינט לעבודה מול Redis מ- SQL Server

12 בNovember 2015

תגיות: , , ,
2 תגובות

אמ’לק: RediSql הוא קליינט אופן-סורסי חדש שזמין כעת, המאפשר עבודה מול דטאבייס Redis מ- T-SQL (כלומר, מ-SQL Server). להורדה והוראות התקנה.

מה זה Redis?

Redis הוא שרת in-memory database, המאפשר לאכסן מידע בתצורה של key-value pairs. מדובר בשרת מאד פופולרי, בעל ביצועים גבוהים, פשוט להתקנה ולשימוש. השימושים של Redis מגוונים, ויכולים לנוע בתרחישי שימוש רבים הנעים מ-caching (שימוש מאד פופולרי ב- Redis) ועד למנגנוני pub/sub פשוטים שדורשים ביצועים גבוהים. ההתקנה של Redis פשוטה מאד (הגרסא הרשמית היא רק למערכות *nix, אבל יש גם גרסא ל-Windows).

ל- Redis יש מגוון קליינטים אבל עד עתה לא היה ל- SQL Server (שמאפשר לעבוד עם Redis מקוד T-SQL)

למה צריך קליינט ל-SQL?

ככלל, אפשר להגיד שאנחנו חיים בעולם בו יש יותר מידע, שמעבדים בצורה יותר מתוחכמת, ועם דרישות ביצועים יותר גבוהות. גם כמות הכלים לעשות את המשימה הזאת גדלה.

אם פעם בעיקר היה לנו דטאבייסים רלציוניים, כיום יש לנו מגוון רחב של פתרונות. אבל, כמובן שאין פיתרון קסם יחיד שפותר הכל, ושילובים בין טכנולוגיות הם דבר טבעי לחלוטין. בלא מעט תרחישים שילוב בין Redis ל- SQL Server יכול להיות שימושי מאד: למשל שימוש כפיתרון caching בתהליכים שכתובים ב- T-SQL (בין אם זה stored procedure שעושה מלא דברים, טריגר, ג’וב שרץ ומייצר דוחות), או לחלופין לגישה למידע של אפליקציות אחרות שמאוכסן ב- Redis ועוד.

נעים להכיר – RediSql

RediSql מורכב ממספר functions ו- stored procedures (מרביתם כתובים ב-C#, ומבוססים על קליינט בשם RedisSharp, שנעטפו כדי שיתאימו לעבודה מ- SQL Server) שמתקינים אותם ברמת הדאטבייס (נוצרת סכימה בשם redisql המרכזת את כולם). ברגע שמתקינים אותם, אפשר להשתמש בהם לעבוד מול הנתונים ששמורים בשרת ה- Redis שלכם.

למשל, הקטע קוד הבא שומר ערך ב- key שנקרא StringKeyWithTTL, ממתין עשר שניות ואז שולף את הערך ואת הזמן שנשאר לו לחיות (הערך שנשמר הוא עם expiration):

   1: EXEC [redisql].[SetStringValue]

   2:         @host = N'localhost',

   3:         @port = 6379,

   4:         @key = 'StringKeyWithTTL',

   5:         @value = N'gv',

   6:         @expiration = '00:10:00' --10 minutes expiration

   7:

   8: WAITFOR DELAY '00:00:10'

   9:

  10: --Let's print the value of the key

  11: --if the key not exists we'll get NULL value

  12: SELECT Value = [redisql].[GetStringValue] (

  13:                                            'localhost'

  14:                                           ,default --default port

  15:                                           ,default -- no password

  16:                                           ,default -- dbid: 0

  17:                                           ,'SimpleStringKey')

  18:         ,TTL = [redisql].GetKeyTTL('localhost', default, default, default, 'StringKeyWithTTL')

והתוצאה:

image

Redis תומך בשמירת data types שונים בתור values. כלומר, ניתן לשמור ערכי string, אבל ניתן לשמור בין השאר גם set (קבוצה בה כל ערך נשמר פעם אחת), lists (רשימות) ועוד מספר סוגים. RediSql תומך כיום בערכים מסוג string (כמו שראיתם), ברשימות (כלומר, key שכולל תחתיו רשימה של string-ים) ובסוג נוסף, שממומש ב- RediSql על בסיס lists של Redis, שנקרא Rowsets.

למרות שלשמור string-ים יכול להיות מאד שימושי, הרבה מהמידע כאשר אנחנו עובדים מול דטאבייס רלציוני, הוא מין הסתם טבלאי. כלומר, תוצאות שכוללות שורות ועמודות. כדי לאפשר לשמור result sets שלמים ב- Redis, ניתן להשתמש בפונקציות ב- RediSql שמיועדים לעבודה עם rowsets.

למשל, הקוד הבא מריץ שליפה פשוטה ושומר את התוצאות שלה ל-Redis, ב- key שנקרא keyname_998:

EXEC [redisql].StoreQueryResultsData

        @host = N'localhost',

        @port = 6379,

        @key = 'keyname_998',

        @query = N'SELECT * FROM INFORMATION_SCHEMA.ROUTINES',

        @replaceExisting = 1

בשביל לקבל את המידע בחזרה מ- redis, צריך רק לקרוא ל-stored procedure המתאים:

DECLARE @result int

EXEC @result = [redisql].[GetStoredRowset]

        @host = N'localhost',

        @key ='keyname_998'

PRINT @result    --if result >= 0: there was a key that name, with rows, and result is the number of the rows stored.

                --if result == -1, key not exists

והתוצאה לפניכם:

image

מאחורי הקלעים, נשמרים הנתונים בתור list ב- Redis (כמובן עם metadata של העמודות כדי להציג את המידע כמו שצריך ועם data types מתאימים). כמובן, שיש לזה עלות ביצועים די משמעותית (לעומת שמירה ישירה של הנתונים ב- Redis), ולכן זה מיועד בעיקר לצרכי אינטגרציה בין הפלטפורמות, או כאשר עלות השליפה עצמה משמעותית מספיק כך שה- caching ישתלם על אף תוספת העלות שלו.

באותה המידה, ניתן לעשות את הפעולה בבת אחת – במידה שהערך קיים ב- Redis לקבל אותו משם, ובמידה שלא, להריץ את השאילתה, להחזיר את התוצאות ולשמור ב- Redis:

DECLARE @result int

EXEC @result = [redisql].GetSetStoredRowset

        @host = N'localhost',

        @port = 6379,

        @key = 'RowsetKey24fg545',

        @query = N'SELECT * FROM INFORMATION_SCHEMA.ROUTINES'

PRINT @result

ה- Return value יספר לנו האם המידע הגיע מ-redis (ערך גדול מ-0 שייצג את מספר השורות שחזרו) או שלא היה קיים מפתח בשם הזה ב- Redis והשאילתה הורצה מול SQL Server (והתוצאה נשמרה ל- Redis).

איך מורידים ומתקינים?

RediSql ניתן להורדה בחינם מכאן. הוראות ההתקנה מופיעות בעמוד, אבל בגדול כל מה שצריך לעשות זה להוריד את הקובץ ZIP, לקחת את הקובץ install.sql, לשנות בשורה הראשונה לשם ה-DB שלכם (איפה שכתוב לשנות) ולהריץ את זה מול ה-DB שלכם, למשל דרך SSMS.

לאחר ההורדה מומלץ להסתכל בקובץ BasicUsageSample.sql שב-ZIP לדוגמאות. ניתן לראות דוגמאות נוספות כאן, או לקרוא את התיעוד של כלל הפונקציות וה- stored procedures .

מדובר בגרסא ראשונה, ככה שכמובן ייתכנו באגים. מוזמנים במידה שיש באגים לדווח.

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *

2 תגובות

  1. Pingback: SQL: להפוך XML במבנה לא ידוע (חלקית) לתצוגה טבלאית | שחר.נט

  2. Pingback: ייצור אוטומטי של סקריפטי התקנה והסרה של SQL CLR Functions / Stored Procedures | שחר.נט