@@ -18,6 +18,7 @@ use deadpool_redis::redis::aio::ConnectionLike;
18
18
use deadpool_redis:: redis:: cmd;
19
19
use futures:: FutureExt ;
20
20
use futures:: future;
21
+ use serde:: Deserialize ;
21
22
use serde:: Serialize ;
22
23
use serde:: de:: DeserializeOwned ;
23
24
use tracing:: Level ;
@@ -99,6 +100,19 @@ impl ConnectionLike for ValkeyConnection {
99
100
}
100
101
}
101
102
103
+ #[ derive( Clone , Serialize ) ]
104
+ struct ZaddWrapper < ' a , M : Serialize > {
105
+ member : & ' a M ,
106
+ nonce : u64 ,
107
+ }
108
+
109
+ #[ derive( Clone , Deserialize ) ]
110
+ struct ZrangebyscoreWrapper < M > {
111
+ member : M ,
112
+ #[ expect( dead_code) ]
113
+ nonce : u64 ,
114
+ }
115
+
102
116
impl ValkeyConnection {
103
117
/// Get a deserializable value from valkey
104
118
#[ tracing:: instrument( name = "cache:json_get" , skip( self ) , err) ]
@@ -278,14 +292,15 @@ impl ValkeyConnection {
278
292
pub async fn json_zadd <
279
293
K : Debug + ToRedisArgs + Send + Sync ,
280
294
S : ToRedisArgs + Send + Sync ,
281
- M : Serialize ,
295
+ M : Serialize + ToOwned ,
282
296
> (
283
297
& mut self ,
284
298
key : K ,
285
299
member : & M ,
286
300
score : S ,
287
301
) -> Result < ( ) > {
288
- let str_member = match serde_json:: to_string ( member) {
302
+ let member = ZaddWrapper { member, nonce : rand:: random ( ) } ;
303
+ let str_member = match serde_json:: to_string ( & member) {
289
304
Ok ( member) => member,
290
305
Err ( _) => {
291
306
return Err ( RedisError :: from ( (
@@ -317,8 +332,8 @@ impl ValkeyConnection {
317
332
let deserialized_members =
318
333
serialized_members
319
334
. into_iter ( )
320
- . filter_map ( |value| match serde_json:: from_str ( & value) {
321
- Ok ( value) => Some ( value) ,
335
+ . map ( |value| match serde_json:: from_str :: < ZrangebyscoreWrapper < T > > ( & value) {
336
+ Ok ( value) => Some ( value. member ) ,
322
337
Err ( e) => {
323
338
tracing:: warn!(
324
339
"the cached value is not a valid JSON for type '{}': {e}" ,
0 commit comments