Время задержки Memcache слишком велико?

У меня есть код ниже, работающий на GAE. При получении элементов из memcache я получаю задержку около 30 мс только для 5–20 результатов. Не слишком ли это высоко? Есть ли способ улучшить его?

        @SuppressWarnings({ "unchecked"})
        @ApiMethod(name = "queryDesire2")
        public List<String> queryDesire2(
                @Nullable @Named("name2") String name2){
            EntityManager mgr = getEntityManager();
            List<String> list1=new ArrayList<String>();
            Key userKey=null;
            Long x=0L;
            List<Key> keysNew = new ArrayList<Key>();
            MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();

            try {
                    userKey=KeyFactory.createKey(name2,1);
                    if (memcache.get(userKey)==null) {
                        Query query2 = mgr.createQuery("select d.good from Desire d where d.ctgry = :name2");        
                        list1 = query2.setParameter("name2", name2).getResultList();          

                        for (String d : list1){
                        x=x+1L;
                        userKey = KeyFactory.createKey(name2,x);                            
                        memcache.put(userKey, d);
                        memcache.put(name2+"no", x);
                        }
                    } else {
                        Long y=(Long) memcache.get(name2+"no");
                    for (x = 1L; x<=y; x++){
                        userKey=KeyFactory.createKey(name2,x);
                        keysNew.add(userKey);
                    }   
                        Map mMap;
                        mMap = memcache.getAll(keysNew);
                        list1 = new ArrayList<String>(mMap.values());
                    }

             }
            finally {
                mgr.close();
            }
            return list1;


        } 

ИЗМЕНИТЬ:

введите здесь описание изображения

Я сделал этот снимок из https://appengine.google.com/... журналов. Я предположил, что 26 мс на верхнем — это задержка. Но также я понял, что есть cpu_usd: 0.000035. Что меня действительно беспокоит, так это понять, сколько часов экземпляра будет использовать мое приложение. Есть ли какая-то формула или способ вычислить это?


person savante    schedule 23.11.2014    source источник
comment
Как вы рассчитали задержку вызовов Memcache?   -  person Andrei Volgin    schedule 24.11.2014
comment
Я просто проверяю время задержки, указанное в журналах на консоли движка приложения.   -  person savante    schedule 24.11.2014
comment
Я не вижу отдельных записей для вызовов Memcache. И если вы посмотрите на свой общий звонок, вам нужно будет учесть все остальные ваши действия, включая ваш запрос.   -  person Andrei Volgin    schedule 24.11.2014
comment
Вы измеряли это с помощью Appstats?   -  person Jose Montes de Oca    schedule 24.11.2014
comment
@Jose Пожалуйста, посмотрите мое редактирование.   -  person savante    schedule 24.11.2014
comment
@user3370788 user3370788 26 мс - это задержка запроса, а не задержка вызова API Memcache. Чтобы получить задержку API, вам нужно включить Appstats, как упоминалось ранее. Если вас на самом деле беспокоит, сколько экземпляров в час будет использовать ваше приложение, я советую запустить эксперимент по нагрузочному тестированию и определить, сколько экземпляров вам потребуется для запуска x количества запросов в секунду. Как только вы узнаете, сколько экземпляров вам потребуется в среднем, вы можете использовать Калькулятор цен. чтобы получить оценку.   -  person Jose Montes de Oca    schedule 25.11.2014


Ответы (2)


Вы можете поместить все объекты в один вызов. Вы также можете использовать AsyncMemcacheService — он будет работать немного быстрее с вызовами put.

Просто помни:

«Мульти» пакетные операции могут иметь любое количество элементов. Общий размер вызова и общий размер полученных данных не должны превышать 32 мегабайта.

person Andrei Volgin    schedule 23.11.2014
comment
Для этого я использую memcache.getAll(). Разве это не способ сделать это? - person savante; 24.11.2014
comment
Я сказал, что вы можете группировать put звонки. - person Andrei Volgin; 24.11.2014

Кэш памяти, доступный через App Engine, может быть общим или выделенным. С общим доступом, который, как я предполагаю, вы используете, вы находитесь в пуле с другими пользователями, и задержка будет во многом зависеть от того, что они делают в данный момент.

person Dave W. Smith    schedule 24.11.2014