מדריך למטמון באביב

1. הפשטת המטמון?

במאמר זה אנו נראה כיצד לעשות זאת השתמש בהפשטת המטמון באביב - ובאופן כללי, שפר את ביצועי המערכת שלך.

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

2. תחילת העבודה

הפשטת המטמון המרכזית שמספק ספרינג שוכנת ב אביב-הקשר מודול. לכן, כאשר משתמשים ב- Maven, שלנו pom.xml צריך להכיל את התלות הבאה:

 org.springframework spring-context 5.2.8.RELEASE 

מעניין שיש מודול נוסף בשם אביב-תמיכה בהקשר, היושב על גבי אביב-הקשר מודול ומספק עוד כמה CacheManagers מגובה על ידי אנשים כמו EhCache או קפאין. אם אתה מתכוון להשתמש בהם כאחסון המטמון שלך, השתמש ב- אביב-תמיכה בהקשר מודול במקום:

 org.springframework spring-context-support 5.2.8.RELEASE 

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

2.1. מגף אביב

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

 org.springframework.boot spring-boot-starter-cache 2.3.3.RELEASE 

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

3. אפשר שמירה

כדי לאפשר אחסון במטמון, Spring עושה שימוש טוב בהערות, בדומה להפעלת כל תכונה אחרת ברמת התצורה במסגרת.

ניתן להפעיל את תכונת המטמון באופן הצהרתי על ידי הוספת ה- @EnableCaching ביאור לכל אחד משיעורי התצורה:

@Configuration @EnableCaching מחלקה ציבורית CachingConfig {@Bean CacheManager public cacheManager () {להחזיר ConcurrentMapCacheManager חדש ("כתובות"); }}

אתה יכול, כמובן, אפשר ניהול מטמון באמצעות XML תצורה גם כן:

הערה: לאחר שנאפשר שמירה במטמון - לצורך ההתקנה המינימלית - עלינו לרשום א cacheManager.

3.1. שימוש במגף אביב

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

כמו כן, אנו יכולים להתאים אישית את התצורה המוגדרת אוטומטית CacheManager באמצעות אחד או יותר CacheManagerCustomizer שעועית:

מחלקה ציבורית @Component SimpleCacheCustomizer מיישם CacheManagerCustomizer {@Override public void customize (ConcurrentMapCacheManager cacheManager) {cacheManager.setCacheNames (asList ("משתמשים", "עסקאות")); }}

ה CacheAutoConfiguration התצורה האוטומטית אוספת את ההתאמה האישית הזו ומחילה אותם על הנוכחי CacheManager לפני האתחול המלא שלו.

4. השתמש במטמון עם הערות

לאחר שהפעלנו מטמון, השלב הבא הוא לאגד את התנהגות המטמון לשיטות באמצעות הערות הצהרות.

4.1. @ניתן למטמון

הדרך הפשוטה ביותר לאפשר התנהגות מטמון לשיטה היא לתחום אותה @Cacheable ולפרמט אותו עם שם המטמון בו יאוחסנו התוצאות:

@Cacheable ("כתובות") ציבורי מחרוזת getAddress (לקוח לקוח) {...} 

ה getAddress () שיחה תחילה תבדוק את המטמון כתובות לפני שמפעילים בפועל את השיטה ואז מאחסנים את התוצאה במטמון.

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

@Cacheable ({"כתובות", "ספריה"}) מחרוזת getAddress (לקוח לקוח) {...}

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

4.2. @CacheEvict

עכשיו, מה תהיה הבעיה בהכנת כל השיטות @Cacheable?

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

ה @CacheEvict הערה משמשת כדי לציין את הסרת אחד או יותר / כל הערכים - כך שניתן יהיה לטעון שוב ערכים חדשים למטמון:

@CacheEvict (value = "addresses", allEntries = true) ציבורי מחרוזת getAddress (לקוח לקוח) {...}

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

4.3. @CachePut

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

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

עם ה @CachePut ביאור, באפשרותך לעדכן את תוכן המטמון מבלי להפריע לביצוע השיטה. כלומר, השיטה תמיד תבוצע והתוצאה תישמר במטמון.

@CachePut (value = "addresses") ציבורי מחרוזת getAddress (לקוח לקוח) {...}

ההבדל בין @Cacheable ו @CachePut האם זה @Cacheable רָצוֹן דלג על הפעלת השיטה, ואילו @CachePut רָצוֹן למעשה להפעיל את השיטה ואז הכניס את התוצאות למטמון.

4.4. @מטמון

מה אם ברצונך להשתמש בהערות מרובות מאותו סוג לצורך אחסון במטמון בשיטה. עיין בדוגמה השגויה למטה:

@CacheEvict ("כתובות") @ CacheEvict (value = "directory", key = customer.name) ציבורי מחרוזת getAddress (לקוח לקוח) {...}

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

הפיתרון לסוגיה שלעיל יהיה:

@Caching (evict = {@CacheEvict ("Addresses)), @CacheEvict (value =" directory ", key =" # customer.name ")}) ציבורי מחרוזת getAddress (לקוח לקוח) {...}

כפי שמוצג בקטע הקוד שלמעלה, אתה יכול קבץ הערות מטמון מרובות עם @ מטמון, והשתמש בו ליישום הגיון המטמון המותאם אישית שלך.

4.5. @CacheConfig

עם ה @CacheConfig ביאור, אתה יכול לייעל חלק מתצורת המטמון למקום אחד - ברמת הכיתה - כדי שלא תצטרכו להכריז על הדברים מספר פעמים:

@CacheConfig (cacheNames = {"addresses"}) CustomerDataService במחלקה ציבורית {@Cacheable public String getAddress (לקוח לקוח) {...}

5. אחסון במטמון מותנה

לפעמים מטמון לא יכול לעבוד טוב בשיטה בכל המצבים.

לדוגמא - שימוש חוזר בדוגמה שלנו מה- @CachePut ביאור - זה גם יבצע את השיטה וגם יאחסן את התוצאות בכל פעם:

@CachePut (value = "addresses") ציבורי מחרוזת getAddress (לקוח לקוח) {...} 

5.1. פרמטר מצב

עכשיו - אם אנחנו רוצים שליטה רבה יותר מתי ההערה פעילה - @CachePut ניתן לבצע פרמטריה עם פרמטר תנאי שלוקח ביטוי SpEL כדי להבטיח שהתוצאות נשמרות במטמון בהתבסס על הערכת הביטוי הזה:

@CachePut (value = "addresses", condition = "# customer.name == 'Tom'") ציבורי מחרוזת getAddress (לקוח לקוח) {...}

5.2. אלא אם כן פרמטר

אנחנו יכולים גם לשלוט במטמון מבוסס על פלט השיטה ולא על הקלט - דרך אֶלָא אִם פָּרָמֶטֶר:

@CachePut (value = "addresses", אלא אם כן = "# result.length () <64") ציבורי מחרוזת getAddress (לקוח לקוח) {...}

ההערה שלעיל תאחסן מטמון כתובות אלא אם כן הן קצרות מ- 64 תווים.

חשוב לדעת כי ה מַצָב ו אֶלָא אִם ניתן להשתמש בפרמטרים בשילוב עם כל הערות המטמון.

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

6. מטמון מבוסס הצהרה מבוסס XML

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

הנה תצורת ה- XML ​​שלנו:

7. המטמון מבוסס Java

והנה תצורת Java המקבילה:

@Configuration @EnableCaching מחלקה ציבורית CachingConfig {@Bean CacheManager ציבורי cacheManager () {SimpleCacheManager cacheManager = SimpleCacheManager חדש (); cacheManager.setCaches (Arrays.asList (ConcurrentMapCache חדש ("ספריה"), ConcurrentMapCache חדש ("כתובות"))); החזר cacheManager; }}

והנה שלנו CustomerDataService:

מחלקה ציבורית @Component CustomerDataService {@Cacheable (value = "addresses", key = "# customer.name") public String getAddress (לקוח לקוח) {return customer.getAddress (); }}

8. סיכום

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

היישום המלא של מאמר זה נמצא בפרויקט GitHub.


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