• Save
I ty też możesz mieć swoje dane w cache
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

I ty też możesz mieć swoje dane w cache

  • 775 views
Uploaded on

Tysiące użytkowników, miliony zapytań HTTP, miliardy odwołań do bazy danych, dziesiątki tysięcy osobogodzin inwestowanych przez firmy na optymalizacje aplikacji webowych, miliony dolarów (czy też......

Tysiące użytkowników, miliony zapytań HTTP, miliardy odwołań do bazy danych, dziesiątki tysięcy osobogodzin inwestowanych przez firmy na optymalizacje aplikacji webowych, miliony dolarów (czy też euro) wydawanych na infrastrukturę, wszystko to po aby nasz system zapewniał użytkownikom odpowiedni komfort pracy i zadowalający czas odpowiedzi.

I gdy już wszystkie optymalizacje zapytań do bazy danych zostaną zastosowane, indeksy wypolerowane na wysoki połysk, czasowa złożoność obliczeniowa wszystkich metod będzie dążyć do O(1), a system dalej nie będzie spełnił wyśrubowanych warunków SLA, zawsze pozostaje wyprawa na "ostatni przylądek dobrej nadziei", czyli pełne niebezpieczeństw i ekscytujących przygód krainy, gdzie wasze dane będą na was czekać w ultra wydajnych, skalowalnych i stabilnych serwerach cache.

Chciałbym was, drodzy słuchacze, łagodnie wprowadzić w świat cache. Cache dla aplikacji webowych, opowiedzieć o stosowanych topologiach, wykorzystaniach cache w poszczególnych warstwach aplikacji, świat algorytmów "cache eviction", rozproszonych serwerów cache (i "data grids") oraz znanych i też przemilczanych "sekretów" i problemów, z którymi się spotkacie podczas implementacji cache w waszym systemie. Wszystko z wykorzystaniem takich rozwiązań jak memcached, redis, infinispan i ehcache.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
775
On Slideshare
775
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. I ty też możesz mieć swoje dane w cache
  • 2. work://lumesse twitter://j_palka blog://geekyprimitives.wordpress.com scm://bitbucket/kcrimson scm://github/kcrimson
  • 3. Dla kogo ta prezentacja?
  • 4. ...nigdy tego nie robiłeś...
  • 5. ...nie wiesz z kim...
  • 6. ...nie wiesz jak...
  • 7. ...boisz się skutków ubocznych...
  • 8. Czyli 116 rzeczy, które chciałbyś wiedzieć o cache, ale boisz się zapytać
  • 9. Cache to najpowszechniej stosowana metoda optymalizacji systemów
  • 10. Cache to najpowszechniej stosowana metoda optymalizacji systemów
  • 11. … lecz zanim zaczniemy
  • 12. ...cache eviction...
  • 13. Sytuacja gdy założony rozmiar cache został przekroczony i niektóry elementy (pary klucz wartość) zostają z niego usunięte. W celu wyboru elementów, które zostaną usunięte wykorzystywane są różne algorytmy, takie jak LRU lub LFU
  • 14. Least Recently Used
  • 15. Least Frequently Used
  • 16. Low Inter-reference Recency Set
  • 17. First In First Out
  • 18. ...cache invalidation...
  • 19. Sytuacja gdy pewne elementy cache (pary klucz-wartość), nie są już dłużej aktualne, zostały usunięte lub też do danego klucza została przypisana nowa wartość. Pojęcie ważne dla rozproszonych cache, gdyż tego typu zdarzenia powinny być rozgłoszone do wszystkich węzłów cache
  • 20. There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton
  • 21. … a skoro już mowa o rozproszonych cache'ach
  • 22. topologie cache
  • 23. lokalny
  • 24. zdalny
  • 25. rozproszony
  • 26. hybrydowy
  • 27. ...cache expiry...
  • 28. Sytuacja gdy danemu elementowi cache (para klucz wartość), został przypisany czas przez jaki ten element będzie dostępny w cache. Po tym czasie element jest usuwany z cache. Dosyć często „cache expiry” definiowany przez dwa parametry „TTL” i „idle time”
  • 29. ...cache passivation... aka ...cache offloading...
  • 30. Sytuacja gdy rozmiar cache został przekroczony, i wybrane element cache zostają zapisane na dysku lub do bazy danych. Są one nadal dostępne w cache, jednak dostęp do nich jest wolniejszy. Wykorzystywane są w tym przypadku podobne algorytmy jak podczas „cache eviction”
  • 31. ...cache hit...
  • 32. ...cache miss...
  • 33. ...memcached... ...redis... ...ehcache... ...infinispan...
  • 34. ...memcached...
  • 35. root@ubuntu:/home/ubuntu# telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set klucz 0 600 6 123456 STORED get klucz VALUE klucz 0 6 123456 END delete klucz DELETED
  • 36. slabs, pages & chunks
  • 37. 250 bajtów per klucz 1048576 bajtów per wartość
  • 38. dane ulotne jak motyle :)
  • 39. poszczególne serwery memcached nic nie wiedza o swoim istnieniu
  • 40. potrzeba cudu lub...
  • 41. ...biblioteki klienckie...
  • 42. Spymemcached https://code.google.com/p/spymemcached/ Xmemcached https://code.google.com/p/xmemcached/
  • 43. import net.spy.memcached.MemcachedClient; public static void main(String[] args) throws Exception { MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.56.56", 11211)); client.set("data", 600, new Date()); System.out.println(client.get("data")); client.delete("data"); }
  • 44. … lub serwery proxy...
  • 45. twemproxy moxi
  • 46. M x N połaczeń lub „single point of failure”
  • 47. ...redis...
  • 48. ...to nie serwer cache...
  • 49. ...to baza NoSQL...
  • 50. ...a tak naprawdę to … „data structure server” - redis.io
  • 51. ...z możliwościa ustawienia czasu wygaśnięcia...
  • 52. ...czy to czyni z niego serwer cache?...
  • 53. ubuntu@ubuntu:~$ redis-cli redis 127.0.0.1:6379> setex klucz 6000 wartosc OK redis 127.0.0.1:6379> get klucz "wartosc" redis 127.0.0.1:6379> del klucz (integer) 1 redis 127.0.0.1:6379> get klucz (nil) redis 127.0.0.1:6379>
  • 54. ...replikacja...
  • 55. ...persystencja...
  • 56. „append only file” vs „snapshotting”
  • 57. ...transakcje?...
  • 58. ...transakcje?...
  • 59. Jedis https://github.com/xetorthio/jedis Jredis https://github.com/alphazero/jredis RJC https://github.com/e-mzungu/rjc Redis-protocol https://github.com/spullara/redis-protocol Lettuce https://github.com/wg/lettuce
  • 60. ...high availability?...
  • 61. ...redis sentinel... this autumn coming soon
  • 62. ...ehcache...
  • 63. ...JVM...
  • 64. import net.sf.ehcache.CacheManager; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; public class LocalCache { public static void main(String[] args) { CacheManager cacheManager = CacheManager.create(); Ehcache cache = cacheManager.addCacheIfAbsent("users"); Element element = new Element("klucz", "wartosc"); element.setTimeToIdle(1000); element.setTimeToLive(10000); cache.put(element); System.out.println(cache.get("klucz")); cache.remove("klucz"); } }
  • 65. ...replikacja, dystrybucja, masturbacja...
  • 66. RMI, multicast, JGroups, JMS
  • 67. ...transakcyjny..
  • 68. ...cache offloading.. filesystem
  • 69. ...jeśli nie JVM?... to co ?
  • 70. import requests print requests.get("http://.../ehcache/rest/sampleCache2/1").text print requests.put("http://.../ehcache/rest/sampleCache2/1","Hello world!") print requests.delete("http://.../ehcache/rest/sampleCache2/1")
  • 71. BigMemory DirectByteBuffer sun.misc.Unsafe
  • 72. ...bye bye GC...
  • 73. bitbucket://kcrimson/hipcache Implementacja memcached na JVM, z wykorzystaniem DirectByteBuffer
  • 74. ...infinispan...
  • 75. ...czy to cache...
  • 76. ...czy to „data grid”...
  • 77. ...transakcyjny... JTA
  • 78. ...replikowany kontra rozproszony... JGroups
  • 79. ...rozproszony... hashOwners
  • 80. ...persystentny... file RDBMS S3
  • 81. …”cloud ready”...
  • 82. …kolorowy zawrót głowy...
  • 83. Tree API Query API Group API
  • 84. …”HotRod server”... binary REST memcached
  • 85. …co więc warto...
  • 86. …database cache...
  • 87. …Hibernate, JPA i @Cache...
  • 88. …session level cache... hibernate.cache.provider_class
  • 89. …second level cache... hibernate.cache.use_second_level_cache=true
  • 90. import javax.persistence.Cacheable; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @Entity @Table(name = "albums") @Cacheable @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Album implements Serializable { @ManyToMany @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set<Artist> artists; }
  • 91. …query cache... hibernate.cache.use_query_cache=true
  • 92. Query query = …; query.setCacheable(true); List result = query.list();
  • 93. …application cache...
  • 94. if key is in cache: return value else: value = method(key) cache.put(key,value) return value
  • 95. JSR 107 || Spring Declarative Cache
  • 96. @Cacheable(value="books", key="isbn.rawNumber") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) @Cacheable(value="books", condition="name.length < 32", unless="result.hardback") public Book findBook(String name)
  • 97. …frontend cache... serwer czy klient?
  • 98. Apache + mod_cache Ngnix Varnish Squid
  • 99. ...a co gdy to aplikacja powinna mieć kontrolę nad cache...
  • 100. Conditional GET
  • 101. ETag 304 Not Modified
  • 102. public Response getOrder(@PathParam("id") String id, @Context Request request) { Order order = orderDAO.findOne(Long.valueOf(id)); if (order == null) { return status(Status.NOT_FOUND).build(); } EntityTag etag = EntityTag.valueOf(md5Crypt(reflectionToString(order).getBytes())); ResponseBuilder preconditions = request.evaluatePreconditions(etag); if (preconditions != null) { // response has not changed return preconditions.build(); } OrdersListResponseDTO orders = new OrdersListResponseDTO(); OrderDTO orderDTO = new OrderDTO(order); orders.addOrder(orderDTO); return ok(orders).entity(etag).build(); }
  • 103. Q&A