1
1
import random
2
2
import socket
3
3
import time
4
- from collections import OrderedDict
5
- from typing import Tuple , Any
4
+ from typing import Tuple , Any , Iterable
6
5
7
6
from django .conf import settings
8
7
from valkey import Valkey
9
8
from valkey .exceptions import ConnectionError , ResponseError , TimeoutError
10
9
from valkey .typing import KeyT , EncodableT
11
10
12
- from django_valkey .base_client import DEFAULT_TIMEOUT
11
+ from django_valkey .base_client import DEFAULT_TIMEOUT , Backend
13
12
from django_valkey .client .default import DefaultClient
14
13
from django_valkey .exceptions import ConnectionInterrupted
15
14
@@ -113,13 +112,16 @@ def get_many(self, keys, version=None, client=None):
113
112
if not keys :
114
113
return {}
115
114
116
- recovered_data = OrderedDict ()
115
+ recovered_data = {}
117
116
118
117
new_keys = [self .make_key (key , version = version ) for key in keys ]
119
118
map_keys = dict (zip (new_keys , keys ))
120
119
121
120
try :
122
- results = client .mget (* new_keys )
121
+ pipeline = client .pipeline ()
122
+ for key in new_keys :
123
+ pipeline .get (key )
124
+ results = pipeline .execute ()
123
125
except _main_exceptions as e :
124
126
raise ConnectionInterrupted (connection = client ) from e
125
127
@@ -132,6 +134,32 @@ def get_many(self, keys, version=None, client=None):
132
134
133
135
return recovered_data
134
136
137
+ def mget (
138
+ self ,
139
+ keys : Iterable [KeyT ],
140
+ version : int | None = None ,
141
+ client : Backend | Any | None = None ,
142
+ ) -> dict :
143
+ client = self ._get_client (write = False , client = client )
144
+ if not keys :
145
+ return {}
146
+
147
+ recovered_data = {}
148
+
149
+ new_keys = [self .make_key (key , version = version ) for key in keys ]
150
+
151
+ try :
152
+ results = client .mget (new_keys )
153
+ except _main_exceptions as e :
154
+ raise ConnectionInterrupted (connection = client ) from e
155
+
156
+ for key , value in zip (keys , results ):
157
+ if value is None :
158
+ continue
159
+ val , refresh = self ._unpack (self .decode (value ))
160
+ recovered_data [key ] = None if refresh else val
161
+ return recovered_data
162
+
135
163
def set_many (
136
164
self , data , timeout = DEFAULT_TIMEOUT , version = None , client = None , herd = True
137
165
):
0 commit comments