Redis

キャッシュライブラリインメモリデータベース分散キャッシュNoSQL高性能

GitHub概要

redis/node-redis

Redis Node.js client

スター17,246
ウォッチ294
フォーク1,908
作成日:2010年9月14日
言語:TypeScript
ライセンス:MIT License

トピックス

node-redisnodejsredisredis-clientredis-cluster

スター履歴

redis/node-redis Star History
データ取得日時: 2025/7/18 05:46

ライブラリ

Redis

概要

Redisは「REmote DIctionary Server」の略で、高性能インメモリデータ構造ストアです。キャッシュ、データベース、メッセージブローカーとして多用途に使用でき、サブミリ秒のレスポンス時間、豊富なデータ構造、水平スケーリング、パブリッシュ/サブスクライブ機能を提供します。2025年現在、分散キャッシュソリューションの絶対的標準として地位を確立し、AWS、Azure、GCPなど全クラウドプロバイダーでマネージドサービスが提供されています。

詳細

Redis 8.0が2025年春にリリースされ、AI特化機能を大幅強化しました。Redis LangCache(LLMアプリ向けセマンティックキャッシュサービス)、Vector Sets(ベクトル埋め込み用新データ型)、LangGraphとのネイティブ統合を追加。RSALv2/SSPLライセンスに加えAGPLのトリプルライセンス体制を採用。20以上のデータ型をサポートし、文字列、リスト、セット、ソート済みセット、ハッシュ、ストリームなど多様なデータ構造を効率的に処理。Auto Tiering with Flashにより、アクセス頻度の低いデータをフラッシュストレージに自動的に移動し、メモリ効率を大幅改善。

主な特徴

  • サブミリ秒レスポンス: メモリベースアクセスによる極めて高速な読み書き性能
  • 豊富なデータ構造: 20以上のデータ型による柔軟なデータモデリング
  • 分散アーキテクチャ: シャーディング、クラスタリング、レプリケーション対応
  • パブリッシュ/サブスクライブ: リアルタイムメッセージング機能
  • 永続化オプション: RDBスナップショット、AOFログによるデータ保護
  • AI/ML統合: Vector Sets、セマンティックキャッシュ、LangGraph連携

メリット・デメリット

メリット

  • 分散キャッシュにおける圧倒的な実績と信頼性(10年以上の運用歴)
  • 全クラウドプロバイダーでマネージドサービス利用可能
  • 豊富なクライアントライブラリ(Python、Java、Node.js、C#等)
  • リアルタイムアプリケーション、Edge Computing対応
  • 高可用性とフェイルオーバー機能による堅牢性
  • オープンソースによる透明性とコミュニティサポート

デメリット

  • シングルスレッド設計による大量同時接続時のボトルネック
  • メモリ使用量がデータサイズに比例(コスト考慮要)
  • 複雑な設定とチューニングが必要(エンタープライズ環境)
  • ライセンス変更による商用利用の制約
  • 学習コストが高い(多機能ゆえの複雑さ)
  • データ型の適切な選択による性能最適化の必要性

参考ページ

書き方の例

インストールとセットアップ

# Docker での起動
docker run --name redis-cache -p 6379:6379 -d redis:8.0

# Redis CLI での接続確認
redis-cli ping
# PONG

# Ubuntu/Debian でのインストール
sudo apt update
sudo apt install redis-server

# CentOS/RHEL でのインストール
sudo yum install epel-release
sudo yum install redis

基本的なキャッシュ操作

# 基本的な文字列操作
SET user:1:name "太郎"
GET user:1:name
# "太郎"

# TTL(有効期限)付きキャッシュ
SETEX session:abc123 3600 "user_data"
TTL session:abc123
# 3599

# 複数キーの一括操作
MSET user:1:email "[email protected]" user:1:age "25"
MGET user:1:name user:1:email user:1:age
# 1) "太郎"
# 2) "[email protected]" 
# 3) "25"

# キー存在確認と削除
EXISTS user:1:name
# 1
DEL user:1:name
EXISTS user:1:name
# 0

ハッシュによるオブジェクトキャッシュ

# ユーザー情報をハッシュで格納
HMSET user:2 name "花子" email "[email protected]" age 28 status "active"
HGET user:2 name
# "花子"

# ハッシュの一部フィールド更新
HSET user:2 last_login "2025-06-21 10:30:00"
HINCRBY user:2 login_count 1

# ハッシュ全体取得
HGETALL user:2
# 1) "name"
# 2) "花子"
# 3) "email"
# 4) "[email protected]"
# 5) "age"
# 6) "28"
# 7) "status"
# 8) "active"
# 9) "last_login"
# 10) "2025-06-21 10:30:00"
# 11) "login_count"
# 12) "1"

# ハッシュフィールド削除
HDEL user:2 status

リストによるキューとスタック

# キューとしての使用(FIFO)
LPUSH task_queue "process_payment"
LPUSH task_queue "send_email" 
LPUSH task_queue "update_inventory"

# キューからタスク取り出し
RPOP task_queue
# "process_payment"

# スタックとしての使用(LIFO)
LPUSH recent_items "item3"
LPUSH recent_items "item2"
LPUSH recent_items "item1"

LPOP recent_items
# "item1"

# ブロッキングPOP(タスクキューで有用)
BLPOP task_queue 0  # 無限待機

セットによる一意性管理

# ユーザーのタグ管理
SADD user:1:tags "developer" "python" "redis"
SADD user:2:tags "designer" "photoshop" "redis"

# 共通タグ検索
SINTER user:1:tags user:2:tags
# 1) "redis"

# 全タグ取得
SMEMBERS user:1:tags
# 1) "developer"
# 2) "python" 
# 3) "redis"

# タグ存在確認
SISMEMBER user:1:tags "python"
# 1

# オンラインユーザー管理
SADD online_users "user:1" "user:2" "user:3"
SCARD online_users
# 3

ソート済みセットによるランキング

# スコアボード作成
ZADD leaderboard 1500 "player1"
ZADD leaderboard 2100 "player2" 
ZADD leaderboard 1800 "player3"

# ランキング表示(降順)
ZREVRANGE leaderboard 0 2 WITHSCORES
# 1) "player2"
# 2) "2100"
# 3) "player3"
# 4) "1800"
# 5) "player1"
# 6) "1500"

# スコア範囲検索
ZRANGEBYSCORE leaderboard 1600 2000
# 1) "player3"

# 順位取得
ZREVRANK leaderboard "player2"
# 0

パブリッシュ/サブスクライブ

# 端末1: サブスクライバー
SUBSCRIBE notifications user_alerts
# Reading messages...

# 端末2: パブリッシャー
PUBLISH notifications "システムメンテナンス開始"
# (integer) 1

PUBLISH user_alerts "新しいメッセージがあります"
# (integer) 1

# パターンマッチング購読
PSUBSCRIBE user:*:notifications
PUBLISH user:123:notifications "個人通知"

Redisクラスターとスケーリング

# クラスター情報確認
CLUSTER INFO
CLUSTER NODES

# シャーディング用ハッシュタグ
SET user:{1000}:profile "profile_data"
SET user:{1000}:preferences "pref_data"
# 同じハッシュスロットに配置される

# レプリケーション設定
# redis.conf
# replicaof 192.168.1.100 6379

# フェイルオーバー確認
INFO replication