Содержание
Высокая производительность масштабируемые веб — приложения часто используют распределенный в памяти кэш данных перед или вместо надежного постоянного хранения для некоторых задач. В Java-приложениях очень часто используется в кэш-памяти для повышения производительности . Но что такое «кэш»?
Кеш — это область локальной памяти, в которой хранится копия часто используемых данных, которую в противном случае дорого получить или вычислить. Примеры таких данных включают в себя результат запроса к базе данных, файл на диске или отчет.
Давайте посмотрим на создание и использование простого thread-safe Кэш Java в памяти.
Вот характеристика программы CrunchifyInMemoryCache.java ,
- Срок действия предметов истекает в зависимости от времени жизни.
- Кэш сохранит последние использованные элементы, если вы попытаетесь добавить больше элементов, чем указано максимально. ( общие коллекции apache имеют
LRUMap, который удаляет наименее используемые записи с карты фиксированного размера ) - Для истечения срока действия предметов мы можем пометить время последнего доступа и в отдельном потоке удалить предметы, когда будет достигнут лимит времени жизни. Это хорошо для уменьшения нагрузки на память для приложений, которые имеют длительный период простоя между доступом к кэшированным объектам.
- Мы также создадим тестовый класс:
CrunchifyInMemoryCacheTest.java
Если у вас есть какие-либо из нижеперечисленных вопросов / проблем, тогда эта простая реализация Cache для вас:
- кэширование — легкий API кеширования Java Object
- кеширование — Ищем простой Java кеш в памяти
- Как создать потокобезопасный в кешировании памяти?
- Простое кэширование для приложений Java
- Простая система кэширования Java
Вот полный набросок пакета ..
Другие должны читать:
- Java: Как найти повторяющиеся элементы из списка?
- 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
синхронизированный ( crunchifyCacheMap ) {
MapIterator itr знак равно crunchifyCacheMap . mapIterator ( ) ;
DeleteKey знак равно новый ArrayList
К ключ знак равно ноль ;
CrunchifyCacheObject с знак равно ноль ;
в то время как ( итр . hasNext ( ) ) {
ключ знак равно ( К ) итр . следующий ( ) ;
с знак равно ( CrunchifyCacheObject ) итр . getValue ( ) ;
если ( с ! знак равно ноль && (сейчас> (timeToLive + c.lastAccessed))) {
deleteKey.add (ключ);
}
}
}
за ( К ключ : deleteKey ) {
синхронизированный ( crunchifyCacheMap ) {
crunchifyCacheMap . удалить ( ключ ) ;
}
Thread. yield ( ) ;
}
}
}
|
CrunchifyInMemoryCacheTest.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
|
Ура … !! Удачного кодирования ..
0.00 (0%) 0 votes








