מבוא ל- Jedis - ספריית הלקוחות של Java Redis

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

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

ראשית, אנו נסביר באילו מצבים ג'דיס מועיל ובמה מדובר.

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

2. מדוע ג'דיס?

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

לשני הלקוחות הללו יש כמה מאפיינים ייחודיים כמו בטיחות חוטים, טיפול בחיבור מחדש שקוף ו- API אסינכרוני, שלג'דיס חסרים כל התכונות.

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

3. תלות Maven

נתחיל בהכרזה על התלות היחידה שנצטרך בה pom.xml:

 redis.clients jedis 2.8.1 

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

4. התקנת רדיס

יהיה עליך להתקין ולהפעיל את אחת הגרסאות האחרונות של Redis. אנו מריצים את הגרסה היציבה האחרונה ברגע זה (3.2.1), אך כל גרסת פוסט 3.x צריכה להיות בסדר.

מצא כאן מידע נוסף על Redis עבור Linux ו- Macintosh, ויש להם שלבי התקנה בסיסיים דומים מאוד. חלונות אינם נתמכים רשמית, אך נמל זה מתוחזק היטב.

לאחר מכן אנו יכולים לצלול ישירות ולהתחבר אליו מקוד ה- Java שלנו:

ג'דיס ג'דיס = ג'דיס חדש ();

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

5. מבני נתונים של רדיס

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

5.1. מיתרים

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

jedis.set ("אירועים / עיר / רומא", "32,15,223,828"); מחרוזת cachedResponse = jedis.get ("אירועים / עיר / רומא");

המשתנה cachedResponse יחזיק את הערך 32,15,223,828. יחד עם תמיכת תפוגה, שנדון בהמשך, היא יכולה לעבוד כשכבת מטמון מהירה וברק לשימוש לבקשות HTTP המתקבלות ביישום האינטרנט שלך ולדרישות מטמון אחרות.

5.2. רשימות

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

jedis.lpush ("תור # משימות", "FirstTask"); jedis.lpush ("משימות מספר תור", "משימה שנייה"); משימת מחרוזת = jedis.rpop ("תור # משימות");

המשתנה מְשִׁימָה יחזיק את הערך firstTask. זכור כי אתה יכול לסדר כל אובייקט ולהחזיק אותו כמחרוזת, כך שהודעות בתור יכולות לשאת נתונים מורכבים יותר בעת הצורך.

5.3. סטים

ערכות Redis הן אוסף מחרוזות לא מסודר אשר שימושי כאשר ברצונך לא לכלול חברים חוזרים:

jedis.sadd ("כינויים", "כינוי מספר 1"); jedis.sadd ("כינויים", "כינוי מספר 2"); jedis.sadd ("כינויים", "כינוי מספר 1"); הגדר כינויים = jedis.smembers ("כינויים"); בוליאני קיים = jedis.sismember ("כינויים", "כינוי מספר 1");

ערכת ג'אווה כינויים יהיה בגודל 2, התוספת השנייה של כינוי מספר 1 התעלם. וגם ה קיים למשתנה יהיה ערך של נָכוֹן, השיטה סיסמבר מאפשר לך לבדוק את קיומו של חבר מסוים במהירות.

5.4. האש

רדיס האש ממפות בין חוּט שדות ו חוּט ערכים:

jedis.hset ("משתמש מספר 1", "שם", "פיטר"); jedis.hset ("משתמש מספר 1", "עבודה", "פוליטיקאי"); שם מחרוזת = jedis.hget ("משתמש מספר 1", "שם"); שדות מפה = jedis.hgetAll ("משתמש מספר 1"); מחרוזת עבודה = fields.get ("עבודה");

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

5.5. סטים ממוינים

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

ציוני מפה = HashMap חדש (); scores.put ("PlayerOne", 3000.0); scores.put ("PlayerTwo", 1500.0); scores.put ("PlayerThree", 8200.0); scores.entrySet (). forEach (playerScore -> {jedis.zadd (key, playerScore.getValue (), playerScore.getKey ());}); נגן מחרוזת = jedis.zrevrange ("דירוג", 0, 1). כיתוב (). הבא (); דרגה ארוכה = jedis.zrevrank ("דירוג", "PlayerOne");

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

6. עסקאות

עסקאות מבטיחות פעולות בטיחות אטומיות וחוטים, מה שאומר שבקשות מלקוחות אחרים לעולם לא יטופלו במקביל במהלך עסקאות Redis:

מחרוזת friendsPrefix = "חברים #"; מחרוזת userOneId = "4352523"; מחרוזת userTwoId = "5552321"; עסקה t = jedis.multi (); t.sadd (friendsPrefix + userOneId, userTwoId); t.sadd (friendsPrefix + userTwoId, userOneId); למשל ();

אתה יכול אפילו להפוך את הצלחת העסקה לתלויה במפתח ספציפי על ידי "צפייה" בה ממש לפני שאתה מייצר את התהליך שלך עִסקָה:

jedis.watch ("חברים # נמחקו #" + userOneId);

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

7. צנרת

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

מחרוזת userOneId = "4352523"; מחרוזת userTwoId = "4849888"; צינור p = jedis.pipelined (); p.sadd ("חיפש #" + userOneId, "פריז"); p.zadd ("דירוג", 126, userOneId); p.zadd ("דירוג", 325, userTwoId); תגובה pipeExists = p.sismember ("חיפש #" + userOneId, "פריז"); תְגוּבָה pipeRanking = p.zrange ("דירוג", 0, -1); p.sync (); מחרוזת קיימת = pipeExists.get (); הגדר דירוג = pipeRanking.get ();

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

8. פרסם / עשה מנוי

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

8.1. מָנוּי

הירשם והאזין להודעות שנשלחו לערוץ:

ג'דיס jSubscriber = ג'דיס חדש (); jSubscriber.subscribe (חדש JedisPubSub () {@ ביטול ציבורי בטל ב- Message (ערוץ מחרוזת, הודעת מחרוזת) {// טיפול בהודעה}}, "ערוץ");

הרשמה היא שיטת חסימה, יהיה עליך לבטל את הרישום ל- JedisPubSub בִּמְפוּרָשׁ. עקפנו את onMessage שיטה, אך קיימות שיטות שימושיות רבות יותר לביטול.

8.2. מוֹצִיא לָאוֹר

ואז פשוט שלח הודעות לאותו ערוץ משרשור המפרסם:

ג'דיס jPublisher = ג'דיס חדש (); jPublisher.publish ("ערוץ", "הודעת בדיקה");

9. איגום חיבורים

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

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

בואו ניצור את JedisPool:

סופי JedisPoolConfig poolConfig = buildPoolConfig (); JedisPool jedisPool = JedisPool חדש (poolConfig, "localhost"); פרטי JedisPoolConfig buildPoolConfig () {final JedisPoolConfig poolConfig = JedisPoolConfig חדש (); poolConfig.setMaxTotal (128); poolConfig.setMaxIdle (128); poolConfig.setMinIdle (16); poolConfig.setTestOnBorrow (נכון); poolConfig.setTestOnReturn (נכון); poolConfig.setTestWhileIdle (נכון); poolConfig.setMinEvictableIdleTimeMillis (Duration.ofSeconds (60) .toMillis ()); poolConfig.setTimeBetweenEvictionRunsMillis (Duration.ofSeconds (30) .toMillis ()); poolConfig.setNumTestsPerEvictionRun (3); poolConfig.setBlockWhenExhausted (נכון); להחזיר poolConfig; }

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

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

נסה (Jedis jedis = jedisPool.getResource ()) {// בצע פעולות עם משאב jedis}

השתמשנו בהצהרת Java try-with-resources כדי למנוע צורך לסגור ידנית את משאב Jedis, אך אם אינך יכול להשתמש בהצהרה זו תוכל גם לסגור את המשאב באופן ידני ב סוף כל סוף סָעִיף.

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

10. אשכול רדיס

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

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

נסה (JedisCluster jedisCluster = JedisCluster חדש (HostAndPort חדש ("localhost", 6379))) {// השתמש במשאב jedisCluster כאילו היה מדובר במשאב רגיל של Jedis} (IOException e) {}

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

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

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

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

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

11. מסקנה

הרוב המכריע של הפיצ'רים של Redis זמינים כבר ב- Jedis והפיתוח שלה מתקדם בקצב טוב.

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

אתה יכול למצוא דוגמאות קוד בפרויקט GitHub.


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