|
| 1 | +// Atomic compare-and-set (CAS) and compare-and-delete (CAD) using digests |
| 2 | +// for single-key optimistic concurrency control. |
| 3 | +// Requires Redis 8.4+ and the @node-rs/xxhash package. |
| 4 | + |
| 5 | +import { createClient, digest } from 'redis'; |
| 6 | + |
| 7 | +const client = createClient(); |
| 8 | + |
| 9 | +await client.connect(); |
| 10 | + |
| 11 | +// Basic Digest Usage: get digest from Redis and verify with client-side calculation |
| 12 | +await client.set('mykey', 'myvalue'); |
| 13 | +const serverDigest = await client.digest('mykey'); |
| 14 | +const clientDigest = await digest('myvalue'); |
| 15 | +console.log(`Server digest: ${serverDigest}`); |
| 16 | +console.log(`Client digest: ${clientDigest}`); |
| 17 | +console.log(`Digests match: ${serverDigest === clientDigest}`); |
| 18 | + |
| 19 | +// Optimistic Locking with IFDEQ: update only if digest matches |
| 20 | +await client.set('mycounter', '100'); |
| 21 | +const currentDigest = await digest('100'); |
| 22 | + |
| 23 | +// Update only if digest matches |
| 24 | +const result1 = await client.set('mycounter', '150', { |
| 25 | + condition: 'IFDEQ', |
| 26 | + matchValue: currentDigest |
| 27 | +}); |
| 28 | +console.log(`Update with matching digest: ${result1}`); // 'OK' |
| 29 | + |
| 30 | +// IFDNE: update only if digest does NOT match |
| 31 | +await client.set('myversion', 'v1.0.0'); |
| 32 | +const unwantedDigest = await digest('v0.9.0'); |
| 33 | + |
| 34 | +const result2 = await client.set('myversion', 'v2.0.0', { |
| 35 | + condition: 'IFDNE', |
| 36 | + matchValue: unwantedDigest |
| 37 | +}); |
| 38 | +console.log(`Update when digest differs: ${result2}`); // 'OK' |
| 39 | + |
| 40 | +// Conditional Delete with DELEX |
| 41 | +await client.set('mysession', 'sessiondata'); |
| 42 | +const sessionDigest = await digest('sessiondata'); |
| 43 | + |
| 44 | +// Delete only if digest matches |
| 45 | +const deleted = await client.delEx('mysession', { |
| 46 | + condition: 'IFDEQ', |
| 47 | + matchValue: sessionDigest |
| 48 | +}); |
| 49 | +console.log(`Deleted with correct digest: ${deleted}`); // 1 |
| 50 | + |
| 51 | +client.close(); |
0 commit comments