JavaScript Object Notation (JSON) מספק דרך יעילה לאחסון נתונים מובְנים ולביצוע מניפולציות עליהם ב-Memorystore for Valkey. שימוש ב-JSON מספק את היתרונות הבאים:
- אפשרויות חיפוש וסינון מהירות
- ביצוע עדכונים במקום לנתוני JSON בלי צורך להחליף מסמכים שלמים
- ביצוע שאילתות, שינוי וניהול של מבני נתונים מורכבים ביעילות
אם האפליקציות שלכם דורשות אחסון נתונים דינמי וגמיש, JSON הוא הפתרון האידיאלי בשבילכם. בנוסף, באמצעות JSON, אפשר לקודד מערכי נתונים מורכבים בתוך מופעים של Memorystore for Valkey בלי להשתמש בסכימות. אתם יכולים לאחסן נתונים במופעים, לגשת אליהם ולעדכן אותם, ולא צריך לנהל קוד בהתאמה אישית כדי לבצע סריאליזציה ודה-סריאליזציה של הנתונים.
מסמך JSON הוא פורמט טקסט שקריא לאנשים, שמשמש לאחסון ולהעברה של נתונים. הפורמט הזה מורכב מזוגות של מפתח-ערך ומסוגי נתונים מובְנים. פורמט JSON מאפשר לאחזר ולעדכן חלקים ממסמך JSON בלי צורך לשנות את כל האובייקט. כך אפשר לשפר את הביצועים ולהפחית את העלויות. בנוסף, פורמט JSON תואם ל-RFC 7159, לתקן ECMA-404 להחלפת נתונים ב-JSON ול-UTF-8 Unicode בטקסט JSON.
זמינות
אם יוצרים מופע של Memorystore for Valkey, גרסה 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 Valkey:
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 Valkey
תומך בפקודות המשנה הבאות:
|
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 Valkey פועל עם JSON
בקטע הזה מוסבר איך Memorystore for Valkey יוצר אינטראקציה עם סוג הנתונים JSON.
כמה ביטויי תנאי
אם יש כמה ביטויי סינון מותנים, Memorystore for Valkey מעריך אותם בסדר הבא:
- פעולות בתוך סוגריים
- הביטוי הלוגי
AND(&&) - הביטוי הלוגי
OR(||)
המגבלה המקסימלית של עומק הקינון
כשבאובייקט או במערך JSON יש רכיב שהוא אובייקט או מערך JSON אחר, האובייקט או המערך הפנימיים מוטמעים באובייקט או במערך החיצוניים. המגבלה המקסימלית של עומק הקינון היא 128. לכן, ערך כמו $.a.b.c.d... יכול להגיע רק ל-128
רמות.
אם תנסו ליצור מסמך JSON עם עומק קינון גדול מ-128, המערכת של Memorystore for Valkey תדחה את המסמך ותקבלו שגיאה. עם זאת, אפשר לשנות את ההגבלה הזו באמצעות הפקודה CONFIG SET json.max-path-limit VALUE, כאשר VALUE הוא מגבלת העומק הרצויה.
מספרי JSON
ב-JSON, גם מספרים עם נקודה עשרונית וגם מספרים שלמים נקראים מספרים כי יש להם את אותו סוג נתונים. כש-Memorystore for Valkey מקבל מספר JSON, הוא ממיר את המספר לאחד מהייצוגים הבינאריים הפנימיים הבאים:
- מספר בשיטת נקודה צפה (floating-point) עם דיוק כפול של IEEE 64 ביט
- מספר שלם ב-64 סיביות עם סימן
פורמט JSON לא שומר את המחרוזת המקורית ואת כל העיצוב שלה. כש-Memorystore for Valkey מוציא מספר כחלק מתגובת JSON, הוא ממיר את המספר מהייצוג הבינארי הפנימי למחרוזת שניתנת להדפסה, באמצעות כללי עיצוב גנריים.
כשמשתמשים בפקודות JSON.NUMINCRBY ו-JSON.NUMMULTBY עם מספרים בפורמט JSON, התנאים הבאים חלים:
- אם שני המספרים הם מספרים שלמים והתוצאה היא מחוץ לטווח של
int64, התוצאה הופכת אוטומטית למספר נקודה צפה של 64 ביט IEEE בדיוק כפול. - אם לפחות אחד מהמספרים הוא מספר נקודה צפה, התוצאה היא מספר נקודה צפה של 64 ביט עם דיוק כפול לפי IEEE.
- אם התוצאה חורגת מהטווח של מספר נקודה צפה עם דיוק כפול של 64 ביט לפי IEEE, תוצג הודעת השגיאה
OVERFLOW.
מערכים ישירים
Memorystore for Valkey מסנן ישירות אובייקטים של מערכים. לדוגמה, אם יש לכם נתונים כמו
[0,1,2,3] ושאילתת נתיב כמו $[?(@<3)], אז Memorystore for Valkey מחזיר 0,1,2]
[. אם יש לכם נתונים כמו {"my_valkey_key":[0,1,2,3]} ושאילתת נתיב כמו
$.my_valkey_key[?(@<3)], אז Memorystore for Valkey מחזיר גם 0,1,2 ]
[.
אינדקסים של מערכים
ב-Memorystore for Valkey אפשר להשתמש באינדקסים חיוביים ושליליים למערכים. התנאים הבאים חלים על סוגי האינדקסים האלה:
- אינדקס חיובי: המספרים מתחילים בתחילת המערך. לדוגמה, אם למערך יש אינדקס חיובי של שלוש, אז 0 שולף את הרכיב הראשון, 1 שולף את הרכיב השני ו-2 שולף את הרכיב השלישי.
- אינדקס שלילי: המספרים מתחילים בסוף המערך. אם למערך יש אינדקס שלילי של שלוש, אז -1 מחזיר את הרכיב השלישי, -2 מחזיר את הרכיב השני ו-3 מחזיר את הרכיב הראשון.
ב-Memorystore for Valkey, המערכת לא מעגלת את האינדקסים כלפי מעלה או כלפי מטה. אם יש לכם מערך באורך 3, ואתם קוראים לאינדקס חיובי שגדול מ-3 או לאינדקס שלילי שקטן מ-3-, Memorystore for Valkey לא מחזיר תוצאה.
תחביר של נתיבי JSON
אי אפשר להשתמש בתחביר לא תקין בנתיבי ה-JSON. התנאי הזה חל גם אם קבוצת משנה של נתיב JSON עם תחביר לא תקין מכילה נתיב תקין.