Skip to content

Commit 41f1808

Browse files
committed
jazzband#597 add support for the set functions
1 parent ad9cc78 commit 41f1808

File tree

4 files changed

+417
-2
lines changed

4 files changed

+417
-2
lines changed

django_redis/cache.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,71 @@ def touch(self, *args, **kwargs):
186186
return self.client.touch(*args, **kwargs)
187187

188188
@omit_exception
189+
def sadd(self, *args, **kwargs):
190+
return self.client.sadd(*args, **kwargs)
191+
192+
@omit_exception
193+
def scard(self, *args, **kwargs):
194+
return self.client.scard(*args, **kwargs)
195+
196+
@omit_exception
197+
def sdiff(self, *args, **kwargs):
198+
return self.client.sdiff(*args, **kwargs)
199+
200+
@omit_exception
201+
def sdiffstore(self, *args, **kwargs):
202+
return self.client.sdiffstore(*args, **kwargs)
203+
204+
@omit_exception
205+
def sinter(self, *args, **kwargs):
206+
return self.client.sinter(*args, **kwargs)
207+
208+
@omit_exception
209+
def sinterstore(self, *args, **kwargs):
210+
return self.client.sinterstore(*args, **kwargs)
211+
212+
@omit_exception
213+
def sismember(self, *args, **kwargs):
214+
return self.client.sismember(*args, **kwargs)
215+
216+
@omit_exception
217+
def smembers(self, *args, **kwargs):
218+
return self.client.smembers(*args, **kwargs)
219+
220+
@omit_exception
221+
def smove(self, *args, **kwargs):
222+
return self.client.smove(*args, **kwargs)
223+
224+
@omit_exception
225+
def spop(self, *args, **kwargs):
226+
return self.client.spop(*args, **kwargs)
227+
228+
@omit_exception
229+
def srandmember(self, *args, **kwargs):
230+
return self.client.srandmember(*args, **kwargs)
231+
232+
@omit_exception
233+
def srem(self, *args, **kwargs):
234+
return self.client.srem(*args, **kwargs)
235+
236+
@omit_exception
237+
def sscan(self, *args, **kwargs):
238+
return self.client.sscan(*args, **kwargs)
239+
@omit_exception
240+
def sscan_iter(self, *args, **kwargs):
241+
return self.client.sscan_iter(*args, **kwargs)
242+
243+
@omit_exception
244+
def smismember(self, *args, **kwargs):
245+
return self.client.smismember(*args, **kwargs)
246+
@omit_exception
247+
def sunion(self, *args, **kwargs):
248+
return self.client.sunion(*args, **kwargs)
249+
250+
@omit_exception
251+
def sunionstore(self, *args, **kwargs):
252+
return self.client.sunionstore(*args, **kwargs)
253+
@omit_exception
189254
def hset(self, *args, **kwargs):
190255
return self.client.hset(*args, **kwargs)
191256

django_redis/client/default.py

Lines changed: 241 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import socket
44
from collections import OrderedDict
55
from contextlib import suppress
6-
from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Union
6+
from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Union, Set
77

88
from django.conf import settings
99
from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache, get_key_func
@@ -778,6 +778,246 @@ def make_pattern(
778778

779779
return CacheKey(self._backend.key_func(pattern, prefix, version_str))
780780

781+
def sadd(
782+
self,
783+
key: Any,
784+
*values: Any,
785+
version: Optional[int] = None,
786+
client: Optional[Redis] = None,
787+
) -> int:
788+
if client is None:
789+
client = self.get_client(write=True)
790+
791+
key = self.make_key(key, version=version)
792+
values = [self.encode(value) for value in values]
793+
return int(client.sadd(key, *values))
794+
795+
def scard(
796+
self,
797+
key: Any,
798+
version: Optional[int] = None,
799+
client: Optional[Redis] = None,
800+
) -> int:
801+
if client is None:
802+
client = self.get_client(write=False)
803+
804+
key = self.make_key(key, version=version)
805+
return int(client.scard(key))
806+
807+
def sdiff(
808+
self,
809+
*keys,
810+
version: Optional[int] = None,
811+
client: Optional[Redis] = None,
812+
) -> set:
813+
if client is None:
814+
client = self.get_client(write=False)
815+
816+
keys = [self.make_key(key, version=version) for key in keys]
817+
return {self.decode(value) for value in client.sdiff(*keys)}
818+
819+
def sdiffstore(
820+
self,
821+
dest: Any,
822+
*keys,
823+
version_dest: Optional[int] = None,
824+
version_keys: Optional[int] = None,
825+
client: Optional[Redis] = None,
826+
) -> int:
827+
if client is None:
828+
client = self.get_client(write=True)
829+
830+
dest = self.make_key(dest, version=version_dest)
831+
keys = [self.make_key(key, version=version_keys) for key in keys]
832+
return int(client.sdiffstore(dest, *keys))
833+
834+
def sinter(
835+
self,
836+
*keys,
837+
version: Optional[int] = None,
838+
client: Optional[Redis] = None,
839+
) -> set:
840+
if client is None:
841+
client = self.get_client(write=False)
842+
843+
keys = [self.make_key(key, version=version) for key in keys]
844+
return {self.decode(value) for value in client.sinter(*keys)}
845+
846+
def sinterstore(
847+
self,
848+
dest: Any,
849+
*keys,
850+
version: Optional[int] = None,
851+
client: Optional[Redis] = None,
852+
) -> int:
853+
if client is None:
854+
client = self.get_client(write=True)
855+
856+
dest = self.make_key(dest, version=version)
857+
keys = [self.make_key(key, version=version) for key in keys]
858+
return int(client.sinterstore(dest, *keys))
859+
860+
def smismember(
861+
self,
862+
key: Any,
863+
*members,
864+
version: Optional[int] = None,
865+
client: Optional[Redis] = None,
866+
) -> bool:
867+
if client is None:
868+
client = self.get_client(write=False)
869+
870+
key = self.make_key(key, version=version)
871+
encoded_members = [self.encode(member) for member in members]
872+
873+
return [bool(value) for value in client.smismember(key, *encoded_members)]
874+
875+
def sismember(
876+
self,
877+
key: Any,
878+
member: Any,
879+
version: Optional[int] = None,
880+
client: Optional[Redis] = None,
881+
) -> bool:
882+
if client is None:
883+
client = self.get_client(write=False)
884+
885+
key = self.make_key(key, version=version)
886+
member = self.encode(member)
887+
return bool(client.sismember(key, member))
888+
889+
def smembers(
890+
self,
891+
key: Any,
892+
version: Optional[int] = None,
893+
client: Optional[Redis] = None,
894+
) -> set:
895+
if client is None:
896+
client = self.get_client(write=False)
897+
898+
key = self.make_key(key, version=version)
899+
return {self.decode(value) for value in client.smembers(key)}
900+
901+
def smove(
902+
self,
903+
source: Any,
904+
destination: Any,
905+
member: Any,
906+
version: Optional[int] = None,
907+
client: Optional[Redis] = None,
908+
) -> bool:
909+
if client is None:
910+
client = self.get_client(write=True)
911+
912+
source = self.make_key(source, version=version)
913+
destination = self.make_key(destination)
914+
member = self.encode(member)
915+
return bool(client.smove(source, destination, member))
916+
917+
def spop(
918+
self,
919+
key: Any,
920+
count: Optional[int] = None,
921+
version: Optional[int] = None,
922+
client: Optional[Redis] = None,
923+
) -> Union[set, Any]:
924+
if client is None:
925+
client = self.get_client(write=True)
926+
927+
key = self.make_key(key, version=version)
928+
result = client.spop(key, count)
929+
if type(result) == list:
930+
return {self.decode(value) for value in result}
931+
return self.decode(result)
932+
933+
def srandmember(
934+
self,
935+
key: Any,
936+
count: Optional[int] = None,
937+
version: Optional[int] = None,
938+
client: Optional[Redis] = None,
939+
) -> Union[set, Any]:
940+
if client is None:
941+
client = self.get_client(write=False)
942+
943+
key = self.make_key(key, version=version)
944+
result = client.srandmember(key, count)
945+
if type(result) == list:
946+
return {self.decode(value) for value in result}
947+
return self.decode(result)
948+
949+
def srem(
950+
self,
951+
key: Any,
952+
*members,
953+
version: Optional[int] = None,
954+
client: Optional[Redis] = None,
955+
) -> int:
956+
if client is None:
957+
client = self.get_client(write=True)
958+
959+
key = self.make_key(key, version=version)
960+
members = [self.decode(member) for member in members]
961+
return int(client.srem(key, *members))
962+
963+
def sscan(
964+
self,
965+
key: Any,
966+
match: Optional[str] = None,
967+
count: Optional[int] = None,
968+
version: Optional[int] = None,
969+
client: Optional[Redis] = None,
970+
) -> Set[Any]:
971+
if client is None:
972+
client = self.get_client(write=False)
973+
974+
key = self.make_key(key, version=version)
975+
976+
cursor, result = client.sscan(key, match=self.encode(match), count=count)
977+
return {self.decode(value) for value in result}
978+
979+
def sscan_iter(
980+
self,
981+
key: Any,
982+
match: Optional[str] = None,
983+
count: Optional[int] = None,
984+
version: Optional[int] = None,
985+
client: Optional[Redis] = None,
986+
) -> Iterator[Any]:
987+
if client is None:
988+
client = self.get_client(write=False)
989+
990+
key = self.make_key(key, version=version)
991+
for value in client.sscan_iter(key, match=match, count=count):
992+
yield self.decode(value)
993+
994+
995+
def sunion(
996+
self,
997+
*keys,
998+
version: Optional[int] = None,
999+
client: Optional[Redis] = None,
1000+
) -> set:
1001+
if client is None:
1002+
client = self.get_client(write=False)
1003+
1004+
keys = [self.make_key(key, version=version) for key in keys]
1005+
return {self.decode(value) for value in client.sunion(*keys)}
1006+
1007+
def sunionstore(
1008+
self,
1009+
destination: Any,
1010+
*keys,
1011+
version: Optional[int] = None,
1012+
client: Optional[Redis] = None,
1013+
) -> int:
1014+
if client is None:
1015+
client = self.get_client(write=True)
1016+
1017+
destination = self.make_key(destination, version=version)
1018+
keys = [self.make_key(key, version=version) for key in keys]
1019+
return int(client.sunionstore(destination, *keys))
1020+
7811021
def close(self) -> None:
7821022
close_flag = self._options.get(
7831023
"CLOSE_CONNECTION",

django_redis/compressors/lz4.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ def compress(self, value: bytes) -> bytes:
1616
def decompress(self, value: bytes) -> bytes:
1717
try:
1818
return _decompress(value)
19-
except Exception as e: # noqa: BLE001
19+
except Exception as e:
2020
raise CompressorError from e

0 commit comments

Comments
 (0)