Домой Учебники по Java и J2EE Как создать простой кэш в памяти в Java (Lightweight Cache)

Как создать простой кэш в памяти в Java (Lightweight Cache)

2358
0

Высокая производительность масштабируемые веб — приложения часто используют распределенный в памяти кэш данных перед или вместо надежного постоянного хранения для некоторых задач. В Java-приложениях очень часто используется в кэш-памяти для повышения производительности . Но что такое «кэш»?

Кеш — это область локальной памяти, в которой хранится копия часто используемых данных, которую в противном случае дорого получить или вычислить. Примеры таких данных включают в себя результат запроса к базе данных, файл на диске или отчет.

Давайте посмотрим на создание и использование простого thread-safe Кэш Java в памяти.

Вот характеристика программы CrunchifyInMemoryCache.java ,

  • Срок действия предметов истекает в зависимости от времени жизни.
  • Кэш сохранит последние использованные элементы, если вы попытаетесь добавить больше элементов, чем указано максимально. ( общие коллекции apache имеют LRUMap , который удаляет наименее используемые записи с карты фиксированного размера )
  • Для истечения срока действия предметов мы можем пометить время последнего доступа и в отдельном потоке удалить предметы, когда будет достигнут лимит времени жизни. Это хорошо для уменьшения нагрузки на память для приложений, которые имеют длительный период простоя между доступом к кэшированным объектам.
  • Мы также создадим тестовый класс: CrunchifyInMemoryCacheTest.java

Если у вас есть какие-либо из нижеперечисленных вопросов / проблем, тогда эта простая реализация Cache для вас:

  • кэширование — легкий API кеширования Java Object
  • кеширование — Ищем простой Java кеш в памяти
  • Как создать потокобезопасный в кешировании памяти?
  • Простое кэширование для приложений Java
  • Простая система кэширования Java

Вот полный набросок пакета ..

Другие должны читать:

CrunchifyInMemoryCache.java

CrunchifyInMemoryCache.java

Джава
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
пакет ком . crunchify. учебные пособия ;
Импортировать Java. Util. ArrayList ;
Импортировать орг. апач . Общин. коллекции . MapIterator ;
Импортировать орг. апач . Общин. коллекции . карта. LRUMap ;
/ **
* @author Crunchify.com
* /
общественности учебный класс CrunchifyInMemoryCache < K , T > {
     частный долго timeToLive ;
     частный LRUMap crunchifyCacheMap ;
     защищенный учебный класс CrunchifyCacheObject {
         общественности долго lastAccessed знак равно Система. currentTimeMillis ( ) ;
         общественности T стоимость ;
         защищенный CrunchifyCacheObject ( T ценность ) {
             это. значение знак равно стоимость ;
         }
     }
     общественности CrunchifyInMemoryCache ( long crunchifyTimeToLive , окончательный долго crunchifyTimerInterval , ИНТ maxItems ) {
         это. время жить знак равно crunchifyTimeToLive * 1000 ;
         crunchifyCacheMap знак равно новый LRUMap ( maxItems ) ;
         если ( timeToLive > 0 && crunchifyTimerInterval> 0) {
Поток t = новый поток (новый Runnable () {
public void run () {
while (true) {
пытаться {
Thread.sleep (crunchifyTimerInterval * 1000);
                         } ловить ( InterruptedException ex ) {
                         }
                         очистка ( ) ;
                     }
                 }
             } ) ;
             т . setDaemon ( true ) ;
             т . начало ( ) ;
         }
     }
     общественности недействительным положить ( K ключ , T ценность ) {
         синхронизированный ( crunchifyCacheMap ) {
             crunchifyCacheMap . положить ( ключ , новый CrunchifyCacheObject ( value ) ) ;
         }
     }
     @SuppressWarnings ( не проверено )
     общественности T получить ( K ключ ) {
         синхронизированный ( crunchifyCacheMap ) {
             CrunchifyCacheObject с знак равно ( CrunchifyCacheObject ) crunchifyCacheMap . получить ( ключ ) ;
             если ( с == ноль )
                 вернуть ноль ;
             еще {
                 с . lastAccessed знак равно Система. currentTimeMillis ( ) ;
                 вернуть с . стоимость ;
             }
         }
     }
     общественности недействительным удалить ( K ключ ) {
         синхронизированный ( crunchifyCacheMap ) {
             crunchifyCacheMap . удалить ( ключ ) ;
         }
     }
     общественности ИНТ размер ( ) {
         синхронизированный ( crunchifyCacheMap ) {
             вернуть crunchifyCacheMap . размер ( ) ;
         }
     }
     @SuppressWarnings ( не проверено )
     общественности недействительным очистка ( ) {
         долго сейчас знак равно Система. currentTimeMillis ( ) ;
         ArrayList DeleteKey знак равно ноль ;
         синхронизированный ( crunchifyCacheMap ) {
             MapIterator itr знак равно crunchifyCacheMap . mapIterator ( ) ;
             DeleteKey знак равно новый ArrayList ( ( crunchifyCacheMap . Size ( ) / 2 ) + 1 ) ;
             К ключ знак равно ноль ;
             CrunchifyCacheObject с знак равно ноль ;
             в то время как ( итр . hasNext ( ) ) {
                 ключ знак равно ( К ) итр . следующий ( ) ;
                 с знак равно ( CrunchifyCacheObject ) итр . getValue ( ) ;
                 если ( с ! знак равно ноль && (сейчас> (timeToLive + c.lastAccessed))) {
deleteKey.add (ключ);
                 }
             }
         }
         за ( К ключ : deleteKey ) {
             синхронизированный ( crunchifyCacheMap ) {
                 crunchifyCacheMap . удалить ( ключ ) ;
             }
             Thread. yield ( ) ;
         }
     }
}

CrunchifyInMemoryCacheTest.java

(проверьте все комментарии внутри для понимания)

crunchifyTestAddRemoveObjects.java

Джава
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
пакет ком . crunchify. учебные пособия ;
Импортировать ком . crunchify. учебники . CrunchifyInMemoryCache ;
/ **
* @author Crunchify.com
* /
общественности учебный класс CrunchifyInMemoryCacheTest {
     общественности статический недействительным main ( Строка [ ] аргументы ) бросает InterruptedException {
         CrunchifyInMemoryCacheTest crunchifyCache знак равно новый CrunchifyInMemoryCacheTest ( ) ;
         Система. вне. println ( / n / n ========== Test1: crunchifyTestAddRemoveObjects ========== ) ;
         crunchifyCache . crunchifyTestAddRemoveObjects ( ) ;
         Система. вне. println ( / n / n ========== Test2: crunchifyTestExpiredCacheObjects ========== ) ;
         crunchifyCache . crunchifyTestExpiredCacheObjects ( ) ;
         Система. вне. println ( / n / n ========== Test3: crunchifyTestObjectsCleanupTime ========== ) ;
         crunchifyCache . crunchifyTestObjectsCleanupTime ( ) ;
     }
     частный недействительным crunchifyTestAddRemoveObjects ( ) {
         // Тест с crunchifyTimeToLive = 200 секунд
         // crunchifyTimerInterval = 500 секунд
         // maxItems = 6
         CrunchifyInMemoryCache < String , Строка > кэш знак равно новый CrunchifyInMemoryCache < String , Строка > ( 200 , 500 , 6 ) ;
         кеш . положить ( eBay , eBay ) ;
         кеш . положить ( Paypal , «Paypal» ) ;
         кеш . положить ( Google , Гугл ) ;
         кеш . положить ( Microsoft , «Microsoft» ) ;
         кеш . положить ( IBM , «IBM» ) ;
         кеш . положить ( Facebook , «Фейсбук» ) ;
         Система. вне. println ( 6 объектов кэша добавлено .. cache.size (): + кеш . размер ( ) ) ;
         кеш . удалить ( «IBM» ) ;
         Система. вне. println ( Один объект удален .. cache.size (): + кеш . размер ( ) ) ;
         кеш . положить ( «Твиттер» , «Твиттер» ) ;
         кеш . положить ( «SAP» , «SAP» ) ;
         Система. вне. println ( Два объекта добавлены, но достигли maxItems .. cache.size (): + кеш . размер ( ) ) ;
     }
     частный недействительным crunchifyTestExpiredCacheObjects ( ) бросает InterruptedException {
         // Тест с crunchifyTimeToLive = 1 секунда
         // crunchifyTimerInterval = 1 секунда
         // maxItems = 10
         CrunchifyInMemoryCache < String , Строка > кэш знак равно новый CrunchifyInMemoryCache < String , Строка > ( 1 , 1 , 10 ) ;
         кеш . положить ( eBay , eBay ) ;
         кеш . положить ( Paypal , «Paypal» ) ;
         // Добавление 3 секунд сна. Оба вышеуказанных объекта будут удалены из
         // Кэшируем из-за значения timeToLiveInSeconds
         Thread. сон ( 3000 ) ;
         Система. вне. println ( «Два объекта добавлены, но достигнут timeToLive. cache.size ():» + кеш . размер ( ) ) ;
     }
     частный недействительным crunchifyTestObjectsCleanupTime ( ) бросает InterruptedException {
         ИНТ размер знак равно 500000 ;
         // Тест с timeToLiveInSeconds = 100 секунд
         // timerIntervalInSeconds = 100 секунд
         // maxItems = 500000
         CrunchifyInMemoryCache < String , Строка > кэш знак равно новый CrunchifyInMemoryCache < String , Строка > ( 100 , 100 , 500000 ) ;
         за ( int я знак равно 0 ; я < размер ; я ++ ) {
             строка значение знак равно Integer. toString ( i ) ;
             кеш . положить ( значение , значение ) ;
         }
         Thread. сон ( 200 ) ;
         долго Начните знак равно Система. currentTimeMillis ( ) ;
         кеш . очистка ( ) ;
         двойной Конец знак равно ( двойной ) ( Система . CurrentTimeMillis ( ) начать ) / 1000,0 ;
         Система. вне. println ( «Время очистки для» + размер + объекты + Конец + с ) ;
     }
}

Выход:

1
2
3
4
5
6
7
8
9
10
========== Test1 : crunchifyTestAddRemoveObjects ==========
6 Cache Object Добавлен. , кеш . размер ( ) : 6
Один объект удален. , кеш . размер ( ) : 5
Два объекта добавлены, но достигли максимума . , кеш . размер ( ) : 6
========== Test2 : crunchifyTestExpiredCacheObjects ==========
Два объекта будут добавлены , но достигли TimeToLive. кеш . размер ( ) : 0
========== Test3 : crunchifyTestObjectsCleanupTime ==========
Время очистки для +500000 объекты +0,025 s

Ура … !! Удачного кодирования ..

Как создать простой кэш в памяти в Java (Lightweight Cache)

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Исключение в потоке «main» java.lang.UnsupportedClassVersionError: com / crunchify / Main: Неподдерживаемая версия major.minor 51.0

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь