Manage Redis cache - clear, monitor, and optimize Frappe cache performance
Manage Frappe's Redis cache by clearing, monitoring, and optimizing performance. Use this when you need to clear stale data after deployments, troubleshoot cache issues, or analyze cache memory usage and hit rates.
/plugin marketplace add Venkateshvenki404224/frappe-apps-manager/plugin install frappe-apps-manager@frappe-marketplaceManage Frappe's Redis cache including clearing cache, monitoring cache statistics, and optimizing cache performance.
redis-cli pingAsk user what cache operation they want:
A. Clear Cache
B. View Cache Stats
C. Inspect Cache
D. Monitor Cache
Clear All Cache:
bench --site [site-name] clear-cache
Clear Specific DocType:
bench --site [site-name] console
>>> frappe.clear_cache(doctype='Customer')
>>> exit()
Clear User Cache:
# Via console
bench --site [site-name] console
>>> frappe.clear_cache(user='user@example.com')
Clear Specific Keys:
# Via Redis CLI
redis-cli --scan --pattern "*customer*" | xargs redis-cli del
View Cache Info:
redis-cli info memory
redis-cli info stats
Display formatted output:
Memory Usage: 45.2 MB / 512 MB (8.8%)
Total Keys: 1,247
Hit Rate: 87.3%
Evictions: 12
Key Count by Pattern:
# Count DocType cache keys
redis-cli --scan --pattern "*doctype*" | wc -l
# Count user cache keys
redis-cli --scan --pattern "*user*" | wc -l
List Recent Keys:
redis-cli --scan --pattern "*" | head -20
View Key Value:
redis-cli get "cache_key_name"
Check Key TTL:
redis-cli ttl "cache_key_name"
Search Keys:
# Find keys matching pattern
redis-cli --scan --pattern "*customer*"
Monitor in Real-time:
redis-cli monitor
Watch Stats:
watch -n 1 redis-cli info stats
Memory Usage:
redis-cli info memory | grep used_memory_human
Analyze cache usage and suggest optimizations:
High Memory Usage:
Low Hit Rate:
Too Many Keys:
Cache Patterns in Frappe:
# In bench console
frappe.cache().get_value('key')
frappe.cache().set_value('key', 'value', expires_in_sec=3600)
frappe.cache().delete_key('key')
frappe.cache().delete_keys('key*')
Common Cache Keys:
doctype_meta:[DocType] - DocType metadatauser_info:[user] - User informationpermission:[doctype]:[user] - Permission cachereport:[report_name] - Report cachehome_page:[user] - User home pageWhen to Clear Cache:
Selective Clearing:
# Clear only what's needed (via console)
frappe.clear_cache(doctype='Customer') # Specific DocType
frappe.clear_cache(user='user@test.com') # Specific user
frappe.cache().delete_keys('custom_cache_*') # Pattern match
Automatic Cache Clearing:
Common Problems:
"Stale Data Showing"
# Clear all cache
bench --site [site-name] clear-cache
# Reload DocType
bench --site [site-name] console
>>> frappe.reload_doctype('Customer')
"Redis Connection Error"
# Check Redis status
redis-cli ping
# Restart Redis
sudo systemctl restart redis-server
# Check Redis config in site_config.json
cat sites/[site-name]/site_config.json | grep redis
"High Memory Usage"
# Find large keys
redis-cli --bigkeys
# Set memory limit in redis.conf
maxmemory 512mb
maxmemory-policy allkeys-lru
"Cache Not Working"
# Verify cache is enabled
bench --site [site-name] console
>>> frappe.cache().get_value('test_key')
>>> frappe.cache().set_value('test_key', 'test_value')
>>> frappe.cache().get_value('test_key') # Should return 'test_value'
Frappe Cache Module:
ERPNext Cache Usage Examples:
Real Cache Patterns from Core:
# See: erpnext/stock/get_item_details.py
def get_price_list_rate(args):
cache_key = f"price_list_rate:{args.item_code}:{args.price_list}"
cached_rate = frappe.cache().get_value(cache_key)
if cached_rate:
return cached_rate
# Fetch from database
rate = frappe.db.get_value('Item Price', filters, 'price_list_rate')
# Cache for 1 hour
frappe.cache().set_value(cache_key, rate, expires_in_sec=3600)
return rate
# See: frappe/model/document.py
def save(self):
# ... save logic ...
# Clear cache after save
frappe.clear_cache(doctype=self.doctype)
frappe.clear_document_cache(self.doctype, self.name)
# See: frappe/cache_manager.py
def clear_global_cache():
frappe.cache().delete_keys('*')
frappe.cache().delete_keys('global:*')
Frappe Standard Keys:
doctype_meta:{doctype}
user_info:{user_id}
defaults:{user}:{key}
permission:{doctype}:{ptype}:{user}
global:{key}
temp:{random}
Site Config (site_config.json):
{
"redis_cache": "redis://localhost:13000",
"redis_queue": "redis://localhost:11000",
"cache_ttl": 3600
}
Redis Config (redis.conf):
maxmemory 512mb
maxmemory-policy allkeys-lru
save ""
appendonly no
Cache Hit Rate:
# Monitor hit rate
redis-cli info stats | grep keyspace
Memory Efficiency:
# Find memory hogs
redis-cli --bigkeys
# Sample random keys
redis-cli --memkeys
In Your App:
from frappe.utils.caching import redis_cache
@redis_cache(ttl=3600)
def expensive_operation(param):
# Automatically cached for 1 hour
return calculate_something(param)