2010-04-26 18 views
5

में कैश का उपयोग करके एपी को रेट करने की दर सीमित करें हाय मैं here से सीएफसी बंडल का उपयोग करके अंतिम.एफएम एपीआई को कॉल करने के लिए कोल्डफ्यूजन का उपयोग कर रहा हूं।कोल्डफ्यूजन

मैं अनुरोध सीमा पर जाने के बारे में चिंतित हूं, जो प्रति सेकंड प्रति आईपी पते प्रति 5 अनुरोध है, औसत 5 मिनट की अवधि में औसत है।

सीएफसी बंडल का एक केंद्रीय घटक है जो अन्य सभी घटकों को कॉल करता है, जो "कलाकार", "ट्रैक" आदि जैसे वर्गों में विभाजित होते हैं ... यह केंद्रीय घटक "lastFmApi.cfc।" अपने आवेदन में शुरू की है, और आवेदन

// Application.cfc example 
    <cffunction name="onApplicationStart"> 
     <cfset var apiKey = '[your api key here]' /> 
     <cfset var apiSecret = '[your api secret here]' /> 

     <cfset application.lastFm = CreateObject('component', 'org.FrankFusion.lastFm.lastFmApi').init(apiKey, apiSecret) /> 
    </cffunction> 

अब अगर मैं कोई हैंडलर/नियंत्रक के माध्यम से API कॉल करना चाहते हैं के जीवन काल के लिए एक समान होती है, उदाहरण के लिए मेरी कलाकार हैंडलर ... मैं इस

कर सकते हैं
<cffunction name="artistPage" cache="5 mins"> 
<cfset qAlbums = application.lastFm.user.getArtist(url.artistName) /> 
</cffunction> 

मैं कैशिंग की ओर थोड़ा उलझन में हूं, लेकिन इस हैंडलर में 5 मिनट के लिए प्रत्येक कॉल को एपीआई में कैश कर रहा हूं, लेकिन इससे कोई फर्क पड़ता है, क्योंकि प्रत्येक बार जब कोई नया कलाकार पृष्ठ हिट करता है तो यह अभी भी ताजा नहीं होगा एपीआई के खिलाफ मारा?

सोच से निपटने के लिए कैसे सबसे अच्छा यह

धन्यवाद

उत्तर

3

चूंकि यह सरल डेटा मॉडल है, इसलिए मैं कस्टम कैश इंजन के साथ चीजों को जटिल नहीं करता। मैं सरल संरचना/क्वेरी डालता हूं: खोज टर्म/परिणाम, टाइमस्टैम्प कहीं। वहाँ आप ऐसा कर सकता है:

<cffunction name="artistPage" cache="5 mins"> 
    <cfargument name="artistName" type="string" required="true"/> 
    <cfif structKeyExists(application.artistCache, arguments.artistName) and structfindkey(application.artistCache, arguments.artistName)> 
     <cfif (gettickcount() - application.artistCache[arguments.artistName].timestamp) lte 5000 > 

     <cfset result = application.artistCache[arguments.artistName].result > 
    <cfelse> 
     <cfset qAlbums = application.lastFm.user.getArtist(arguments.artistName) /> 
     <cfset tempStruct = structnew()> 
     <cfset structNew.result = qAlbums > 
     <cfset structNew.timestamp = getTickCount() > 
     <cfset structInsert(application.artistCache, arguments.artistName, tempstruct, true) > 

     <cfset result = qAlbums > 

    </cfif> 

    <cfreturn result > 
</cffunction> 

संपादित करें: हाँ, आप कहीं भी विधि जहां टाइमस्टैम्प अंतर तो अपने कैश वैधता अवधि जी.टी. है जो struct कुंजी हटा रखना चाहिए।

भविष्य में यह बदलने योग्य बनाने के लिए फेकाडे पैटर्न की सिफारिश की जाती है।

टाइपो के लिए खेद है :)

+0

आपकी प्रतिक्रिया के लिए हाय धन्यवाद, बस बेहतर समझने की कोशिश कर रहा है। वंडर मैं application.cfc में * yourCacheStruct * कहां रखूं? यह विधि केवल आवेदन के बजाए प्रति फ़ंक्शन कॉल सीमित कर रही है? आईई आप केवल प्रति मिनट प्रति आईपी पते प्रति 5 अनुरोध कर सकते हैं, औसत 5 मिनट की अवधि में औसत। ये अनुरोध एप्लिकेशन में कहीं भी, कलाकार पृष्ठ हैंडलर से, या शायद ट्रैक पेज हैंडलर से आ सकते हैं।तो आवेदन को यह सुनिश्चित करना है कि कहीं से भी सभी कॉल सीमा – namtax

+0

सीमा से अधिक न हों, मैंने इस दायरे में कोड को संपादित किया ताकि एप्लिकेशन स्कोप में कैश को स्टोर करने के बारे में स्पष्ट जानकारी दी जा सके। लंबे समय तक, मैं एक कैश नियंत्रक जोड़ने पर विचार कर सकता हूं जो कुछ फ़ंक्शन कॉल के माध्यम से डेटा के सभी कैशिंग को संभालता है, बजाय प्रत्येक विधि में इसे फिर से लिखने के बजाय कैशिंग का उपयोग करने की आवश्यकता होती है; लेकिन यह आपको एक विचार देना चाहिए कि यह कैसे किया जाता है। –

+0

मुझे यकीन नहीं है कि क्यों @zarko ने फ़ंक्शन परिभाषा में 'cache =" 5 mins "डालने का निर्णय लिया। यह कुछ कस्टम मेटाडेटा को छोड़कर कुछ भी नहीं करता है। –

0

मैं कस्टम कैश की कोशिश करेंगे।

यह एक संरचना हो सकती है जहां कुंजी कलाकार नाम या आपकी प्रविष्टियों के अन्य अद्वितीय पहचानकर्ता हैं।

यदि आप CF9 या Railo 3.1.2+ का उपयोग कर रहे हैं, तो आप अंतर्निर्मित कैशिंग (फ़ंक्शन कैशपूट, कैशगेट इत्यादि) का उपयोग कर सकते हैं, यह आपके लिए टाइमआउट और सामान को संभाल सकता है।

अन्यथा आप कैश को एप्लिकेशन स्कोप में स्टोर कर सकते हैं, लेकिन प्रत्येक प्रविष्टि के साथ टाइमस्टैम्प शामिल करने और उसे कैश ईवेंट (प्राप्त/निकालने/निकालने) या यहां तक ​​कि प्रत्येक अनुरोध पर भी जांचना होगा।

+0

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद .. मुझे लगता है कि एप्लिकेशन स्कोप अपील में कैश संग्रहित करना मुझे लगता है। फिर मुझे लगता है कि मैं संग्रहित कैश में जोड़े गए प्रत्येक प्रविष्टि की जांच करता हूं, और यह सुनिश्चित करता हूं कि यह किसी विशिष्ट समय सीमा के भीतर सीमा से अधिक न हो। – namtax

संबंधित मुद्दे