cachette 2.1.3 → 2.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { CachableValue, CacheInstance } from './CacheInstance';
|
|
2
2
|
/**
|
|
3
|
-
* Write-through cache, using Redis and a local LRU cache.
|
|
3
|
+
* Write-through cache, using Redis and a local LRU cache with aligned TTLs.
|
|
4
|
+
*
|
|
5
|
+
* **WARNING** if using this in a distributed app where cache consistency matters!
|
|
6
|
+
* Consider this case of an app with several servers/instances using WriteThroughCache:
|
|
7
|
+
* 1. Instance I1 sets key/value foo: bar (both local & redis)
|
|
8
|
+
* 2. Instance I2 gets value foo, populating its local cache with "bar"
|
|
9
|
+
* ----- At that moment, LocalCaches of I1 & I2 are aligned, foo: bar
|
|
10
|
+
* 3. Instance I1 deletes key foo (both local & redis)
|
|
11
|
+
* ----- At that moment, LocalCaches of I1 & I2 are *mis*aligned about foo!
|
|
12
|
+
* - I1 has nothing
|
|
13
|
+
* - I2 has "bar"
|
|
14
|
+
*
|
|
15
|
+
* -> This is fixable, e.g. using Redis pub/sub, to let clients subscribe to
|
|
16
|
+
* set/del events, and react with an eviction from their LocalCache.
|
|
17
|
+
* In the context where we cachette maintainers got bitten by this, it made
|
|
18
|
+
* sense to just abandon usage of WriteThroughCache, and switch the app with
|
|
19
|
+
* high consistency expectations from a WriteThroughCache to a RedisCache:
|
|
20
|
+
* +++: simpler, more consistent
|
|
21
|
+
* ---: a tolerable increase in Redis usage (CPU, network, latency)
|
|
22
|
+
*
|
|
23
|
+
* So, pub/sub remains unimplemented, but it would be a reasonable addition.
|
|
24
|
+
* API design consideration: set/dels maybe shouldn't *always* cause Redis
|
|
25
|
+
* publish (said differently, maybe not *all* set/dels should cause a
|
|
26
|
+
* LocalCache eviction, to limit pub/sub traffic explosion? Maybe, or maybe
|
|
27
|
+
* "pub/sub traffic explosion" is a non-concern? To be evaluated :)
|
|
4
28
|
*/
|
|
5
29
|
export declare class WriteThroughCache extends CacheInstance {
|
|
6
30
|
private redisCacheForWriting;
|
|
@@ -5,7 +5,31 @@ const CacheInstance_1 = require("./CacheInstance");
|
|
|
5
5
|
const RedisCache_1 = require("./RedisCache");
|
|
6
6
|
const LocalCache_1 = require("./LocalCache");
|
|
7
7
|
/**
|
|
8
|
-
* Write-through cache, using Redis and a local LRU cache.
|
|
8
|
+
* Write-through cache, using Redis and a local LRU cache with aligned TTLs.
|
|
9
|
+
*
|
|
10
|
+
* **WARNING** if using this in a distributed app where cache consistency matters!
|
|
11
|
+
* Consider this case of an app with several servers/instances using WriteThroughCache:
|
|
12
|
+
* 1. Instance I1 sets key/value foo: bar (both local & redis)
|
|
13
|
+
* 2. Instance I2 gets value foo, populating its local cache with "bar"
|
|
14
|
+
* ----- At that moment, LocalCaches of I1 & I2 are aligned, foo: bar
|
|
15
|
+
* 3. Instance I1 deletes key foo (both local & redis)
|
|
16
|
+
* ----- At that moment, LocalCaches of I1 & I2 are *mis*aligned about foo!
|
|
17
|
+
* - I1 has nothing
|
|
18
|
+
* - I2 has "bar"
|
|
19
|
+
*
|
|
20
|
+
* -> This is fixable, e.g. using Redis pub/sub, to let clients subscribe to
|
|
21
|
+
* set/del events, and react with an eviction from their LocalCache.
|
|
22
|
+
* In the context where we cachette maintainers got bitten by this, it made
|
|
23
|
+
* sense to just abandon usage of WriteThroughCache, and switch the app with
|
|
24
|
+
* high consistency expectations from a WriteThroughCache to a RedisCache:
|
|
25
|
+
* +++: simpler, more consistent
|
|
26
|
+
* ---: a tolerable increase in Redis usage (CPU, network, latency)
|
|
27
|
+
*
|
|
28
|
+
* So, pub/sub remains unimplemented, but it would be a reasonable addition.
|
|
29
|
+
* API design consideration: set/dels maybe shouldn't *always* cause Redis
|
|
30
|
+
* publish (said differently, maybe not *all* set/dels should cause a
|
|
31
|
+
* LocalCache eviction, to limit pub/sub traffic explosion? Maybe, or maybe
|
|
32
|
+
* "pub/sub traffic explosion" is a non-concern? To be evaluated :)
|
|
9
33
|
*/
|
|
10
34
|
class WriteThroughCache extends CacheInstance_1.CacheInstance {
|
|
11
35
|
redisCacheForWriting;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteThroughCache.js","sourceRoot":"","sources":["../../../src/lib/WriteThroughCache.ts"],"names":[],"mappings":";;;AAAA,mDAA+D;AAC/D,6CAA0C;AAC1C,6CAA0C;AAG1C
|
|
1
|
+
{"version":3,"file":"WriteThroughCache.js","sourceRoot":"","sources":["../../../src/lib/WriteThroughCache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cachette",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.5",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=18",
|
|
6
6
|
"npm": ">=9.5.0"
|
|
@@ -61,11 +61,11 @@
|
|
|
61
61
|
"@types/redlock": "4.x",
|
|
62
62
|
"@types/sinon": "17.x",
|
|
63
63
|
"chai": "4.x",
|
|
64
|
-
"eslint": "9.
|
|
64
|
+
"eslint": "9.10.0",
|
|
65
65
|
"mocha": "10.x",
|
|
66
66
|
"npm-audit-resolver": "^3.0.0-7",
|
|
67
67
|
"nyc": "17.x",
|
|
68
|
-
"sinon": "
|
|
68
|
+
"sinon": "19.x",
|
|
69
69
|
"source-map-support": "0.x",
|
|
70
70
|
"typescript": "5.x",
|
|
71
71
|
"typescript-eslint": "8.x"
|