2012-11-29 40 views
10

Tôi tự hỏi liệu có bất kỳ giải pháp lưu trữ nào có sẵn trong Scala hay không. Tôi đang tìm một cái gì đó giống như nó được cung cấp bởi ổi trong Java.Giải pháp lưu trữ bộ nhớ đệm nhẹ ở Scala?

Tôi có nên sử dụng Ổi quá tại Scala không? Có một wrapper/pimp trong Scalaz hoặc một cái gì đó tương tự? Bất kỳ giải pháp thay thế nào phù hợp hơn cho Scala devs?

gì Ổi cung cấp:

LoadingCache<Key, Graph> CACHE= CacheBuilder.newBuilder() 
     .maximumSize(1000) 
     .expireAfterWrite(10, TimeUnit.MINUTES) 
     .removalListener(MY_LISTENER) 
     .build(
      new CacheLoader<Key, Graph>() { 
      public Graph load(Key key) throws AnyException { 
       return createExpensiveGraph(key); 
      } 
      }); 

Supplier<Animal> singleAnimalCache = Suppliers.memoizeWithExpiration(animalFromDbSupplier(), 365, TimeUnit.DAYS); 

Tôi cần một số quản lý bộ nhớ cache cơ bản như trong ổi.

+0

Bạn không hài lòng với http://stackoverflow.com/questions/3651313/how-to-cache-results-in-scala? –

+0

@ om-nom-nom trông rất tuyệt, tôi đang tìm một bộ ghi nhớ (như trong ổi với bộ cung cấp), nhưng tôi cần quản lý bộ nhớ cache như hết hạn, kích thước bộ nhớ cache tối đa, v.v. Tôi không thấy điều đó trong việc triển khai Scalaz –

+5

Bạn sẽ không phải là người đầu tiên sử dụng 'Cache' của Guava trong Scala. –

Trả lời

3

Có một wrapper/pimp trong Scalaz hoặc một cái gì đó tương tự?

Trong Scalaz 7 có Memo, mà tôi đã xem một chút trong learning Scalaz day 16.

Đó là điều đầu tiên mà Adam Rosien đề cập đến trong cuộc hội thoại scalaz "For the Rest of Us", vì vậy hãy kiểm tra điều đó. Anh ấy đang sử dụng Scalaz 6.

+4

Cảm ơn, liên kết của bạn có vẻ tuyệt vời. Nhưng bản ghi nhớ được cung cấp bởi Scalaz dường như không hỗ trợ hết hạn như Guava không –

5

Chúng tôi đã có các yêu cầu tương tự và kết thúc xây dựng trình bao bọc quanh ổi. Chúng tôi gần đây đã mở các phần của thư viện có tên là Mango. Nếu bạn không nhớ phụ thuộc phụ, bạn có thể sử dụng nó như

import org.feijoas.mango.common.cache._ 
import org.feijoas.mango.common.base.Suppliers._ 

val MY_LISTENER = (remNot: RemovalNotification[Key, Graph]) =>() 
// > MY_LISTENER : RemovalNotification[Key,Graph] => Unit = <function1> 

val CACHE = CacheBuilder.newBuilder() 
    .maximumSize(1000) 
    .expireAfterWrite(10, TimeUnit.MINUTES) 
    .removalListener(MY_LISTENER) 
    .build { (key: Key) => new Graph() } 
// > CACHE : LoadingCache[Key,Graph] = <function1> 

val animalFromDbSupplier =() => { 
    // load from db 
    new Animal() 
} 
// > animalFromDbSupplier :() => Animal = <function0> 

val singleAnimalCache = memoizeWithExpiration(animalFromDbSupplier, 365, TimeUnit.DAYS) 
// > singleAnimalCache :() => Animal = Suppliers.memoizeWithExpiration(<function0>, 365, DAYS) 
+0

hehe Tôi biết vì tôi đã trả lời câu hỏi của bạn :) http://stackoverflow.com/questions/17922339/build-automation-sbt-compile-test-against -multiple-dependencies –

5

Chỉ cần thêm câu trả lời để cắm dự án của riêng tôi, nhưng tôi khuyên bạn nên sử dụng ScalaCache.

  • Hỗ trợ ổi, ehcache, Memcached và Redis (hoặc bạn có thể cắm thực hiện của riêng bạn nếu bạn thích)
  • đơn giản, thành ngữ Scala API
  • Hỗ trợ cho mỗi yếu tố Time To Live (ngay cả đối với ổi, mà không quy định out of the box)
  • Hỗ trợ tính năng tự động tạo ra các phím bộ nhớ cache sử dụng ma thuật vĩ mô

https://github.com/cb372/scalacache

Các vấn đề liên quan