Skip to content

Commit 319df8c

Browse files
committed
feat(django-redis): add set functionality to default client
1 parent 9d572cd commit 319df8c

File tree

2 files changed

+249
-0
lines changed

2 files changed

+249
-0
lines changed

django_redis/cache.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,59 @@ def close(self, **kwargs):
183183
@omit_exception
184184
def touch(self, *args, **kwargs):
185185
return self.client.touch(*args, **kwargs)
186+
187+
@omit_exception
188+
def sadd(self, *args, **kwargs):
189+
return self.client.sadd(*args, **kwargs)
190+
191+
@omit_exception
192+
def scard(self, *args, **kwargs):
193+
return self.client.scard(*args, **kwargs)
194+
195+
@omit_exception
196+
def sdiff(self, *args, **kwargs):
197+
return self.client.sdiff(*args, **kwargs)
198+
199+
@omit_exception
200+
def sdiffstore(self, *args, **kwargs):
201+
return self.client.sdiffstore(*args, **kwargs)
202+
203+
@omit_exception
204+
def sinter(self, *args, **kwargs):
205+
return self.client.sinter(*args, **kwargs)
206+
207+
@omit_exception
208+
def sinterstore(self, *args, **kwargs):
209+
return self.client.sinterstore(*args, **kwargs)
210+
211+
@omit_exception
212+
def sismember(self, *args, **kwargs):
213+
return self.client.sismember(*args, **kwargs)
214+
215+
@omit_exception
216+
def smembers(self, *args, **kwargs):
217+
return self.client.smembers(*args, **kwargs)
218+
219+
@omit_exception
220+
def smove(self, *args, **kwargs):
221+
return self.client.smove(*args, **kwargs)
222+
223+
@omit_exception
224+
def spop(self, *args, **kwargs):
225+
return self.client.spop(*args, **kwargs)
226+
227+
@omit_exception
228+
def srandmember(self, *args, **kwargs):
229+
return self.client.srandmember(*args, **kwargs)
230+
231+
@omit_exception
232+
def srem(self, *args, **kwargs):
233+
return self.client.srem(*args, **kwargs)
234+
235+
@omit_exception
236+
def sunion(self, *args, **kwargs):
237+
return self.client.sunion(*args, **kwargs)
238+
239+
@omit_exception
240+
def sunionstore(self, *args, **kwargs):
241+
return self.client.sunionstore(*args, **kwargs)

django_redis/client/default.py

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,3 +776,196 @@ def touch(
776776
# Convert to milliseconds
777777
timeout = int(timeout * 1000)
778778
return bool(client.pexpire(key, timeout))
779+
780+
def sadd(
781+
self,
782+
key: Any,
783+
*values: Any,
784+
version: Optional[int] = None,
785+
client: Optional[Redis] = None,
786+
) -> int:
787+
if client is None:
788+
client = self.get_client(write=True)
789+
790+
key = self.make_key(key, version=version)
791+
values = [self.encode(value) for value in values]
792+
return int(client.sadd(key, *values))
793+
794+
def scard(
795+
self,
796+
key: Any,
797+
version: Optional[int] = None,
798+
client: Optional[Redis] = None,
799+
) -> int:
800+
if client is None:
801+
client = self.get_client(write=False)
802+
803+
key = self.make_key(key, version=version)
804+
return int(client.scard(key))
805+
806+
def sdiff(
807+
self,
808+
*keys,
809+
version: Optional[int] = None,
810+
client: Optional[Redis] = None,
811+
) -> set:
812+
if client is None:
813+
client = self.get_client(write=False)
814+
815+
keys = [self.make_key(key, version=version) for key in keys]
816+
return {self.decode(value) for value in client.sdiff(*keys)}
817+
818+
def sdiffstore(
819+
self,
820+
dest: Any,
821+
*keys,
822+
version: Optional[int] = None,
823+
client: Optional[Redis] = None,
824+
) -> int:
825+
if client is None:
826+
client = self.get_client(write=True)
827+
828+
dest = self.make_key(dest, version=version)
829+
keys = [self.make_key(key, version=version) for key in keys]
830+
return int(client.sdiffstore(dest, *keys))
831+
832+
833+
def sinter(
834+
self,
835+
*keys,
836+
version: Optional[int] = None,
837+
client: Optional[Redis] = None,
838+
) -> set:
839+
if client is None:
840+
client = self.get_client(write=False)
841+
842+
keys = [self.make_key(key, version=version) for key in keys]
843+
return {self.decode(value) for value in client.sinter(*keys)}
844+
845+
def sinterstore(
846+
self,
847+
dest: Any,
848+
*keys,
849+
version: Optional[int] = None,
850+
client: Optional[Redis] = None,
851+
) -> int:
852+
if client is None:
853+
client = self.get_client(write=True)
854+
855+
dest = self.make_key(dest, version=version)
856+
keys = [self.make_key(key, version=version) for key in keys]
857+
return int(client.sinterstore(dest, *keys))
858+
859+
def sismember(
860+
self,
861+
key: Any,
862+
member: Any,
863+
version: Optional[int] = None,
864+
client: Optional[Redis] = None,
865+
) -> bool:
866+
if client is None:
867+
client = self.get_client(write=False)
868+
869+
key = self.make_key(key, version=version)
870+
member = self.encode(member)
871+
return bool(client.sismember(key, member))
872+
873+
def smembers(
874+
self,
875+
key: Any,
876+
version: Optional[int] = None,
877+
client: Optional[Redis] = None,
878+
) -> set:
879+
if client is None:
880+
client = self.get_client(write=False)
881+
882+
key = self.make_key(key, version=version)
883+
return {self.decode(value) for value in client.smembers(key)}
884+
885+
def smove(
886+
self,
887+
source: Any,
888+
destination: Any,
889+
member: Any,
890+
version: Optional[int] = None,
891+
client: Optional[Redis] = None,
892+
) -> bool:
893+
if client is None:
894+
client = self.get_client(write=True)
895+
896+
source = self.make_key(source, version=version)
897+
destination = self.make_key(destination)
898+
member = self.encode(member)
899+
return bool(client.smove(source, destination, member))
900+
901+
def spop(
902+
self,
903+
key: Any,
904+
count: Optional[int] = None,
905+
version: Optional[int] = None,
906+
client: Optional[Redis] = None,
907+
) -> Union[set, Any]:
908+
if client is None:
909+
client = self.get_client(write=True)
910+
911+
key = self.make_key(key, version=version)
912+
result = client.spop(key, count)
913+
if type(result) == list:
914+
return {self.decode(value) for value in result}
915+
return self.decode(result)
916+
917+
def srandmember(
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=False)
926+
927+
key = self.make_key(key, version=version)
928+
result = client.srandmember(key, count)
929+
if type(result) == list:
930+
return {self.decode(value) for value in result}
931+
return self.decode(result)
932+
933+
def srem(
934+
self,
935+
key: Any,
936+
*members,
937+
version: Optional[int] = None,
938+
client: Optional[Redis] = None,
939+
) -> int:
940+
if client is None:
941+
client = self.get_client(write=True)
942+
943+
key = self.make_key(key, version=version)
944+
members = [self.decode(member) for member in members]
945+
return int(client.srem(key, *members))
946+
947+
def sunion(
948+
self,
949+
*keys,
950+
version: Optional[int] = None,
951+
client: Optional[Redis] = None,
952+
) -> set:
953+
if client is None:
954+
client = self.get_client(write=False)
955+
956+
keys = [self.make_key(key, version=version) for key in keys]
957+
return {self.decode(value) for value in client.sunion(*keys)}
958+
959+
def sunionstore(
960+
self,
961+
destination: Any,
962+
*keys,
963+
version: Optional[int] = None,
964+
client: Optional[Redis] = None,
965+
) -> int:
966+
if client is None:
967+
client = self.get_client(write=True)
968+
969+
destination = self.make_key(destination, version=version)
970+
keys = [self.make_key(key, version=version) for key in keys]
971+
return int(client.sunionstore(destination, *keys))

0 commit comments

Comments
 (0)