@@ -861,6 +861,165 @@ We suggest installing [pre-commit][] hooks:
861861pre-commit install
862862```
863863
864+ ### Module structure
865+
866+ ```mermaid
867+ graph TD
868+ A[RedisFuncCache] --> B[AbstractPolicy]
869+ A --> C[Serializer]
870+ A --> D[Script Execution]
871+ B --> E[BaseSinglePolicy]
872+ B --> F[BaseMultiplePolicy]
873+ E --> G[FifoPolicy]
874+ E --> H[LfuPolicy]
875+ E --> I[LruPolicy]
876+ E --> J[RrPolicy]
877+ G --> K[FifoScriptsMixin]
878+ H --> L[LfuScriptsMixin]
879+ I --> M[LruScriptsMixin]
880+ J --> N[RrScriptsMixin]
881+ K --> O[lua/fifo_get.lua]
882+ K --> P[lua/fifo_put.lua]
883+ M --> Q[lua/lru_get.lua]
884+ M --> R[lua/lru_put.lua]
885+ A --> S[utils.py]
886+ S --> T[b64digest]
887+ S --> U[get_callable_bytecode]
888+ ```
889+
890+ ### Class Diagrams
891+
892+ Core class:
893+
894+ ```mermaid
895+ classDiagram
896+ class RedisFuncCache {
897+ -client: RedisClientTV
898+ -policy: AbstractPolicy
899+ -serializer: SerializerPairT
900+ +__init__(name, policy, client, serializer)
901+ +__call__(func)
902+ +decorate(func)
903+ +exec(user_function, user_args, user_kwds)
904+ +aexec(user_function, user_args, user_kwds)
905+ }
906+
907+ class AbstractPolicy {
908+ <<abstract>>
909+ __key__: str
910+ __scripts__: Tuple[str, str]
911+ +__init__(cache)
912+ +calc_keys(f, args, kwds) -> Tuple[str, str]
913+ +calc_hash(f, args, kwds) -> KeyT
914+ +purge() -> int
915+ +apurge() -> int
916+ }
917+
918+ class BaseSinglePolicy {
919+ _keys: Optional[Tuple[str, str]]
920+ +__init__(cache)
921+ +calc_keys(f, args, kwds) -> Tuple[str, str]
922+ +purge()
923+ +apurge()
924+ }
925+
926+ class BaseMultiplePolicy {
927+ +calc_keys(f, args, kwds) -> Tuple[str, str]
928+ }
929+
930+ RedisFuncCache --> AbstractPolicy : uses
931+ AbstractPolicy <|-- BaseSinglePolicy
932+ AbstractPolicy <|-- BaseMultiplePolicy
933+ ```
934+
935+ Strategy pattern and mixins:
936+
937+ ```mermaid
938+ classDiagram
939+ class LruPolicy {
940+ __key__ = "lru"
941+ }
942+
943+ class LruScriptsMixin {
944+ __scripts__ = "lru_get.lua", "lru_put.lua"
945+ }
946+
947+ class PickleMd5HashMixin {
948+ __hash_config__ = ...
949+ }
950+
951+ BaseSinglePolicy <|-- LruPolicy
952+ LruScriptsMixin -- LruPolicy
953+ PickleMd5HashMixin -- LruPolicy
954+
955+ class FifoPolicy {
956+ __key__ = "fifo"
957+ }
958+
959+ class FifoScriptsMixin {
960+ __scripts__ = "fifo_get.lua", "fifo_put.lua"
961+ }
962+
963+ BaseSinglePolicy <|-- FifoPolicy
964+ FifoScriptsMixin -- FifoPolicy
965+ ```
966+
967+ Cluster and multiple-keys support
968+
969+ ```mermaid
970+ classDiagram
971+ class BaseClusterSinglePolicy {
972+ +calc_keys(f, args, kwds) -> Tuple[str, str]
973+ }
974+
975+ class BaseClusterMultiplePolicy {
976+ +calc_keys(f, args, kwds) -> Tuple[str, str]
977+ }
978+
979+ BaseSinglePolicy <|-- BaseClusterSinglePolicy
980+ BaseMultiplePolicy <|-- BaseClusterMultiplePolicy
981+
982+ class LruClusterPolicy {
983+ __key__ = "lru-cluster"
984+ }
985+
986+ BaseClusterSinglePolicy <|-- LruClusterPolicy
987+ ```
988+
989+ Decorator and proxy:
990+
991+ ```mermaid
992+ classDiagram
993+ class RedisFuncCache {
994+ +__call__(user_function) -> CallableTV
995+ +decorate(user_function) -> CallableTV
996+ }
997+
998+ class Wrapper {
999+ +wrapper(*user_args, **user_kwargs)
1000+ +awrapper(*user_args, **user_kwargs)
1001+ }
1002+
1003+ RedisFuncCache --> Wrapper
1004+ ```
1005+
1006+ Weak reference:
1007+
1008+ ```mermaid
1009+ classDiagram
1010+ class AbstractPolicy {
1011+ -_cache: CallableProxyType[RedisFuncCache]
1012+ +cache: RedisFuncCache
1013+ }
1014+
1015+ class RedisFuncCache {
1016+ -_policy_instance: AbstractPolicy
1017+ }
1018+
1019+ RedisFuncCache --> AbstractPolicy : creates
1020+ AbstractPolicy --> CallableProxyType : weak reference
1021+ ```
1022+
8641023> ℹ️ **Note:** \
8651024> Ensure that you have a stable internet connection during the installation process to avoid interruptions.
8661025
0 commit comments