Skip to content

Commit 2354718

Browse files
authored
Support for client-side caching (#107)
* Add ValkeyCommand.isReadOnly * Add support for reading invalidate push token * Add function for reading cache invalidations * Add tests * subscribeInvalidations -> subscribeKeyInvalidations * sending Value
1 parent 3588356 commit 2354718

19 files changed

+306
-6
lines changed

Sources/Valkey/Commands/BitmapCommands.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ public struct BITCOUNT: ValkeyCommand {
9191

9292
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
9393

94+
public var isReadOnly: Bool { true }
95+
9496
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
9597
commandEncoder.encodeArray("BITCOUNT", key, range)
9698
}
@@ -292,6 +294,8 @@ public struct BITFIELDRO: ValkeyCommand {
292294

293295
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
294296

297+
public var isReadOnly: Bool { true }
298+
295299
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
296300
commandEncoder.encodeArray("BITFIELD_RO", key, RESPWithToken("GET", getBlock))
297301
}
@@ -408,6 +412,8 @@ public struct BITPOS: ValkeyCommand {
408412

409413
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
410414

415+
public var isReadOnly: Bool { true }
416+
411417
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
412418
commandEncoder.encodeArray("BITPOS", key, bit, range)
413419
}
@@ -427,6 +433,8 @@ public struct GETBIT: ValkeyCommand {
427433

428434
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
429435

436+
public var isReadOnly: Bool { true }
437+
430438
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
431439
commandEncoder.encodeArray("GETBIT", key, offset)
432440
}

Sources/Valkey/Commands/GenericCommands.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public enum OBJECT {
3636

3737
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
3838

39+
public var isReadOnly: Bool { true }
40+
3941
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
4042
commandEncoder.encodeArray("OBJECT", "ENCODING", key)
4143
}
@@ -53,6 +55,8 @@ public enum OBJECT {
5355

5456
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
5557

58+
public var isReadOnly: Bool { true }
59+
5660
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
5761
commandEncoder.encodeArray("OBJECT", "FREQ", key)
5862
}
@@ -82,6 +86,8 @@ public enum OBJECT {
8286

8387
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
8488

89+
public var isReadOnly: Bool { true }
90+
8591
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
8692
commandEncoder.encodeArray("OBJECT", "IDLETIME", key)
8793
}
@@ -99,6 +105,8 @@ public enum OBJECT {
99105

100106
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
101107

108+
public var isReadOnly: Bool { true }
109+
102110
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
103111
commandEncoder.encodeArray("OBJECT", "REFCOUNT", key)
104112
}
@@ -158,6 +166,8 @@ public struct DUMP: ValkeyCommand {
158166

159167
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
160168

169+
public var isReadOnly: Bool { true }
170+
161171
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
162172
commandEncoder.encodeArray("DUMP", key)
163173
}
@@ -175,6 +185,8 @@ public struct EXISTS: ValkeyCommand {
175185

176186
public var keysAffected: [ValkeyKey] { key }
177187

188+
public var isReadOnly: Bool { true }
189+
178190
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
179191
commandEncoder.encodeArray("EXISTS", key)
180192
}
@@ -272,6 +284,8 @@ public struct EXPIRETIME: ValkeyCommand {
272284

273285
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
274286

287+
public var isReadOnly: Bool { true }
288+
275289
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
276290
commandEncoder.encodeArray("EXPIRETIME", key)
277291
}
@@ -287,6 +301,8 @@ public struct KEYS: ValkeyCommand {
287301
self.pattern = pattern
288302
}
289303

304+
public var isReadOnly: Bool { true }
305+
290306
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
291307
commandEncoder.encodeArray("KEYS", pattern)
292308
}
@@ -513,6 +529,8 @@ public struct PEXPIRETIME: ValkeyCommand {
513529

514530
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
515531

532+
public var isReadOnly: Bool { true }
533+
516534
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
517535
commandEncoder.encodeArray("PEXPIRETIME", key)
518536
}
@@ -530,6 +548,8 @@ public struct PTTL: ValkeyCommand {
530548

531549
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
532550

551+
public var isReadOnly: Bool { true }
552+
533553
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
534554
commandEncoder.encodeArray("PTTL", key)
535555
}
@@ -542,6 +562,8 @@ public struct RANDOMKEY: ValkeyCommand {
542562
@inlinable public init() {
543563
}
544564

565+
public var isReadOnly: Bool { true }
566+
545567
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
546568
commandEncoder.encodeArray("RANDOMKEY")
547569
}
@@ -626,6 +648,8 @@ public struct SCAN: ValkeyCommand {
626648
self.type = type
627649
}
628650

651+
public var isReadOnly: Bool { true }
652+
629653
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
630654
commandEncoder.encodeArray("SCAN", cursor, RESPWithToken("MATCH", pattern), RESPWithToken("COUNT", count), RESPWithToken("TYPE", type))
631655
}
@@ -750,6 +774,8 @@ public struct SORTRO: ValkeyCommand {
750774

751775
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
752776

777+
public var isReadOnly: Bool { true }
778+
753779
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
754780
commandEncoder.encodeArray("SORT_RO", key, RESPWithToken("BY", byPattern), RESPWithToken("LIMIT", limit), RESPWithToken("GET", getPattern), order, RESPPureToken("ALPHA", sorting))
755781
}
@@ -767,6 +793,8 @@ public struct TOUCH: ValkeyCommand {
767793

768794
public var keysAffected: [ValkeyKey] { key }
769795

796+
public var isReadOnly: Bool { true }
797+
770798
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
771799
commandEncoder.encodeArray("TOUCH", key)
772800
}
@@ -784,6 +812,8 @@ public struct TTL: ValkeyCommand {
784812

785813
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
786814

815+
public var isReadOnly: Bool { true }
816+
787817
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
788818
commandEncoder.encodeArray("TTL", key)
789819
}
@@ -801,6 +831,8 @@ public struct TYPE: ValkeyCommand {
801831

802832
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
803833

834+
public var isReadOnly: Bool { true }
835+
804836
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
805837
commandEncoder.encodeArray("TYPE", key)
806838
}

Sources/Valkey/Commands/GeoCommands.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ public struct GEODIST<Member1: RESPStringRenderable, Member2: RESPStringRenderab
120120

121121
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
122122

123+
public var isReadOnly: Bool { true }
124+
123125
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
124126
commandEncoder.encodeArray("GEODIST", key, RESPBulkString(member1), RESPBulkString(member2), unit)
125127
}
@@ -139,6 +141,8 @@ public struct GEOHASH: ValkeyCommand {
139141

140142
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
141143

144+
public var isReadOnly: Bool { true }
145+
142146
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
143147
commandEncoder.encodeArray("GEOHASH", key, member)
144148
}
@@ -158,6 +162,8 @@ public struct GEOPOS: ValkeyCommand {
158162

159163
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
160164

165+
public var isReadOnly: Bool { true }
166+
161167
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
162168
commandEncoder.encodeArray("GEOPOS", key, member)
163169
}
@@ -461,6 +467,8 @@ public struct GEORADIUSBYMEMBERRO<Member: RESPStringRenderable>: ValkeyCommand {
461467

462468
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
463469

470+
public var isReadOnly: Bool { true }
471+
464472
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
465473
commandEncoder.encodeArray("GEORADIUSBYMEMBER_RO", key, RESPBulkString(member), radius, unit, RESPPureToken("WITHCOORD", withcoord), RESPPureToken("WITHDIST", withdist), RESPPureToken("WITHHASH", withhash), countBlock, order)
466474
}
@@ -550,6 +558,8 @@ public struct GEORADIUSRO: ValkeyCommand {
550558

551559
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
552560

561+
public var isReadOnly: Bool { true }
562+
553563
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
554564
commandEncoder.encodeArray("GEORADIUS_RO", key, longitude, latitude, radius, unit, RESPPureToken("WITHCOORD", withcoord), RESPPureToken("WITHDIST", withdist), RESPPureToken("WITHHASH", withhash), countBlock, order)
555565
}
@@ -757,6 +767,8 @@ public struct GEOSEARCH: ValkeyCommand {
757767

758768
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
759769

770+
public var isReadOnly: Bool { true }
771+
760772
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
761773
commandEncoder.encodeArray("GEOSEARCH", key, from, by, order, countBlock, RESPPureToken("WITHCOORD", withcoord), RESPPureToken("WITHDIST", withdist), RESPPureToken("WITHHASH", withhash))
762774
}

Sources/Valkey/Commands/HashCommands.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public struct HEXISTS<Field: RESPStringRenderable>: ValkeyCommand {
5555

5656
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
5757

58+
public var isReadOnly: Bool { true }
59+
5860
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
5961
commandEncoder.encodeArray("HEXISTS", key, RESPBulkString(field))
6062
}
@@ -74,6 +76,8 @@ public struct HGET<Field: RESPStringRenderable>: ValkeyCommand {
7476

7577
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
7678

79+
public var isReadOnly: Bool { true }
80+
7781
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
7882
commandEncoder.encodeArray("HGET", key, RESPBulkString(field))
7983
}
@@ -91,6 +95,8 @@ public struct HGETALL: ValkeyCommand {
9195

9296
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
9397

98+
public var isReadOnly: Bool { true }
99+
94100
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
95101
commandEncoder.encodeArray("HGETALL", key)
96102
}
@@ -148,6 +154,8 @@ public struct HKEYS: ValkeyCommand {
148154

149155
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
150156

157+
public var isReadOnly: Bool { true }
158+
151159
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
152160
commandEncoder.encodeArray("HKEYS", key)
153161
}
@@ -165,6 +173,8 @@ public struct HLEN: ValkeyCommand {
165173

166174
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
167175

176+
public var isReadOnly: Bool { true }
177+
168178
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
169179
commandEncoder.encodeArray("HLEN", key)
170180
}
@@ -184,6 +194,8 @@ public struct HMGET<Field: RESPStringRenderable>: ValkeyCommand {
184194

185195
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
186196

197+
public var isReadOnly: Bool { true }
198+
187199
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
188200
commandEncoder.encodeArray("HMGET", key, field.map { RESPBulkString($0) })
189201
}
@@ -260,6 +272,8 @@ public struct HRANDFIELD: ValkeyCommand {
260272

261273
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
262274

275+
public var isReadOnly: Bool { true }
276+
263277
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
264278
commandEncoder.encodeArray("HRANDFIELD", key, options)
265279
}
@@ -285,6 +299,8 @@ public struct HSCAN: ValkeyCommand {
285299

286300
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
287301

302+
public var isReadOnly: Bool { true }
303+
288304
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
289305
commandEncoder.encodeArray("HSCAN", key, cursor, RESPWithToken("MATCH", pattern), RESPWithToken("COUNT", count), RESPPureToken("NOVALUES", novalues))
290306
}
@@ -364,6 +380,8 @@ public struct HSTRLEN<Field: RESPStringRenderable>: ValkeyCommand {
364380

365381
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
366382

383+
public var isReadOnly: Bool { true }
384+
367385
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
368386
commandEncoder.encodeArray("HSTRLEN", key, RESPBulkString(field))
369387
}
@@ -381,6 +399,8 @@ public struct HVALS: ValkeyCommand {
381399

382400
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
383401

402+
public var isReadOnly: Bool { true }
403+
384404
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
385405
commandEncoder.encodeArray("HVALS", key)
386406
}

Sources/Valkey/Commands/HyperloglogCommands.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public struct PFCOUNT: ValkeyCommand {
5353

5454
public var keysAffected: [ValkeyKey] { key }
5555

56+
public var isReadOnly: Bool { true }
57+
5658
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
5759
commandEncoder.encodeArray("PFCOUNT", key)
5860
}

Sources/Valkey/Commands/ListCommands.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ public struct LINDEX: ValkeyCommand {
198198

199199
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
200200

201+
public var isReadOnly: Bool { true }
202+
201203
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
202204
commandEncoder.encodeArray("LINDEX", key, index)
203205
}
@@ -253,6 +255,8 @@ public struct LLEN: ValkeyCommand {
253255

254256
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
255257

258+
public var isReadOnly: Bool { true }
259+
256260
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
257261
commandEncoder.encodeArray("LLEN", key)
258262
}
@@ -382,6 +386,8 @@ public struct LPOS<Element: RESPStringRenderable>: ValkeyCommand {
382386

383387
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
384388

389+
public var isReadOnly: Bool { true }
390+
385391
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
386392
commandEncoder.encodeArray("LPOS", key, RESPBulkString(element), RESPWithToken("RANK", rank), RESPWithToken("COUNT", numMatches), RESPWithToken("MAXLEN", len))
387393
}
@@ -441,6 +447,8 @@ public struct LRANGE: ValkeyCommand {
441447

442448
public var keysAffected: CollectionOfOne<ValkeyKey> { .init(key) }
443449

450+
public var isReadOnly: Bool { true }
451+
444452
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
445453
commandEncoder.encodeArray("LRANGE", key, start, stop)
446454
}

Sources/Valkey/Commands/ScriptingCommands.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,8 @@ public struct EVALSHARO<Sha1: RESPStringRenderable>: ValkeyCommand {
352352

353353
public var keysAffected: [ValkeyKey] { key }
354354

355+
public var isReadOnly: Bool { true }
356+
355357
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
356358
commandEncoder.encodeArray("EVALSHA_RO", RESPBulkString(sha1), RESPArrayWithCount(key), arg)
357359
}
@@ -371,6 +373,8 @@ public struct EVALRO<Script: RESPStringRenderable>: ValkeyCommand {
371373

372374
public var keysAffected: [ValkeyKey] { key }
373375

376+
public var isReadOnly: Bool { true }
377+
374378
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
375379
commandEncoder.encodeArray("EVAL_RO", RESPBulkString(script), RESPArrayWithCount(key), arg)
376380
}
@@ -409,6 +413,8 @@ public struct FCALLRO<Function: RESPStringRenderable>: ValkeyCommand {
409413

410414
public var keysAffected: [ValkeyKey] { key }
411415

416+
public var isReadOnly: Bool { true }
417+
412418
@inlinable public func encode(into commandEncoder: inout ValkeyCommandEncoder) {
413419
commandEncoder.encodeArray("FCALL_RO", RESPBulkString(function), RESPArrayWithCount(key), arg)
414420
}

0 commit comments

Comments
 (0)