חנות ערך מפתח עם מפת כרוניקה

1. סקירה כללית

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

2. מהי מפת כרוניקה?

בעקבות התיעוד, "מפת כרוניקה היא חנות ערך-מפתח מהירה במיוחד בזיכרון, שאינה חוסמת, המיועדת ליישומים בעלי זמן אחזור נמוך ו / או רב-תהליכים".

בקצרה, זו חנות ערכי מפתח מחוץ לערמה. המפה אינה דורשת כמות גדולה של זיכרון RAM כדי שתוכל לתפקד כראוי. זה יכול לצמוח על בסיס קיבולת הדיסק הזמינה. יתר על כן, הוא תומך בשכפול הנתונים בהתקנת שרת רב-מאסטר.

בואו נראה כעת כיצד אנו יכולים להגדיר ולעבוד איתו.

3. תלות של Maven

כדי להתחיל, נצטרך להוסיף את התלות במפה הכרוניקה לפרויקט שלנו:

 מפת כרוניקה של net.openhft 3.17.2 

4. סוגי מפת כרוניקה

אנו יכולים ליצור מפה בשתי דרכים: כמפה בזיכרון או כמפה קבועה.

בואו נראה את שני אלה בפירוט.

4.1. מפת זיכרון

מפת כרוניקה בזיכרון היא חנות מפות שנוצרת בזיכרון הפיזי של השרת. זה אומר זה נגיש רק בתהליך JVM שבו נוצרת חנות המפות.

בואו נראה דוגמה מהירה:

ChronicleMap inMemoryCountryMap = ChronicleMap .of (LongValue.class, CharSequence.class) .name ("map-map"). כניסות (50) .averageValue ("אמריקה") .create ();

לשם הפשטות, אנו יוצרים מפה המאחסנת 50 מזהי מדינה ושמותיהם. כפי שניתן לראות בקטע הקוד, היצירה די פשוטה למעט ה- ערך ממוצע() תְצוּרָה. זה אומר למפה להגדיר את המספר הממוצע של בתים שנלקחו על ידי ערכי הזנת מפה.

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

דבר אחד עלינו לציין כשמדובר במפת הזיכרון הוא שהנתונים נגישים רק כאשר תהליך ה- JVM חי. הספרייה תנקה את הנתונים עם סיום התהליך.

4.2. מפה מתמשכת

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

ChronicleMap persistedCountryMap = ChronicleMap .of (LongValue.class, CharSequence.class) .name ("map-country"). כניסות (50) .averageValue ("אמריקה") .createPersistedTo (קובץ חדש (System.getProperty ("user.home) ") +" /country-details.dat "));

פעולה זו תיצור קובץ בשם country-details.dat בתיקיה שצוינה. אם קובץ זה כבר זמין בנתיב שצוין, יישום הבונה יפתח קישור למאגר הנתונים הקיים מתהליך JVM זה.

אנו יכולים להשתמש במפה המתמשכת במקרים בהם אנו רוצים:

  • לשרוד מעבר לתהליך היוצר; למשל, לתמיכה בפריסה מחודשת של יישומים
  • להפוך אותו לגלובלי בשרת; למשל, כדי לתמוך בגישה מרובה של תהליכים במקביל
  • לפעול כחנות נתונים שנשמור בדיסק

5. תצורת גודל

חובה להגדיר את הערך הממוצע והמפתח הממוצע בעת יצירת מפת כרוניקה, למעט במקרה בו סוג המפתח / הערך שלנו הוא ממשק פרימיטיבי מסומן או ממשק ערך. בדוגמה שלנו, איננו מגדירים את המפתח הממוצע מאז סוג המפתח LongValue הוא ממשק ערכי.

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

  • ערך ממוצע() - נקבע הערך שממנו נקבע המספר הממוצע של בתים שיוקצה לערך של רשומת מפה
  • averageValueSize () - המספר הממוצע של בתים שיוקצה לערך של רשומת מפה
  • constantValueSizeBySample () - מספר הבתים שיוקצה לערך ערך ערך במפה כאשר גודל הערך תמיד זהה
  • averageKey () - נקבע המפתח שממנו נקבע המספר הממוצע של בתים שיוקצו למפתח ערך רשומה
  • averageKeySize () - המספר הממוצע של בתים שיוקצו למפתח ערך רשומה במפה
  • constantKeySizeBySample () - מספר הבתים שיוקצה למפתח של כניסה במפה כאשר גודל המפתח תמיד זהה

6. סוגי מפתח וערך

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

להלן כמה מהסוגים המומלצים:

  • ערך ממשקים
  • כל יישום בכיתה Byteable ממשק מ- Chronicle Bytes
  • כל יישום בכיתה BytesMarshallable ממשק מ- Chronicle Bytes; בכיתת היישום צריך להיות בנאי ציבורי ללא טענות
  • בתים [] ו ByteBuffer
  • CharSequence, חוּט, ו StringBuilder
  • מספר שלם, ארוך, ו לְהַכפִּיל
  • כל יישום בכיתה java.io. ניתן להחצנה; בכיתת היישום צריך להיות בנאי ציבורי ללא טענות
  • כל סוג שמיישם java.io ניתן להתבצע באמצעות סריאליזציה, כולל סוגים פרימיטיביים ממוסגרים (למעט אלה המפורטים לעיל) וסוגי מערכים
  • כל סוג אחר, אם מסופקים סדרות מותאמות אישית

7. שאילתת מפת כרוניקה

מפת כרוניקה תומכת בשאילתות בעלות מפתח יחיד וכן בשאילתות רב-מפתח.

7.1. שאילתות עם מפתח יחיד

שאילתות עם מפתח יחיד הן הפעולות העוסקות במפתח יחיד. ChronicleMap תומך בכל הפעולות מה- Java מַפָּה ממשק ו ConcurrentMap מִמְשָׁק:

LongValue qatarKey = Values.newHeapInstance (LongValue.class); qatarKey.setValue (1); inMemoryCountryMap.put (qatarKey, "קטאר"); // ... מדינה CharSequence = inMemoryCountryMap.get (מפתח);

בנוסף לפעולות ההגעה וההרגילה הרגילות, ChronicleMap מוסיף מבצע מיוחד, getUsing (), שמקטין את טביעת הרגל בזיכרון בזמן אחזור ועיבוד של ערך. בואו נראה את זה בפעולה:

מפתח LongValue = Values.newHeapInstance (LongValue.class); מדינה StringBuilder = StringBuilder חדש (); key.setValue (1); persistedCountryMap.getUsing (מפתח, מדינה); assertThat (country.toString (), הוא (שווה ל- ("רומניה"))); key.setValue (2); persistedCountryMap.getUsing (מפתח, מדינה); assertThat (country.toString (), is (equalTo ("הודו")));

כאן השתמשנו באותו דבר StringBuilder אובייקט לאחזור ערכים של מקשים שונים על ידי העברתו אל ה- getUsing () שיטה. זה בעצם עושה שימוש חוזר באותו אובייקט לצורך אחזור ערכים שונים. במקרה שלנו, getUsing () שיטה שווה ערך ל:

country.setLength (0); country.append (persistedCountryMap.get (מפתח));

7.2. שאילתות מרובות-מפתח

יתכנו מקרי שימוש בהם עלינו להתמודד עם מספר מקשים בו זמנית. לשם כך, אנו יכולים להשתמש ב- queryContext () פונקציונליות. ה queryContext () השיטה תיצור הקשר לעבודה עם רשומת מפה.

בואו ניצור תחילה מולטימפה ונוסיף לה כמה ערכים:

הגדר ממוצע-ערך = IntStream.of (1, 2) .boxed (). Collect (Collectors.toSet ()); ChronicleMap multiMap = ChronicleMap .of (Integer.class, (Class) (Class) Set.class) .name ("multi-map"). Entries (50) .averageValue (averageValue) .create (); הגדר set1 = HashSet חדש (); set1.add (1); set1.add (2); multiMap.put (1, set1); הגדר set2 = HashSet חדש (); set2.add (3); multiMap.put (2, set2);

כדי לעבוד עם מספר ערכים, עלינו לנעול את הערכים הללו כדי למנוע חוסר עקביות שעלול להתרחש עקב עדכון מקביל:

נסה (ExternalMapQueryContext var13 -> fistContext = multiMap.queryContext (1)) {נסה (ExternalMapQueryContext var13 -> secondContext = multiMap.queryContext (2)) {fistContext.updateLock (). lock (); secondContext.updateLock (). lock (); MapEntry firstEntry = fistContext.entry (); הגדר firstSet = firstEntry.value (). Get (); firstSet.remove (2); MapEntry secondEntry = secondContext.entry (); הגדר secondSet = secondEntry.value (). Get (); secondSet.add (4); firstEntry.doReplaceValue (fistContext.wrapValueAsData (firstSet)); secondEntry.doReplaceValue (secondContext.wrapValueAsData (secondSet)); }} לבסוף {assertThat (multiMap.get (1) .size (), is (equalTo (1))); assertThat (multiMap.get (2). גודל (), הוא (שווה ל- (2))); }

8. סגירת מפת הכרוניקה

עכשיו כשסיימנו לעבוד עם המפות שלנו, בואו נקרא סגור() השיטה במפה שלנו מתנגדת לשחרור הזיכרון מחוץ לערמה והמשאבים הקשורים אליו:

persistedCountryMap.close (); inMemoryCountryMap.close (); multiMap.close ();

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

9. מסקנה

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

את כל הדוגמאות שדנו כאן ניתן למצוא בפרויקט Github.


$config[zx-auto] not found$config[zx-overlay] not found