Is Memcache (Java) for Google App Engine a global cache?

后端 未结 3 1393
借酒劲吻你
借酒劲吻你 2021-02-19 03:27

I\'m new to Google App Engine, and I\'ve spent the last few days building an app using GAE\'s Memcache to store data. Based on my initial findings, it appears as though GAE\'s

相关标签:
3条回答
  • 2021-02-19 03:58

    Yes, Memcache is shared across all instances of your app.

    0 讨论(0)
  • 2021-02-19 04:10

    I found the issue and got it working. I was initially using the JCache API and couldn't get it to work, so I switched over to the low-level Memcache API but forgot to remove the old JCache code. So they two implementations were stepping on each other.

    I'm not sure why the JCache implementation didn't work so I'll share the code:

        try {
            if (CacheManager.getInstance().getCache(CACHE_GEO_CLIENTS) == null) {
                Cache cache = CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
                cache.put(CACHE_GEO_CLIENTS, new HashMap<String, String>());
                CacheManager.getInstance().registerCache(CACHE_GEO_CLIENTS, cache);
            }
    
        } catch (CacheException e) {
    
            log.severe("Exception while creating cache: " + e);
    
        }
    

    This block of code is inside a private constructor for a singleton called CacheService. This singleton serves as a Cache facade. Note that since requests can be served by different nodes, each node will have this Singleton instance. So when the Singleton is constructed for the first and only time, it'll check to see if my cache is available. If not, it'll create it. This should technically happen only once since Memcache is global yeah? The other somewhat odd thing I'm doing here is creating a single cache entry of type HashMap to store my actual values. I'm doing this because I need to enumerate through all keys and that's something that I can't do with Memcache natively.

    What am I doing wrong here?

    0 讨论(0)
  • 2021-02-19 04:11

    Jerry, there are two issues I see with the code you posted above:

    1) You are using the javax.cache version of the API. According to Google, this has been deprecated: http://groups.google.com/group/google-appengine-java/browse_thread/thread/5820852b63a7e673/9b47f475b81fb40e?pli=1

    Instead, it is intended that we use the net.sf.jsr107 library until the JSR is finalized.

    I don't know that using the old API will cause a specific issue, but still could be trouble.

    2) I don't see how you are putting and getting from the cache, but the put statement you have is a bit strange:

    cache.put(CACHE_GEO_CLIENTS, new HashMap());

    It looks like you are putting a second cache inside the main cache.

    I have very similar code, but I'm putting and getting individual objects into the cache, not Maps, keyed by a unique ID. And it is working fine for me across multiple instances on GAE.

    -John

    0 讨论(0)
提交回复
热议问题