EhCache είναι μια ευρέως χρησιμοποιούμενη, καθαρή προσωρινή μνήμη Java που μπορεί εύκολα να ενσωματωθεί με τα πιο δημοφιλή πλαίσια Java, όπως το Spring και το Hibernate. Συχνά θεωρείται η πιο βολική επιλογή για εφαρμογές Java, καθώς μπορεί να ενσωματωθεί εύκολα σε έργα. Συγκεκριμένα:
Εν ολίγοις, το EhCache είναι μια εξαιρετική επιλογή για οποιαδήποτε εφαρμογή καθαρού Java.
Επιπροσθέτως, Εαρινοί σχολιασμοί EhCache επιτρέπει την απρόσκοπτη ενσωμάτωση σε οποιαδήποτε εφαρμογή Spring προσθέτοντας απλώς σχολιασμούς σε προσωρινά αποθηκευμένες μεθόδους, χωρίς τροποποίηση των εφαρμογών της μεθόδου
Ενώ το EhCache παρέχει εμπλουτισμένα, πλούσια API για χειρισμό της προσωρινής μνήμης μέσω προγραμματισμού, αυτό το άρθρο επικεντρώνεται κυρίως ενισχύοντας τις εαρινές σας εφαρμογές με λιγότερο ενοχλητικό τρόπο με τους εαρινούς σχολιασμούς EhCache. Θα δημιουργήσουμε ένα έργο Spring MVC και θα αναπτύξουμε μια υπηρεσία ιστού RESTful στο Tomcat. Στη συνέχεια, το EhCache θα ενσωματωθεί στην υπηρεσία διαδικτύου.
Θα παρουσιάσουμε τους σχολιασμούς EhCache στο πλαίσιο ενός παραδείγματος έργου. Θα δημιουργήσουμε ένα Ανοιξη Υπηρεσία Ιστού βασισμένη σε MVC που φιλοξενείται σε ένα Tomcat 8 υπηρέτης.
Έχω αναπτύξει το έργο στο Eclipse, το οποίο μπορεί να εγκατασταθεί σύμφωνα με τις οδηγίες εδώ .
gulp concat και minify js
Μπορείτε να κατεβάσετε την τελευταία σταθερή έκδοση του Tomcat, Tomcat 8 εδώ .
Φυσικά, αυτές οι συγκεκριμένες πλατφόρμες δεν αποτελούν προϋπόθεση για το EhCache. μπορείτε πάντα να επιλέξετε το αγαπημένο σας IDE και διακομιστή.
Το EhCache Spring Annotations JAR είναι διαθέσιμο εδώ . Όπως μπορούμε να δούμε, υπάρχουν δύο JAR για κάθε έκδοση: ένα με εξαρτήσεις και ένα χωρίς. Αυτό με εξαρτήσεις περιλαμβάνει επίσης τα EhCache 2 και Spring 3, τα οποία απαιτούνται για να λειτουργούν οι σχολιασμοί EhCache. Είναι πιο εύκολο να το ρυθμίσετε αν το κατεβάσετε με εξαρτήσεις και το προσθέσετε στη διαδρομή μας.
Παράδειγμα μεικτού ακέραιου γραμμικού προγραμματισμού
Το EhCache Spring Annotations είναι επίσης συμβατό με το Spring 4, αν και πρέπει να διαμορφωθεί ξεχωριστά. Δεν είναι σαφές εάν το έργο θα υποστηρίξει το EhCache 3 στο εγγύς μέλλον. Για όσους χρησιμοποιούν, ή σκοπεύουν να χρησιμοποιήσουν, το EhCache 3, δεν συνιστάται η προσέγγιση σχολιασμού που αναφέρεται σε αυτό το άρθρο.
Τέλος, θα χρησιμοποιήσουμε το Maven για να διαχειριστούμε τα πάντα. Το Maven έρχεται προσυσκευασμένο με τις περισσότερες εγκαταστάσεις Eclipse, αλλά μπορεί επίσης να ληφθεί εδώ . Οι εξαρτήσεις Spring MVC και EhCache Spring Annotations μπορούν να προστεθούν αρκετά εύκολα, όπως φαίνεται παρακάτω σε αυτό το άρθρο.
Εάν δεν έχετε εγκαταστήσει ποτέ ένα έργο Spring, μπορεί επίσης να το βρείτε Η ανάρτηση του Stefan Varga σχετικά με το θέμα πληροφοριακός.
Για αυτήν την επίδειξη, θα δημιουργήσουμε ένα βασικό έργο χρησιμοποιώντας το Maven αρχέτυπο maven-archetype-webapp
. Η συνολική δομή αρχείων θα έχει την εξής μορφή:
Δημιουργήστε έναν κατάλογο, src/main/java
, με τρία πακέτα: com.toptal.blog
, com.toptal.blog.cache
, και com.toptal.blog.service
. Η πηγή της εφαρμογής μας θα περιληφθεί σε αυτά τα πακέτα, όπως περιγράφεται παρακάτω.
Ας ορίσουμε ένα servlet Tomcat που ονομάζεται 'springrest' στο web.xml
:
... springrest org.springframework.web.servlet.DispatcherServlet 1 springrest /*
Εκτός αν ορίζεται ρητώς διαφορετικά, ένα Spring MVC DispatcherServlet
θα αναζητήσει ένα αρχείο διαμόρφωσης XML με το όνομα {servlet-name}-servlet.xml
στον κατάλογο WEB-INF
. Ας δημιουργήσουμε ένα αρχείο διαμόρφωσης που ονομάζεται springrest-servlet.xml
. Για να ενεργοποιήσετε τις μεθόδους Επεξεργαστή διεργασίας Spring με σχολιασμό με @RequestMapping
, ας προσθέσουμε απλώς σε αυτό το αρχείο. Επίσης, ας καθορίσουμε το βασικό πακέτο για την Άνοιξη για αυτόματη σάρωση και εγγραφή φασολιών προσθέτοντας. Το springrest-servlet.xml
η διαμόρφωση γίνεται:
project.toptal.blog
Τώρα που το έργο μας έχει διαμορφωθεί σωστά, ας εφαρμόσουμε ένα απλό API «υπηρεσίας μηνυμάτων». Στο βασικό μας πακέτο, SpringRestControllerWithEhCache.java
, θα προσθέσουμε @RestController @RequestMapping( '/' ) public class SpringRestControllerWithEhCache { @Autowired MessageService messageService; @RequestMapping( value = '/message/{id}', method = RequestMethod.GET ) public String getMessage( @PathVariable Integer id ) { String message = messageService.getMessage( id ); System.out.println( 'get message ['+message+'] at '+new Date() ); return message; } @RequestMapping( value = '/message/set/{id}/{message}', method = RequestMethod.POST ) public String setMessage( @PathVariable Integer id, @PathVariable String message ) { System.out.println( 'set message ['+message+'] at '+new Date() ); messageService.setMessage( id, message ); return message; } }
, με μία μέθοδο GET για να λάβετε ένα μήνυμα με αναγνωριστικό και μία μέθοδο POST για να ορίσετε ένα μήνυμα με αναγνωριστικό:
MessageService
Θα ορίσουμε το com.toptal.blog.service
τάξη σε HashMap
. Θα έχει πρόσβαση σε μηνύματα που είναι αποθηκευμένα στο Σύστημα αρχείων (SOR). Σε μια εφαρμογή παραγωγής, το SOR θα ήταν κάτι σαν μια σχεσιακή βάση δεδομένων. Για απλότητα, θα χρησιμοποιήσουμε ένα @Service public class MessageService { private ConcurrentHashMap messages = new ConcurrentHashMap(); public String getMessage( Integer id ) { System.out.println( 'Getting data from SOR......' ); return messages.get( id ); } public void setMessage( Integer id, String message ){ messages.put( id, message ); } }
:
Ρύθμιση διακομιστή web raspberry pi
http://localhost:8080/EhCacheExample/message/set/1/test_message
Τώρα, εάν εξαγάγουμε το έργο ως WAR και το αναπτύξουμε στο Tomcat, θα πρέπει να μπορούμε να ορίσουμε ένα μήνυμα, για παράδειγμα 'test_message', για το ID = 1, δημιουργώντας ένα αίτημα HTTP POST στο http://localhost:8080/EhCacheExample/message/1
. Στη συνέχεια, θα πρέπει να μπορούμε να λάβουμε ξανά το 'test_message' με αίτημα HTTP GET στο pom.xml
. χρησιμοποίησα Αυπνία ως βολικός πελάτης REST για να κάνω τη δοκιμή μου.
Τώρα ας δουλέψουμε το EhCache για εμάς. Χρειάζονται μόνο λίγα γρήγορα βήματα για να διαμορφώσουμε το έργο μας ώστε να λειτουργεί σωστά το EhCache.
llc s corp vs c corp
Προσθέστε την εξάρτηση εαρινών σχολίων EhCache στο Maven's com.googlecode.ehcache-spring-annotations ehcache-spring-annotations 1.2.0
:
org.springframework.cache.ehcache.EhCacheManagerFactoryBean
Η Spring διαθέτει έναν ενσωματωμένο διαχειριστή προσωρινής μνήμης EhCache, com.toptal.blog.cache.CustomCacheManager
. Αυτό είναι κατάλληλο για τις περισσότερες καταστάσεις προσωρινής αποθήκευσης, αλλά έχω διαπιστώσει ότι ο ορισμός ενός προσαρμοσμένου διαχειριστή προσωρινής μνήμης είναι χρήσιμος, επειδή μου επιτρέπει τον έλεγχο της προσωρινής μνήμης είτε μέσω προγραμματισμού είτε με σχολιασμούς, χρησιμοποιώντας τον ίδιο διαχειριστή προσωρινής μνήμης. Αυτό το άρθρο επικεντρώνεται σε σχολιασμούς, αλλά ας προχωρήσουμε και ορίστε έναν προσαρμοσμένο διαχειριστή προσωρινής μνήμης, ώστε να είμαστε έτοιμοι σε περίπτωση που το χρειαζόμαστε. Εάν προτιμάτε να διατηρήσετε την προεπιλεγμένη διαχείριση προσωρινής μνήμης, μπορείτε να παραλείψετε αυτό το βήμα.
Θα ορίσουμε τη νέα τάξη σε public class CustomCacheManager extends net.sf.ehcache.CacheManager{ public CustomCacheManager(){ super(); } /* Add your own cache methods here. * * public void myCustomCacheMethod(){ * // your code here * } * */ }
:
springrest-servlet.xml
Ενεργοποιήστε το ενημερώνοντας ... ...
ως εξής:
ehcache.xml
Τέλος, δημιουργήστε το αρχείο διαμόρφωσης EhCache src/main/resources
στο classpath. Από προεπιλογή, το Eclipse θα περιλαμβάνει timeToLiveSeconds
στο classpath και θα τοποθετήσουμε το αρχείο εδώ. Αυτό το αρχείο απαιτείται για να λειτουργεί σωστά το EhCache. Καθορίζει τα ονόματα προσωρινής μνήμης και ορισμένες ιδιότητες κάθε προσωρινής μνήμης, όπως το @Cacheable
:
@Cacheable
Τώρα, με τα πάντα έτοιμα και έτοιμα για χρήση, η χρήση του EhCache πρέπει να είναι εύκολη και ευτυχισμένη δουλειά. Μπορούμε απλώς να προσθέσουμε getMessage
στη μέθοδο ή την τάξη που θέλουμε να αποθηκεύσουμε στην κρυφή μνήμη. Για παράδειγμα, πρόσθεσα MessageService
στο @Cacheable( cacheName = 'messageCache' ) public String getMessage( Integer id ) { System.out.println( 'Getting data from SOR......' ); return messages.get( id ); }
μέθοδος στο http://localhost:8080/EhCacheExample/message/set/1/newMessage
. Είναι τόσο εύκολο!
http://localhost:8080/EhCacheExample/message/1
Για να ελέγξουμε ότι η προσωρινή μνήμη λειτουργεί, μπορούμε να δημιουργήσουμε ένα μήνυμα για το ID = 1 εκδίδοντας ένα αίτημα HTTP POST στο timeToLiveSeconds
και στη συνέχεια να λάβουμε το μήνυμα για ID = 1 πολλές φορές, με αιτήματα GET να set message [newMessage] at Sun Dec 06 23:55:39 MST 2015 get message [newMessage] at Sun Dec 06 23:55:42 MST 2015 Getting data from SOR...... get message [newMessage] at Sun Dec 06 23:55:47 MST 2015 get message [newMessage] at Sun Dec 06 23:55:49 MST 2015 get message [newMessage] at Sun Dec 06 23:55:54 MST 2015 Getting data from SOR......
. Όπως μπορείτε να δείτε στην έξοδο της κονσόλας παρακάτω, η υπηρεσία ιστού ζητά από τον SOR να λάβει το μήνυμα την πρώτη φορά που ζητάμε το μήνυμα, αλλά όχι για τα επόμενα δύο αιτήματα, επιστρέφοντας το προσωρινό μήνυμα. Επειδή ορίσαμε το @TriggersRemove
για να είναι 10, η υπηρεσία ιστού καλεί το SOR για να λάβει ξανά το μήνυμα μετά από 10 δευτερόλεπτα:
setMessage
Τώρα, απολαμβάνουμε την ταχύτητα και την ευκολία που μας δίνει μια προσωρινή μνήμη και το EhCache είναι αρκετά ωραίο για να ανανεώνεται από μόνο του κάθε 10 δευτερόλεπτα. Τι γίνεται όμως αν θέλουμε να το ανανεώσουμε αμέσως μετά την ενημέρωση του SOR; Προσφορές εαρινών σχολιασμών EhCache getMessage
για να αφαιρέσετε καθορισμένα κλειδιά από την προσωρινή μνήμη όταν καλείται η σχολιασμένη μέθοδος. Στο API υπηρεσίας μηνυμάτων μας, το προσωρινά αποθηκευμένο μήνυμα θα πρέπει να αφαιρεθεί από την προσωρινή μνήμη όταν @Cacheable( cacheName = 'messageCache', keyGenerator = @KeyGenerator ( // method name is not included in cache key to work with @TriggersRemove name = 'HashCodeCacheKeyGenerator', properties = @Property( name='includeMethod', value='false' ))) public String getMessage( Integer id ) { System.out.println( 'Getting data from SOR......' ); return messages.get( id ); } @TriggersRemove( cacheName = 'messageCache', keyGenerator = @KeyGenerator ( name = 'HashCodeCacheKeyGenerator', properties = @Property( name='includeMethod', value='false' ))) public void setMessage( @PartialCacheKey Integer id, String message ) { messages.put( id, message ); }
λέγεται. Έτσι, την επόμενη φορά a @KeyGenerator
το αίτημα εισέρχεται, η προσωρινή μνήμη θα πάρει μια νέα εγγραφή από το SOR:
setMessage
Μια γεννήτρια κλειδιών χρησιμοποιείται από τον διαχειριστή προσωρινής μνήμης για τη δημιουργία του κλειδιού προσωρινής αποθήκευσης. Μπορείτε να βρείτε μια λίστα προκαθορισμένων γεννητριών κλειδιών κρυφής μνήμης εδώ . Από προεπιλογή, getMessage
καταναλώνει τόσο το όνομα της μεθόδου όσο και τις παραμέτρους που έχουν περάσει για τη δημιουργία του κλειδιού cache. Αλλά επειδή θέλουμε το includeMethod
μέθοδος για τη δημιουργία του ίδιου κλειδιού με false
και να διαγράψουμε την προσωρινή μνήμη που σχετίζεται με αυτό το κλειδί, πρέπει να χρησιμοποιήσουμε μόνο το αναγνωριστικό μηνύματος ως κλειδί και να εξαλείψουμε το όνομα της μεθόδου για τη δημιουργία κλειδιών. Επομένως, ορίζουμε τη γεννήτρια κλειδιών setMessage
ακίνητο να είναι @PartialCacheKey
και για τις δύο μεθόδους. Επίσης, αφού id
έχει δύο επιχειρήματα, χρησιμοποιούμε το EhCache messageCache
σχολιασμός στο HTTP POST: http://localhost:8080/EhCacheExample/message/set/1/newMessage1 HTTP GET:http://localhost:8080/EhCacheExample/message/1 HTTP POST: http://localhost:8080/EhCacheExample/message/set/1/newMessage2 HTTP GET:http://localhost:8080/EhCacheExample/message/1
παράμετρος για να καθορίσει ότι είναι η μόνη που πρέπει να χρησιμοποιείται από τη γεννήτρια κλειδιών. Τέλος, θυμηθείτε ότι διαμορφώσαμε μια ειδική προσωρινή μνήμη, set message [newMessage1] at Tue Dec 08 17:53:44 MST 2015 get message [newMessage1] at Tue Dec 08 17:53:47 MST 2015 Getting data from SOR...... set message [newMessage2] at Tue Dec 08 17:53:50 MST 2015 get message [newMessage2] at Tue Dec 08 17:53:53 MST 2015 Getting data from SOR......
, για αυτόν τον τύπο πόρου, οπότε χρησιμοποιώντας μόνο το αναγνωριστικό για το κλειδί δεν υπάρχει κίνδυνος διένεξης με άλλους τύπους πόρων.
πλαισίου πλήρους στοίβας node js
Τώρα, εάν κάνουμε πολλά αιτήματα HTTP για το μήνυμα με ID = 1, ως εξής:
|_+_|
Η κονσόλα θα δείξει:
Η τελική δομή του έργου μοιάζει με αυτό:
Σε αυτό το παράδειγμα, δημιουργήσαμε για πρώτη φορά μια απλή εφαρμογή ιστού Spring MVC RESTful. Χωρίς να τροποποιήσουμε ούτε μια γραμμή του υπάρχοντος κωδικού εφαρμογής, ενσωματώσαμε έπειτα ομαλά το EhCache στην εφαρμογή χρησιμοποιώντας EhCache Spring Annotations. Έχουμε αποδείξει ότι το EhCache Spring Annotations είναι τόσο εύκολο στην εγκατάσταση (προσθέτοντας την εξάρτηση του Maven) όσο και κομψό στη χρήση (προσθέτοντας σχολιασμούς σε μεθόδους).
Μπορείτε να βρείτε την τεκμηρίωση EhCache εδώ και η τεκμηρίωση EhCache Spring Annotations είναι εδώ .
Επίσης, δείτε το δείγμα έργου που περιγράφεται σε αυτό το άρθρο GitHub .