redis-best-practices
mindrally/skills
Рекомендации по разработке с использованием Redis: кэширование, структуры данных и высокопроизводительные операции с парами «ключ-значение»
...Расширить всеО курсе redis-best-practices
Курс «Лучшие практики Redis» содержит исчерпывающие рекомендации по эффективному использованию Redis в качестве хранилища данных в оперативной памяти. В нем рассматриваются оптимальные шаблоны для кэширования, хранения сеансов, аналитики в реальном времени и организации очередей сообщений, а также даются советы, помогающие разработчикам избежать типичных ошибок и проблем с производительностью. Этот курс решает задачу раскрытия всего потенциала Redis, обучая правильному выбору структур данных, соглашениям об именовании ключей и архитектурным шаблонам, обеспечивающим масштабируемость и удобство обслуживания.
Основное внимание в курсе уделяется пяти основным структурам данных Redis — строкам, хешам, спискам, множествам и отсортированным множествам — а также новой функции потоков для обработки событий. В курсе приводятся практические примеры кода для каждой структуры, демонстрирующие, когда и как использовать атомарные операции, пакетные команды и блокирующие операции. Ключевые темы включают реализацию эффективных шаблонов «cache-aside», проектирование таблиц лидеров с использованием отсортированных наборов, создание очередей сообщений с помощью списков и обработку распределенных событий с помощью групп потребителей. В руководстве уделяется особое внимание эффективному использованию памяти, правильным политикам истечения срока действия данных и последовательным шаблонам именования, которые упрощают отладку и масштабирование приложений Redis.
Этот навык идеально подходит для бэкенд-разработчиков, работающих с высокопроизводительными приложениями, требующими быстрого доступа к данным, инженеров DevOps, проектирующих уровни кэширования, и архитекторов, создающих системы реального времени. Независимо от того, занимаетесь ли вы реализацией управления сессиями, созданием ограничителя скорости, формированием лент активности или проектированием распределенных очередей задач, этот набор навыков предоставляет проверенные на практике шаблоны и конкретные примеры, которые можно напрямую применять в производственных системах.
Часто задаваемые вопросы
Какую структуру данных следует использовать для таблицы лидеров?
Используйте отсортированные наборы (ZADD, ZREVRANGE), где баллы отражают рейтинг игроков. Отсортированные наборы автоматически поддерживают порядок и обеспечивают эффективные запросы по рейтингу, а также операции с диапазонами на основе баллов.
Как правильно реализовать истечение срока действия кэша?
Установите время истечения срока действия с помощью параметра EX в командах SET или используйте команду SETEX. Выбирайте значения TTL в зависимости от изменчивости данных — более короткие для часто меняющихся данных (от секунд до минут), более длительные для статического контента (от часов до дней).
Когда следует использовать хеши вместо нескольких строковых ключей?
Используйте хеши при хранении объектов с несколькими полями. Хеши более эффективны с точки зрения использования памяти, чем создание отдельных строковых ключей для каждого поля, и позволяют выполнять частичные обновления без извлечения всего объекта.
В чём разница между командами RPOP и BRPOP для очередей?
RPOP немедленно возвращает значение или null, если список пуст. BRPOP — это блокирующая операция, которая ожидает появления элемента в течение заданного таймаута, что делает её идеальной для рабочих процессов, которым необходимо эффективно ожидать появления новых задач.
Как организовать распределённую обработку с помощью Redis Streams?
Используйте группы потребителей с помощью команд XGROUP CREATE и XREADGROUP. Несколько потребителей могут обрабатывать сообщения параллельно, а Redis отслеживает, какие сообщения получил каждый потребитель. Используйте XACK для подтверждения успешной обработки.
Redis Best Practices
Core Principles
- Use Redis for caching, session storage, real-time analytics, and message queuing
- Choose appropriate data structures for your use case
- Implement proper key naming conventions and expiration policies
- Design for high availability and persistence requirements
- Monitor memory usage and optimize for performance
Key Naming Conventions
- Use colons as namespace separators
- Include object type and identifier in key names
- Keep keys short but descriptive
- Use consistent naming patterns across your application
# Good key naming examplesuser:1234:profileuser:1234:sessionsorder:5678:itemscache:api:products:listqueue:email:pendingsession:abc123def456rate_limit:api:user:1234Data Structures
Strings
- Use for simple key-value storage, counters, and caching
- Consider using MGET/MSET for batch operations
# Simple cachingSET cache:user:1234 '{"name":"John","email":"[email protected]"}' EX 3600# CountersINCR stats:pageviews:homepageINCRBY stats:downloads:file123 5# Atomic operationsSETNX lock:resource:456 "owner:abc" EX 30Hashes
- Use for objects with multiple fields
- More memory-efficient than multiple string keys
- Supports partial updates
# Store user profileHSET user:1234 name "John Doe" email "[email protected]" created_at "2024-01-15"# Get specific fieldsHGET user:1234 emailHMGET user:1234 name email# Increment numeric fieldsHINCRBY user:1234 login_count 1# Get all fieldsHGETALL user:1234Lists
- Use for queues, recent items, and activity feeds
- Consider blocking operations for queue consumers
# Message queueLPUSH queue:emails '{"to":"[email protected]","subject":"Welcome"}'RPOP queue:emails# Blocking pop for workersBRPOP queue:emails 30# Recent activity (keep last 100)LPUSH user:1234:activity "viewed product 567"LTRIM user:1234:activity 0 99# Get recent itemsLRANGE user:1234:activity 0 9Sets
- Use for unique collections, tags, and relationships
- Supports set operations (union, intersection, difference)
# User tags/interestsSADD user:1234:interests "technology" "music" "travel"# Check membershipSISMEMBER user:1234:interests "music"# Find common interestsSINTER user:1234:interests user:5678:interests# Online users trackingSADD online:users "user:1234"SREM online:users "user:1234"SMEMBERS online:usersSorted Sets
- Use for leaderboards, priority queues, and time-series data
- Elements sorted by score
# LeaderboardZADD leaderboard:game1 1500 "player:123" 2000 "player:456" 1800 "player:789"# Get top 10ZREVRANGE leaderboard:game1 0 9 WITHSCORES# Get player rankZREVRANK leaderboard:game1 "player:123"# Time-based data (score = timestamp)ZADD events:user:1234 1705329600 "login" 1705330000 "purchase"# Get events in time rangeZRANGEBYSCORE events:user:1234 1705329600 1705333200Streams
- Use for event streaming and log data
- Supports consumer groups for distributed processing
# Add events to streamXADD events:orders * customer_id 1234 product_id 567 amount 99.99# Read from streamXREAD COUNT 10 STREAMS events:orders 0# Consumer groupsXGROUP CREATE events:orders order-processors $ MKSTREAMXREADGROUP GROUP order-processors worker1 COUNT 10 STREAMS events:orders ># Acknowledge processed messagesXACK events:orders order-processors 1234567890-0Caching Patterns
Cache-Aside Pattern
# Pseudo-code for cache-asidedef get_user(user_id): # Try cache first cached = redis.get(f"cache:user:{user_id}") if cached: return json.loads(cached) # Cache miss - fetch from database user = database.get_user(user_id) # Store in cache with expiration redis.setex(f"cache:user:{user_id}", 3600, json.dumps(user)) return user
Write-Through Pattern
def update_user(user_id, data): # Update database database.update_user(user_id, data) # Update cache redis.setex(f"cache:user:{user_id}", 3600, json.dumps(data))
Cache Invalidation
# Delete specific cacheDEL cache:user:1234# Delete by pattern (use with caution in production)# Use SCAN instead of KEYS for large datasetsSCAN 0 MATCH cache:user:* COUNT 100# Tag-based invalidation using setsSADD cache:tags:user:1234 "cache:user:1234:profile" "cache:user:1234:orders"# Invalidate all related cachesSMEMBERS cache:tags:user:1234# Then delete each keyExpiration and Memory Management
TTL Best Practices
- Always set TTL on cache keys
- Use jitter to prevent thundering herd
- Consider sliding expiration for session data
# Set with expirationSET cache:data:123 "value" EX 3600# Set expiration on existing keyEXPIRE cache:data:123 3600# Check TTLTTL cache:data:123# Persist key (remove expiration)PERSIST cache:data:123Memory Management
# Check memory usageINFO memory# Get key memory usageMEMORY USAGE cache:large:object# Configure max memory policyCONFIG SET maxmemory 2gbCONFIG SET maxmemory-policy allkeys-lruTransactions and Atomicity
MULTI/EXEC Transactions
# Transaction blockMULTIINCR stats:viewsLPUSH recent:views "page:123"EXEC# Watch for optimistic lockingWATCH user:1234:balancebalance = GET user:1234:balanceMULTISET user:1234:balance (balance - 100)EXECLua Scripts
- Use for complex atomic operations
- Scripts execute atomically
-- Rate limiting scriptlocal key = KEYS[1]local limit = tonumber(ARGV[1])local window = tonumber(ARGV[2])local current = tonumber(redis.call('GET', key) or '0')if current >= limit then return 0endredis.call('INCR', key)if current == 0 then redis.call('EXPIRE', key, window)endreturn 1
# Execute Lua scriptEVAL "return redis.call('GET', KEYS[1])" 1 mykeyPub/Sub and Messaging
# PublisherPUBLISH channel:notifications '{"type":"alert","message":"New order"}'# SubscriberSUBSCRIBE channel:notifications# Pattern subscriptionPSUBSCRIBE channel:*High Availability
Replication
- Use replicas for read scaling
- Configure proper persistence on master
# On replicaREPLICAOF master_host 6379# Check replication statusINFO replicationRedis Sentinel
- Use for automatic failover
- Deploy at least 3 Sentinel instances
Redis Cluster
- Use for horizontal scaling
- Data automatically sharded across nodes
- Use hash tags for related keys
# Hash tags ensure keys go to same slotSET {user:1234}:profile "data"SET {user:1234}:settings "data"Persistence
RDB Snapshots
# Manual snapshotBGSAVE# Configure automatic snapshotsCONFIG SET save "900 1 300 10 60 10000"AOF (Append-Only File)
# Enable AOFCONFIG SET appendonly yesCONFIG SET appendfsync everysec# Rewrite AOFBGREWRITEAOFSecurity
- Require authentication
- Use TLS for connections
- Bind to specific interfaces
- Disable dangerous commands
# Set passwordCONFIG SET requirepass "your_strong_password"# AuthenticateAUTH your_strong_password# Rename dangerous commands (in redis.conf)rename-command FLUSHALL ""rename-command FLUSHDB ""rename-command KEYS ""Monitoring
# Server infoINFO# Memory statsINFO memory# Client connectionsCLIENT LIST# Slow logSLOWLOG GET 10# Monitor commands (debug only)MONITOR# Key count per databaseINFO keyspaceConnection Management
- Use connection pooling
- Set appropriate timeouts
- Handle reconnection gracefully
# Python example with connection poolimport redispool = redis.ConnectionPool( host='localhost', port=6379, max_connections=50, socket_timeout=5, socket_connect_timeout=5)redis_client = redis.Redis(connection_pool=pool)
Performance Tips
- Use pipelining for batch operations
- Avoid large keys (>100KB values)
- Use SCAN instead of KEYS in production
- Monitor and optimize memory usage
- Consider using RedisJSON for complex JSON operations
# Pipeline example (pseudo-code)pipe = redis.pipeline()pipe.get("key1")pipe.get("key2")pipe.set("key3", "value")results = pipe.execute() Установить redis-best-practices
Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.
Скачать ZIPКлонируйте репозиторий и скопируйте файлы навыка в свой проект.
git clone https://github.com/Mindrally/skills/blob/main/redis-best-practices/SKILL.md # Copy SKILL.md to your .claude/skills/ directory
Копировать





Дом
