JavaScript Object Notation (JSON) מספק דרך יעילה לאחסון נתונים מובְנים ולביצוע מניפולציות עליהם ב-Memorystore for Redis Cluster. שימוש ב-JSON מספק את היתרונות הבאים:
- אפשרויות חיפוש וסינון מהירות
- ביצוע עדכונים במקום לנתוני JSON בלי צורך להחליף מסמכים שלמים
- ביצוע שאילתות, שינוי וניהול של מבני נתונים מורכבים ביעילות
אם האפליקציות שלכם דורשות אחסון נתונים דינמי וגמיש, JSON הוא הבחירה האידיאלית בשבילכם. בנוסף, באמצעות JSON, אפשר לקודד מערכי נתונים מורכבים בתוך אשכולות ב-Memorystore for Redis Cluster בלי להשתמש בסכימות. אתם יכולים לאחסן נתונים באשכולות, לגשת אליהם ולעדכן אותם, ולא צריך לנהל קוד בהתאמה אישית כדי לבצע סריאליזציה ודה-סריאליזציה של הנתונים.
מסמך JSON הוא פורמט טקסט שקריא לאנשים, שמשמש לאחסון ולהעברה של נתונים. הפורמט הזה מורכב מזוגות של מפתח-ערך ומסוגי נתונים מובְנים. פורמט JSON מאפשר לאחזר ולעדכן חלקים ממסמך JSON בלי צורך לשנות את כל האובייקט. כך אפשר לשפר את הביצועים ולהפחית את העלויות. בנוסף, פורמט JSON תואם ל-RFC 7159, לתקן ECMA-404 להחלפת נתונים ב-JSON ול-UTF-8 Unicode בטקסט JSON.
זמינות
אם יוצרים אשכול ב-Memorystore for Redis Cluster, גרסה 8.0 ואילך, אז גרסה 1.0 של סוג הנתונים JSON והפקודות המשויכות זמינה באופן אוטומטי. סוג הנתונים הזה תואם ל-API של מודול JSON בגרסה 2. בנוסף, החל מ-RFC 7159, רכיב הבסיס של מסמך JSON יכול להיות מכל סוג נתונים של JSON.
מאפייני JSON
ל-JSON יש את המאפיינים הבאים:
גודל מסמך מקסימלי: כדי למנוע בעיות פוטנציאליות של חוסר זיכרון בגלל הוספות זדוניות או בלתי מוגבלות, אפשר להגדיר מגבלה על הגודל של מפתחות JSON בודדים.
כברירת מחדל, הערך של המאפיין הזה מוגדר ל-
0, כלומר אין הגבלה על גודל מסמך ה-JSON. כדי להגדיר את המגבלה הזו, משתמשים בפקודהCONFIG SET json.max-document-size VALUE, כאשר VALUE הוא הגודל המקסימלי של המסמך. לדוגמה, אם מציינים4123456, גודל המסמך המקסימלי הוא 4,123,456 בייטים (4MB).כדי לראות כמה זיכרון תופס ערך JSON שמאוחסן במפתח שצוין, אפשר להשתמש בפקודות
JSON.DEBUG MEMORY KEYאוMEMORY USAGE KEY. בפקודות האלה, KEY הוא שם המפתח שבו מאוחסן ערך ה-JSON.עומק מקסימלי: רמת הקינון המקסימלית לאובייקטים ולמערכים של JSON. מידע נוסף זמין במאמר בנושא מגבלת עומק הקינון המקסימלית.
גודל מסמך JSON
מסמך JSON נשמר באופן פנימי בפורמט שמיועד לגישה מהירה ולשינוי, ולכן סוג המסמך הזה יכול לצרוך הרבה זיכרון. כדי לבדוק כמה זיכרון תופס מסמך JSON, משתמשים בפקודה JSON.DEBUG MEMORY KEY, כאשר KEY הוא שם המפתח שמכיל את המסמך.
קטגוריות JSON
כדי לנהל את הגישה לפקודות JSON ולנתונים, משתמשים בקטגוריה @json. בנוסף לקטגוריה הזו, הקטגוריות הבאות משתמשות בפקודות JSON: @read, @write, @fast, @slow ו-@admin.
בטבלה הבאה מצוין אם אפשר למפות פקודות JSON לקטגוריות @read, @write, @fast, @slow, @admin ו-@json.
| פקודת JSON | @json |
@read |
@write |
@fast |
@slow |
@admin |
|---|---|---|---|---|---|---|
JSON.ARRAPPEND |
Y | N | Y | Y | N | N |
JSON.ARRINDEX |
Y | Y | N | Y | N | N |
JSON.ARRINSERT |
Y | N | Y | Y | N | N |
JSON.ARRLEN |
Y | Y | N | Y | N | N |
JSON.ARRPOP |
Y | N | Y | Y | N | N |
JSON.ARRTRIM |
Y | N | Y | Y | N | N |
JSON.CLEAR |
Y | N | Y | Y | N | N |
JSON.DEBUG |
Y | Y | N | N | Y | Y |
JSON.DEL |
Y | N | Y | Y | N | N |
JSON.FORGET |
Y | N | Y | Y | N | N |
JSON.GET |
Y | Y | N | Y | N | N |
JSON.MGET |
Y | Y | N | Y | N | N |
JSON.MSET |
Y | N | Y | N | Y | N |
JSON.NUMINCRBY |
Y | N | Y | Y | N | N |
JSON.NUMMULTBY |
Y | N | Y | Y | N | N |
JSON.OBJKEYS |
Y | Y | N | Y | N | N |
JSON.OBJLEN |
Y | Y | N | Y | N | N |
JSON.RESP |
Y | Y | N | Y | N | N |
JSON.SET |
Y | N | Y | N | Y | N |
JSON.STRAPPEND |
Y | N | Y | Y | N | N |
JSON.STRLEN |
Y | Y | N | Y | N | N |
JSON.TOGGLE |
Y | N | Y | Y | N | N |
JSON.TYPE |
Y | Y | N | Y | N | N |
מדדים בפורמט JSON
כדי לעקוב אחרי השימוש במסמכי JSON, מדדי Cloud Monitoring הבאים זמינים ב-Memorystore for Redis Cluster:
documents_countused_memory
מידע נוסף על המדדים האלה זמין במאמר בנושא מדדי JSON.
פקודות JSON
בקטע הזה מפורטות פקודות JSON שאפשר להשתמש בהן כדי לבצע פעולות במסמכי JSON, ומוסבר מה כל אחת מהן עושה.
| פקודה | תיאור |
|---|---|
JSON.ARRAPPEND |
הוספה של ערך JSON אחד או יותר למערך בנתיב. |
JSON.ARRINDEX |
חיפוש המופע הראשון של ערך JSON סקלרי במערך. |
JSON.ARRINSERT |
הוספה של ערך JSON אחד או יותר למערך בנתיב לפני האינדקס שצוין. |
JSON.ARRLEN |
שליפת האורך של מערך ה-JSON בנתיב. |
JSON.ARRPOP |
הסרה והחזרה של רכיב מאינדקס במערך. |
JSON.ARRTRIM |
חיתוך של מערך בנתיב כך שיכיל רק את טווח האלמנטים המצומצם שציינתם. |
JSON.CLEAR |
מחיקת המערכים או אובייקט JSON בנתיב שצוין. |
JSON.DEBUG |
אחזור מידע על מסמך JSON. Memorystore for Redis Cluster
תומך בפקודות המשנה הבאות:
|
JSON.DELJSON.FORGET |
מחיקת ערכי JSON בנתיב שאתם מציינים. |
JSON.GET |
הפונקציה מחזירה ערך בנתיב שאתם מציינים בפורמט JSON מסודר. |
JSON.MGET |
החזרת ערכים בנתיב שצוין מכמה מפתחות של מסמכים. |
JSON.MSET |
הגדרת כמה ערכי JSON בנתיב לכמה מפתחות. |
JSON.NUMINCRBY |
הגדלת ערכים מספריים שמאוחסנים בנתיב במספר שאתם מציינים. |
JSON.NUMMULTBY |
הכפלת ערכים מספריים שמאוחסנים בנתיב במספר שאתם מציינים. |
JSON.OBJKEYS |
אחזור שמות של מפתחות מאובייקטים מסוג JSON בנתיב שאתם מציינים. |
JSON.OBJLEN |
הפונקציה מאחזרת את מספר המפתחות באובייקט JSON בנתיב שאתם מציינים. |
JSON.RESP |
הפונקציה מחזירה את ערך ה-JSON של מפתח בפורמט Redis serialization protocol (RESP). |
JSON.SET |
הגדרת ערכי JSON בנתיב שאתם מציינים. |
JSON.STRAPPEND |
הוספת מחרוזת למחרוזות JSON בנתיב שאתם מציינים. |
JSON.STRLEN |
אחזור האורך של ערכי מחרוזת JSON בנתיב שאתם מציינים. |
JSON.TOGGLE |
החלפת ערך בוליאני בין true ל-false. הערך הזה מאוחסן בנתיב שאתם מציינים. |
JSON.TYPE |
אחזור הסוג של ערך JSON בנתיב שאתם מציינים. |
איך Memorystore for Redis Cluster פועל עם JSON
בקטע הזה מוסבר איך Memorystore for Redis Cluster פועל עם סוג הנתונים JSON.
כמה ביטויי תנאי
אם יש כמה ביטויים מותנים לסינון, המערכת של Memorystore for Redis Cluster מעריכה אותם בסדר הבא:
- פעולות בתוך סוגריים
- הביטוי הלוגי
AND(&&) - הביטוי הלוגי
OR(||)
המגבלה המקסימלית של עומק הקינון
כשבאובייקט או במערך JSON יש רכיב שהוא אובייקט או מערך JSON אחר, האובייקט או המערך הפנימיים מוטמעים באובייקט או במערך החיצוניים. המגבלה המקסימלית של עומק הקינון היא 128. לכן, ערך כמו $.a.b.c.d... יכול להגיע רק ל-128
רמות.
אם תנסו ליצור מסמך JSON עם עומק קינון גדול מ-128, מערכת Memorystore for Redis Cluster תדחה את המסמך ותקבלו שגיאה. עם זאת, אפשר לשנות את ההגבלה הזו באמצעות הפקודה CONFIG SET json.max-path-limit VALUE, כאשר VALUE הוא מגבלת העומק הרצויה.
מספרי JSON
ב-JSON, גם מספרים עשרוניים וגם מספרים שלמים נקראים מספרים כי יש להם את אותו סוג נתונים. כש-Memorystore for Redis Cluster מקבל מספר JSON, הוא ממיר את המספר לאחד מהייצוגים הבינאריים הפנימיים הבאים:
- מספר בשיטת נקודה צפה (floating-point) עם דיוק כפול של IEEE 64 ביט
- מספר שלם ב-64 סיביות עם סימן
פורמט JSON לא שומר את המחרוזת המקורית ואת כל העיצוב שלה. כש-Memorystore for Redis Cluster מוציא מספר כחלק מתגובת JSON, הוא ממיר את המספר מהייצוג הבינארי הפנימי למחרוזת שניתן להדפיס, שמשתמשת בכללי עיצוב כלליים.
כשמשתמשים בפקודות JSON.NUMINCRBY ו-JSON.NUMMULTBY עם מספרים בפורמט JSON, התנאים הבאים חלים:
- אם שני המספרים הם מספרים שלמים והתוצאה היא מחוץ לטווח של
int64, התוצאה הופכת אוטומטית למספר נקודה צפה של 64 ביט IEEE בדיוק כפול. - אם לפחות אחד מהמספרים הוא מספר נקודה צפה, התוצאה היא מספר נקודה צפה של 64 ביט עם דיוק כפול לפי IEEE.
- אם התוצאה חורגת מהטווח של מספר נקודה צפה עם דיוק כפול של 64 ביט לפי IEEE, תוצג הודעת השגיאה
OVERFLOW.
מערכים ישירים
מערך המסננים של Memorystore for Redis Cluster פועל ישירות על אובייקטים. לדוגמה, אם יש לכם נתונים כמו
[0,1,2,3] ושאילתת נתיב כמו$[?(@<3)], Memorystore for Redis Cluster מחזיר [0,1,2]. אם יש לכם נתונים כמו {"my_valkey_key":[0,1,2,3]} ושאילתת נתיב כמו
$.my_valkey_key[?(@<3)], Memorystore for Redis Cluster מחזיר גם [0,1,2].
אינדקסים של מערכים
ב-Memorystore for Redis Cluster אפשר להשתמש באינדקסים חיוביים ושליליים למערכים. התנאים הבאים חלים על סוגי האינדקסים האלה:
- אינדקס חיובי: המספרים מתחילים בתחילת המערך. לדוגמה, אם למערך יש אינדקס חיובי של שלוש, אז 0 שולף את הרכיב הראשון, 1 שולף את הרכיב השני ו-2 שולף את הרכיב השלישי.
- אינדקס שלילי: המספרים מתחילים בסוף המערך. אם למערך יש אינדקס שלילי של שלוש, אז -1 מחזיר את הרכיב השלישי, -2 מחזיר את הרכיב השני ו-3 מחזיר את הרכיב הראשון.
ב-Memorystore for Redis Cluster, המערכת לא מעגלת את האינדקסים כלפי מעלה או מטה. אם יש לכם מערך באורך 3, ואתם קוראים לאינדקס חיובי שגדול מ-3 או לאינדקס שלילי שקטן מ-3-, המערכת לא מחזירה תוצאה.
תחביר של נתיבי JSON
אי אפשר להשתמש בתחביר לא תקין בנתיבי ה-JSON. התנאי הזה חל גם אם קבוצת משנה של נתיב JSON עם תחביר לא תקין מכילה נתיב תקין.