Skip to content

feat: add enforce() and g() cache to pycasbin#426

Open
Doslam wants to merge 1 commit into
apache:masterfrom
Doslam:feat/cached-enforcer
Open

feat: add enforce() and g() cache to pycasbin#426
Doslam wants to merge 1 commit into
apache:masterfrom
Doslam:feat/cached-enforcer

Conversation

@Doslam

@Doslam Doslam commented Jul 22, 2026

Copy link
Copy Markdown

This PR adds CachedEnforcer, SyncedCachedEnforcer, AsyncCachedEnforcer and g() function cache for pycasbin. Three new enforcer classes are now available — CachedEnforcer (single-thread), SyncedCachedEnforcer (thread-safe) and AsyncCachedEnforcer (async-safe) — all providing decision caching on enforce() results. Existing Enforcer also gains enable_g_function_cache() to control role-lookup caching.

This aligns pycasbin with go-casbin's CachedEnforcer. Additionally, SyncedCachedEnforcer and AsyncCachedEnforcer are provided for concurrent workflows not covered by go-casbin.

Two independent caches:

  • Decision cache — caches enforce() results. Repeated same sub/obj/act return instantly. Auto-invalidated on any policy mutation (_add_policy/_remove/_update/load/clear).
  • g() function cache — caches has_link() on RoleManager via lru_cache. Avoids redundant role-graph traversal inside each enforce(). Opt-in via enable_g_function_cache(True). Cleared on add_link/delete_link/clear.

Cache invalidation

Operation Decision cache g() cache
add/remove/update p policy Cleared Unchanged
add/remove grouping policy Cleared Cleared
load_policy / clear_policy Cleared Cleared

Files

New:

  • casbin/cache/init.py — Cache ABC
  • casbin/cache/default_cache.py — DefaultCache (dict + TTL)
  • casbin/cached_enforcer.py — CachedEnforcer
  • casbin/synced_cached_enforcer.py — SyncedCachedEnforcer
  • casbin/async_cached_enforcer.py — AsyncCachedEnforcer
  • tests/test_cached_enforcer.py — 22 tests

Modified:

  • casbin/core_enforcer.py — add enable_g_function_cache()
  • casbin/rbac/default_role_manager/role_manager.py — lru_cache + clear_g_cache + DomainManager propagation
  • casbin/init.py — exports

Compatibility

Zero breaking changes. g() cache disabled by default. All additive.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant