मेरे पास एक ऐसी साइट है जहां उपयोगकर्ता पहले अपना खोज मानदंड दर्ज करेंगे। खोज 2 स्रोतों से डेटा को जोड़ती है, जिनमें से एक डेटाबेस नहीं है। खोज परिणाम आम तौर पर बड़े होने के लिए पर्याप्त होते हैं।grails में कैशिंग डेटा
प्रारंभिक क्वेरी महंगा होने के बाद से, यदि खोज मानदंड बाद के पृष्ठ दृश्यों में परिवर्तित नहीं होता है तो मैं खोज परिणामों को कैश करना चाहता हूं।
मेरे वर्तमान विधि लगता है:
def search(criteriaMap, offset, pagesize)
ग्रूवी/grails में खोज परिणामों को संचित करने का सबसे अच्छा तरीका क्या है? मैं खोज परिणामों की अवधि कैसे समाप्त करूं?
नोट, मुझे लगता है कि एक springcache प्लगइन है लेकिन मुझे यकीन नहीं है कि यह पेज किए गए परिणामों के लिए काम करेगा या नहीं। मुझे यह भी पता है कि grails ehcache के साथ पैक किया गया है, लेकिन मैंने एपीआई को सीधे नहीं देखा है, मैंने केवल इसे देखा है कि यह गोर्म के साथ दूसरे स्तर के कैशिंग के लिए उपयोग किया जाता है।
अद्यतन: मैंने इसे हल करने के लिए @ mfloryan के समाधान का हिस्सा लिया।
@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)
(एक कैश किया गया है और अन्य नहीं है।)
searchController में मेरे कोड:
def trimmedParams = searchService.trimParams(params)
def results = searchService.searchResults(trimmedParams)
//Page results
results = HelperService.pageResults(results, params.offset, params.max)
[results: results, searchParams : trimmedParams]
मैं searchService में दो तरीकों बनाया
एक परिणाम के रूप में, मैंने खोज सेवा को उन पैरामीटर की एक छंटनी सूची के साथ बुलाया जो संलग्न नहीं है ude पेजिंग पैराम। कैश किए गए खोज परिणामों को वापस किया जा सकता है।
खोज नियंत्रक पेजिंग का ख्याल रखता है।
नोट: मैंने हाइबरनेट परिणामों को कैश नहीं किया क्योंकि मैं कैश में डेटा को दोगुना कर दूंगा। मैंने केवल searchService.searchResults (जो एक आरईएसटी एपीआई और मेरा स्थानीय डेटाबेस हिट करता है) से संयुक्त परिणाम कैश किया है
पेजिनेशन विजेट इस के साथ कैसे सहभागिता करेगा? क्या मैं समय या फीफो ऑर्डर के आधार पर कैश फ्लश कर सकता हूं? – Tihom
किसी भिन्न पृष्ठ पर जाकर क्वेरी स्ट्रिंग में परिवर्तन होता है, इसलिए अलग-अलग प्रतिक्रिया कैश की जाती है और फिर सेवा की जाती है। कैश स्वचालित रूप से समाप्त हो जाता है इसलिए समय के आधार पर स्पष्ट रूप से फ्लश करने की आवश्यकता नहीं होती है। बस इसे sprigcache/caches/[cacheName]/timeToLive = ... – mfloryan
के तहत Config.groovy में सेट करें, मैं अलग-अलग पृष्ठों के लिए आवश्यकता से बचना चाहता हूं। मैं उसको कैसे करू? – Tihom