2014-11-11 2 views
0

난 초보자 android 개발자입니다. 응용 프로그램 엔진 기반 응용 프로그램을 만들려고합니다. 지금은 작동하도록 만들 수 있지만 데이터베이스 액세스를 최적화하기 위해 memcache를 사용해야한다는 것을 알게되었습니다. 그러나 나는 몇 가지 기본 개념을 이해하기가 힘듭니다. 그래서 내 질문은 다음과 같습니다 :Memcache 이해

  1. memcache 프로그래밍은 앱 엔진에만 해당합니까? 안드로이드 측면과 관련이 없습니까? (내 말은 안드로이드 응용 프로그램에 필요한 코딩이 있습니까?)
  2. JPA를 사용하여 응용 프로그램 엔진 응용 프로그램을 프로그래밍했습니다. Memcache에 낮은 수준의 API를 사용할 수 있습니까?
  3. 나는 책에서이 예제를 얻었지만 많은 HTTP 참조를 사용한다. 이 유형의 예제를 Android 앱에도 사용할 수 있습니까? 아니면 웹 사이트의 사용 용도일까요?

    public class ETagCacheServlet extends HttpServlet { 
    private static final long serialVersionUID = 4308584640538822293L; 
         public void doGet(HttpServletRequest request, 
    HttpServletResponse response) 
    throws ServletException, IOException { 
    
    MemcacheService cache = MemcacheServiceFactory 
    .getMemcacheService(); 
    
    String cacheKey = request.getRequestURI() + "." + "etag"; 
    String result; 
    
    if (!cache.contains(cacheKey) || 
    !cache.get(cacheKey).equals(request 
    .getHeader("If-None-Match"))) { 
    
    String etag = Long.toString(System.currentTimeMillis()); 
    response.setHeader("ETag", etag); 
    cache.put(cacheKey, etag); 
    
    result = "Loaded into cache at " + (new Date()); 
    response.getWriter().write(result); 
    
    } else { 
    
    response.setStatus(304); 
    } 
    } 
    } 
    
  4. 실용적인 샘플 응용 프로그램이나 그 밖의 소스가 있습니까?

어쩌면 당신은이 질문을 읽는 것을 웃지만 어쩌면 이런 것들을 이해할 수 없습니다. 미리 감사드립니다.

편집 : 내 코드에 memcache를 추가하려했으나 실패 했습니까? Memcache를 서버 측에서 사용되는

@SuppressWarnings({ "unchecked", "unused" }) 
@ApiMethod(name = "queryDesire") 
public CollectionResponse<Desire> queryDesire(
     @Nullable @Named("cursor") String cursorString, 
     @Nullable @Named("limit") Integer limit, 
     @Nullable @Named("first") Integer first, 
     @Nullable @Named("name") String name){ 

    EntityManager mgr = null; 
    Cursor cursor = null; 
    List<Desire> execute = null;   
    try { 
     String keyDesire = "mem_" + name; 
     List<Desire> memDesire = (List<Desire>) memcache.get(keyDesire); 
     if (memDesire == null) { 
      mgr = getEntityManager(); 
      Query query2 = mgr.createQuery("select i from Desire i where i.ctgry = :name "); 
      if (cursorString != null && cursorString != "") { 
       cursor = Cursor.fromWebSafeString(cursorString); 
       query2.setHint(JPACursorHelper.CURSOR_HINT, cursor); 
      } 
      if (limit != null) { 
       query2.setFirstResult(first); 
       query2.setMaxResults(limit); 
      } 
      execute = (List<Desire>) query2.setParameter("name", name).getResultList(); 
      cursor = JPACursorHelper.getCursor(execute); 
      if (cursor != null) 
       cursorString = cursor.toWebSafeString(); 
      for (Desire obj : execute) 
       ;    
      CollectionResponse.<Desire> builder().setItems(execute) 
      .setNextPageToken(cursorString).build(); 
      memcache.put("mem_cache", queryDesire); 
     }     
     return CollectionResponse.<Desire> builder().setItems(execute) 
       .setNextPageToken(cursorString).build(); 
     } 
    finally { 
     mgr.close(); 
    } 


} 

답변

1
  1. , 즉 애플리케이션 엔진. 이것은 종종 서버에서 클라이언트로의 응답 속도를 높이기 위해 사용되지만 클라이언트 코드와 관련이 없습니다. 즉, App Engine 측에서 Memcache를 사용하는 경우 클라이언트 측에서 변경할 필요가 없습니다.

  2. 예, Memcache 용 저수준 API를 사용할 수 있습니다.

  3. 질문 1에 대한 응답을 참조하십시오. 에 관계없이 Memcache를 사용할 수있는 방법은 앱이 서버와 통신하는 방법입니다.

  4. Memcache는 여러 가지 방법으로 사용되므로 특정 질문을 올리셔야 도움이 될 수 있습니다. 한편, 여기 내 코드에서 예제입니다. 시간대는 내 앱에 자주 필요하며 변경되지 않습니다. 따라서 Memcache를 사용하여 응답 속도를 높이는 것이 좋습니다.

    private static final MemcacheService memcache = MemcacheServiceFactory.getMemcacheService(); 
    
    public static ArrayList<String> getTimeZones() { 
        ArrayList<String> timeZones = (ArrayList<String>) memcache.get("time_zones"); 
        if (timeZones == null) { 
         // This method reads time zones from a properties file 
         timeZones = prepareTimeZones(); 
         memcache.put("time_zones", timeZones); 
        } 
        return timeZones; 
    } 
    
+0

안드레이, 당신의 포괄적 인 답변을 주셔서 감사합니다. 나는 한 가지 더 묻고 싶다. 다른 사용자가 캐시에서 사용할 수 있도록 사용자가 호출 한 후에 쿼리 결과를 캐시하고 싶습니다. 그것을 확립하기 위해, 논리는 무엇이되어야 하는가? 즉 memcache는 별도의 클래스이며 쿼리 후 memcache를 호출합니까? – savante

+0

내 예제와 같은 논리를 사용할 수 있습니다. 먼저 원하는 항목이 없으면 memcache를 확인하고 쿼리를 검색하여 memcache에 넣은 다음 응답을 반환하십시오. 캐시하는 쿼리를 식별하는 키를 결정하고 결과가 (a) 직렬화 가능하고 (b) 1MB보다 작은 지 확인해야합니다. –

+0

안녕하세요, Andrei, 나는 당신이 말한 것을 시도하고 위의 편집을했습니다. 좀 봐 주실 수 있나요? 나는 return statement를 설정할 수 없었다. 또한 memcache.put ("mem_cache", queryDesire); 여기에 오류가 있습니다. 쿼리 욕구를 변수로 풀 수 없습니다. – savante