@@ -621,7 +621,7 @@ def _incr(
621
621
# if cached value or total value is greater than 64 bit signed
622
622
# integer.
623
623
# elif int is encoded. so redis sees the data as string.
624
- # In this situations redis will throw ResponseError
624
+ # In these situations redis will throw ResponseError
625
625
626
626
# try to keep TTL of key
627
627
timeout = self .ttl (key , version = version , client = client )
@@ -1103,7 +1103,7 @@ def touch(
1103
1103
1104
1104
def hset (
1105
1105
self ,
1106
- name : str ,
1106
+ name : KeyT ,
1107
1107
key : KeyT ,
1108
1108
value : EncodableT ,
1109
1109
version : Optional [int ] = None ,
@@ -1115,13 +1115,76 @@ def hset(
1115
1115
"""
1116
1116
if client is None :
1117
1117
client = self .get_client (write = True )
1118
+ key_name = self .make_key (name , version = version )
1118
1119
nkey = self .make_key (key , version = version )
1119
1120
nvalue = self .encode (value )
1120
- return int (client .hset (name , nkey , nvalue ))
1121
+ return int (client .hset (key_name , nkey , nvalue ))
1122
+
1123
+ def hsetnx (
1124
+ self ,
1125
+ name : KeyT ,
1126
+ key : KeyT ,
1127
+ value : EncodableT ,
1128
+ version : Optional [int ] = None ,
1129
+ client : Optional [Redis ] = None ,
1130
+ ) -> int :
1131
+ if client is None :
1132
+ client = self .get_client (write = True )
1133
+ nkey = self .make_key (key , version = version )
1134
+ key_name = self .make_key (name , version = version )
1135
+ nvalue = self .encode (value )
1136
+ return int (client .hsetnx (key_name , nkey , nvalue ))
1137
+
1138
+ def hget (
1139
+ self ,
1140
+ name : KeyT ,
1141
+ key : KeyT ,
1142
+ version : Optional [int ] = None ,
1143
+ client : Optional [Redis ] = None ,
1144
+ ) -> Any :
1145
+ """
1146
+ Return the value of hash name at key.
1147
+ """
1148
+ if client is None :
1149
+ client = self .get_client (write = False )
1150
+ name = self .make_key (name , version = version )
1151
+ nkey = self .make_key (key , version = version )
1152
+ value = client .hget (name , nkey )
1153
+ if value is None :
1154
+ return None
1155
+ return self .decode (value )
1156
+
1157
+ def hgetall (
1158
+ self ,
1159
+ name : KeyT ,
1160
+ version : Optional [int ] = None ,
1161
+ client : Optional [Redis ] = None ,
1162
+ ) -> Dict [str , Any ]:
1163
+
1164
+ if client is None :
1165
+ client = self .get_client (write = False )
1166
+ name = self .make_key (name , version = version )
1167
+ data = client .hgetall (name )
1168
+ return {self .reverse_key (k .decode ()): self .decode (v ) for k , v in data .items ()}
1169
+
1170
+ def hmget (
1171
+ self ,
1172
+ name : KeyT ,
1173
+ * keys : KeyT ,
1174
+ version : Optional [int ] = None ,
1175
+ client : Optional [Redis ] = None ,
1176
+ ) -> List [Any ]:
1177
+ if client is None :
1178
+ client = self .get_client (write = False )
1179
+ name = self .make_key (name , version = version )
1180
+ nkeys = [self .make_key (k , version = version ) for k in keys ]
1181
+ return [
1182
+ self .decode (v ) if v is not None else None for v in client .hmget (name , nkeys )
1183
+ ]
1121
1184
1122
1185
def hdel (
1123
1186
self ,
1124
- name : str ,
1187
+ name : KeyT ,
1125
1188
key : KeyT ,
1126
1189
version : Optional [int ] = None ,
1127
1190
client : Optional [Redis ] = None ,
@@ -1132,39 +1195,44 @@ def hdel(
1132
1195
"""
1133
1196
if client is None :
1134
1197
client = self .get_client (write = True )
1198
+ name = self .make_key (name , version = version )
1135
1199
nkey = self .make_key (key , version = version )
1136
1200
return int (client .hdel (name , nkey ))
1137
1201
1138
1202
def hlen (
1139
1203
self ,
1140
- name : str ,
1204
+ name : KeyT ,
1205
+ version : Optional [int ] = None ,
1141
1206
client : Optional [Redis ] = None ,
1142
1207
) -> int :
1143
1208
"""
1144
1209
Return the number of items in hash name.
1145
1210
"""
1146
1211
if client is None :
1147
1212
client = self .get_client (write = False )
1148
- return int (client .hlen (name ))
1213
+ key_name = self .make_key (name , version = version )
1214
+ return int (client .hlen (key_name ))
1149
1215
1150
1216
def hkeys (
1151
1217
self ,
1152
- name : str ,
1218
+ name : KeyT ,
1219
+ version : Optional [int ] = None ,
1153
1220
client : Optional [Redis ] = None ,
1154
1221
) -> List [Any ]:
1155
1222
"""
1156
1223
Return a list of keys in hash name.
1157
1224
"""
1225
+ key_name = self .make_key (name , version = version )
1158
1226
if client is None :
1159
1227
client = self .get_client (write = False )
1160
1228
try :
1161
- return [self .reverse_key (k .decode ()) for k in client .hkeys (name )]
1229
+ return [self .reverse_key (k .decode ()) for k in client .hkeys (key_name )]
1162
1230
except _main_exceptions as e :
1163
1231
raise ConnectionInterrupted (connection = client ) from e
1164
1232
1165
1233
def hexists (
1166
1234
self ,
1167
- name : str ,
1235
+ name : KeyT ,
1168
1236
key : KeyT ,
1169
1237
version : Optional [int ] = None ,
1170
1238
client : Optional [Redis ] = None ,
@@ -1174,5 +1242,26 @@ def hexists(
1174
1242
"""
1175
1243
if client is None :
1176
1244
client = self .get_client (write = False )
1245
+ key_name = self .make_key (name , version = version )
1177
1246
nkey = self .make_key (key , version = version )
1178
- return bool (client .hexists (name , nkey ))
1247
+ return bool (client .hexists (key_name , nkey ))
1248
+
1249
+ def hincrby (
1250
+ self ,
1251
+ name : KeyT ,
1252
+ key : KeyT ,
1253
+ increment : int = 1 ,
1254
+ version : Optional [int ] = None ,
1255
+ client : Optional [Redis ] = None ,
1256
+ ) -> int :
1257
+ if client is None :
1258
+ client = self .get_client (write = True )
1259
+ key_name = self .make_key (name , version = version )
1260
+ nkey = self .make_key (key , version = version )
1261
+ try :
1262
+ value = client .hincrby (key_name , nkey , increment )
1263
+ except ResponseError as exc :
1264
+ value = self .hget (key_name , nkey )
1265
+ msg = f"Value: { value } is not an integer or out of range."
1266
+ raise ValueError (msg ) from exc
1267
+ return int (value )
0 commit comments