redis-best-practices
Redisを使用したキャッシング、データ構造の設計、高パフォーマンスなキーバリュー操作に関するベストプラクティスを提供するスキルです。Redisの効率的な活用方法や最適化のアドバイスが必要な場面でトリガーされます。
description の原文を見る
Redis development best practices for caching, data structures, and high-performance key-value operations
SKILL.md 本文
Redis ベストプラクティス
コア原則
- キャッシング、セッションストレージ、リアルタイム分析、メッセージキューイングのために Redis を使用する
- ユースケースに適切なデータ構造を選択する
- 適切なキー命名規則と有効期限ポリシーを実装する
- 高可用性と永続化要件に対応して設計する
- メモリ使用量を監視し、パフォーマンスを最適化する
キー命名規則
- 名前空間セパレータとしてコロンを使用する
- キー名にオブジェクトタイプと識別子を含める
- キーは短いが説明的に保つ
- アプリケーション全体で一貫した命名パターンを使用する
# 良いキー命名の例
user:1234:profile
user:1234:sessions
order:5678:items
cache:api:products:list
queue:email:pending
session:abc123def456
rate_limit:api:user:1234
データ構造
文字列 (Strings)
- シンプルなキーバリュー保存、カウンター、キャッシングに使用する
- バッチ操作には MGET/MSET の使用を検討する
# シンプルなキャッシング
SET cache:user:1234 '{"name":"John","email":"john@example.com"}' EX 3600
# カウンター
INCR stats:pageviews:homepage
INCRBY stats:downloads:file123 5
# アトミック操作
SETNX lock:resource:456 "owner:abc" EX 30
ハッシュ (Hashes)
- 複数のフィールドを持つオブジェクトに使用する
- 複数の文字列キーよりもメモリ効率が良い
- 部分的な更新をサポートする
# ユーザープロフィールを保存
HSET user:1234 name "John Doe" email "john@example.com" created_at "2024-01-15"
# 特定のフィールドを取得
HGET user:1234 email
HMGET user:1234 name email
# 数値フィールドをインクリメント
HINCRBY user:1234 login_count 1
# すべてのフィールドを取得
HGETALL user:1234
リスト (Lists)
- キュー、最新アイテム、アクティビティフィードに使用する
- キューコンシューマーには blocking 操作の使用を検討する
# メッセージキュー
LPUSH queue:emails '{"to":"user@example.com","subject":"Welcome"}'
RPOP queue:emails
# ワーカー用の blocking pop
BRPOP queue:emails 30
# 最新のアクティビティ (最後の 100 件を保持)
LPUSH user:1234:activity "viewed product 567"
LTRIM user:1234:activity 0 99
# 最新アイテムを取得
LRANGE user:1234:activity 0 9
セット (Sets)
- ユニークなコレクション、タグ、関係性に使用する
- セット操作 (和、交差、差) をサポートする
# ユーザータグ/興味
SADD user:1234:interests "technology" "music" "travel"
# メンバーシップをチェック
SISMEMBER user:1234:interests "music"
# 共通の興味を見つける
SINTER user:1234:interests user:5678:interests
# オンラインユーザー追跡
SADD online:users "user:1234"
SREM online:users "user:1234"
SMEMBERS online:users
ソート済みセット (Sorted Sets)
- リーダーボード、優先度キュー、時系列データに使用する
- 要素はスコアでソートされる
# リーダーボード
ZADD leaderboard:game1 1500 "player:123" 2000 "player:456" 1800 "player:789"
# トップ 10 を取得
ZREVRANGE leaderboard:game1 0 9 WITHSCORES
# プレイヤーランクを取得
ZREVRANK leaderboard:game1 "player:123"
# 時間ベースのデータ (スコア = タイムスタンプ)
ZADD events:user:1234 1705329600 "login" 1705330000 "purchase"
# 時間範囲内のイベントを取得
ZRANGEBYSCORE events:user:1234 1705329600 1705333200
ストリーム (Streams)
- イベントストリーミングとログデータに使用する
- 分散処理用のコンシューマーグループをサポートする
# ストリームにイベントを追加
XADD events:orders * customer_id 1234 product_id 567 amount 99.99
# ストリームから読み取り
XREAD COUNT 10 STREAMS events:orders 0
# コンシューマーグループ
XGROUP CREATE events:orders order-processors $ MKSTREAM
XREADGROUP GROUP order-processors worker1 COUNT 10 STREAMS events:orders >
# 処理済みメッセージを確認
XACK events:orders order-processors 1234567890-0
キャッシング パターン
キャッシュアサイド パターン
# キャッシュアサイドの疑似コード
def get_user(user_id):
# キャッシュを最初に試す
cached = redis.get(f"cache:user:{user_id}")
if cached:
return json.loads(cached)
# キャッシュミス - データベースから取得
user = database.get_user(user_id)
# 有効期限付きでキャッシュに保存
redis.setex(f"cache:user:{user_id}", 3600, json.dumps(user))
return user
ライトスルー パターン
def update_user(user_id, data):
# データベースを更新
database.update_user(user_id, data)
# キャッシュを更新
redis.setex(f"cache:user:{user_id}", 3600, json.dumps(data))
キャッシュ無効化
# 特定のキャッシュを削除
DEL cache:user:1234
# パターンマッチで削除 (本番環境では注意が必要)
# 大規模なデータセットの場合は KEYS の代わりに SCAN を使用
SCAN 0 MATCH cache:user:* COUNT 100
# タグベースの無効化 (セットを使用)
SADD cache:tags:user:1234 "cache:user:1234:profile" "cache:user:1234:orders"
# 関連するすべてのキャッシュを無効化
SMEMBERS cache:tags:user:1234
# その後、各キーを削除
有効期限とメモリ管理
TTL ベストプラクティス
- キャッシュキーには常に TTL を設定する
- thundering herd を防ぐためにジッターを使用する
- セッションデータにはスライディング有効期限を検討する
# 有効期限付きで設定
SET cache:data:123 "value" EX 3600
# 既存のキーに有効期限を設定
EXPIRE cache:data:123 3600
# TTL を確認
TTL cache:data:123
# キーを永続化 (有効期限を削除)
PERSIST cache:data:123
メモリ管理
# メモリ使用量をチェック
INFO memory
# キーのメモリ使用量を取得
MEMORY USAGE cache:large:object
# 最大メモリポリシーを設定
CONFIG SET maxmemory 2gb
CONFIG SET maxmemory-policy allkeys-lru
トランザクションとアトミック性
MULTI/EXEC トランザクション
# トランザクションブロック
MULTI
INCR stats:views
LPUSH recent:views "page:123"
EXEC
# 楽観的ロック用の WATCH
WATCH user:1234:balance
balance = GET user:1234:balance
MULTI
SET user:1234:balance (balance - 100)
EXEC
Lua スクリプト
- 複雑なアトミック操作に使用する
- スクリプトはアトミックに実行される
-- レート制限スクリプト
local 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 0
end
redis.call('INCR', key)
if current == 0 then
redis.call('EXPIRE', key, window)
end
return 1
# Lua スクリプトを実行
EVAL "return redis.call('GET', KEYS[1])" 1 mykey
Pub/Sub とメッセージング
# パブリッシャー
PUBLISH channel:notifications '{"type":"alert","message":"New order"}'
# サブスクライバー
SUBSCRIBE channel:notifications
# パターンサブスクリプション
PSUBSCRIBE channel:*
高可用性
レプリケーション
- 読み取りスケーリング用にレプリカを使用する
- マスターに適切な永続化を設定する
# レプリカ上で実行
REPLICAOF master_host 6379
# レプリケーションステータスを確認
INFO replication
Redis Sentinel
- 自動フェイルオーバー用に使用する
- 最低 3 つの Sentinel インスタンスをデプロイする
Redis Cluster
- 水平スケーリング用に使用する
- ノード全体でデータが自動的にシャード化される
- 関連キーにはハッシュタグを使用する
# ハッシュタグでキーが同じスロットに行くことを保証
SET {user:1234}:profile "data"
SET {user:1234}:settings "data"
永続化
RDB スナップショット
# 手動スナップショット
BGSAVE
# 自動スナップショットを設定
CONFIG SET save "900 1 300 10 60 10000"
AOF (Append-Only File)
# AOF を有効化
CONFIG SET appendonly yes
CONFIG SET appendfsync everysec
# AOF を再書き込み
BGREWRITEAOF
セキュリティ
- 認証を要求する
- 接続に TLS を使用する
- 特定のインターフェースにバインドする
- 危険なコマンドを無効化する
# パスワードを設定
CONFIG SET requirepass "your_strong_password"
# 認証
AUTH your_strong_password
# 危険なコマンドの名前を変更 (redis.conf 内)
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""
モニタリング
# サーバー情報
INFO
# メモリ統計
INFO memory
# クライアント接続
CLIENT LIST
# スロウログ
SLOWLOG GET 10
# コマンド監視 (デバッグのみ)
MONITOR
# データベースごとのキー数
INFO keyspace
コネクション管理
- コネクションプーリングを使用する
- 適切なタイムアウトを設定する
- 再接続を適切に処理する
# コネクションプール付きの Python 例
import redis
pool = redis.ConnectionPool(
host='localhost',
port=6379,
max_connections=50,
socket_timeout=5,
socket_connect_timeout=5
)
redis_client = redis.Redis(connection_pool=pool)
パフォーマンス ヒント
- バッチ操作にはパイプライニングを使用する
- 大きなキーを避ける (>100KB の値)
- 本番環境では KEYS の代わりに SCAN を使用する
- メモリ使用量を監視して最適化する
- 複雑な JSON 操作には RedisJSON の使用を検討する
# パイプラインの例 (疑似コード)
pipe = redis.pipeline()
pipe.get("key1")
pipe.get("key2")
pipe.set("key3", "value")
results = pipe.execute()
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- mindrally
- リポジトリ
- mindrally/skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/mindrally/skills / ライセンス: Apache-2.0
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。