Valkey

Redis互換のオープンソースインメモリデータストア。Linux Foundationプロジェクトとして、コミュニティ主導で開発。Redis7.2ベースの安定性。

キャッシュサーバーインメモリデータベースRedis互換オープンソースLinux Foundation

キャッシュサーバー

Valkey

概要

ValkeyはLinux Foundationが支援するRedis互換のオープンソースインメモリデータストアです。2024年3月にRedisのライセンス変更への対応として、Redis 7.2.4をベースにコミュニティ主導で開発が開始されました。AWS、Google Cloud、Oracle等の業界大手企業がサポートし、元Redisメンテナーが中心となって開発。Redis API、CLI、RESPプロトコルとの完全互換性を保ちながら、BSD-3-Clauseライセンスの下でオープンソースとして維持。ドロップイン代替として設計され、Redis 7.2.4からValkey 7.2.5への移行は最小限の変更で実現可能です。

詳細

Valkey 2024年版は、Redisエコシステムの継続性を保証するコミュニティ主導プロジェクトとして急速な成長を遂げています。Linux Foundation傘下での開発により信頼性と持続性を確保し、元Redisメンテナーとエンタープライズパートナーの協力で技術的品質を維持。マルチスレッドI/O改善によりモダンなマルチコアプロセッサーを効率活用し、従来のRedisシングルスレッドイベントループの制約を解決。Linux、macOS、OpenBSD、NetBSD、FreeBSDの複数プラットフォームをサポートし、豊富なデータ型、Luaスクリプト、モジュールプラグインによる拡張性を提供します。

主な特徴

  • Redis完全互換: API、CLI、RESPプロトコルの完全互換性
  • Linux Foundation支援: 持続的な開発とコミュニティサポート
  • マルチスレッドI/O改善: マルチコアプロセッサーの効率活用
  • オープンソースライセンス: BSD-3-Clauseライセンスで制約なし
  • 企業サポート: AWS、Google Cloud、Oracle等の大手支援
  • 豊富なデータ型: 文字列、ハッシュ、リスト、セット、ソートセット等

メリット・デメリット

メリット

  • 既存Redisアプリケーションからの移行が極めて容易(ドロップイン代替)
  • BSD-3-Clauseライセンスによる制約のない商用利用可能
  • Linux Foundationサポートによる長期安定性と継続性保証
  • 企業レベルの技術サポートとエコシステム(AWS、Google、Oracle)
  • マルチスレッドI/O改善によるパフォーマンス向上
  • アクティブなコミュニティ開発と迅速なリリースサイクル

デメリット

  • 比較的新しいプロジェクトで長期実績が限定的
  • Redis本家と比較してコミュニティ規模が小さい
  • 一部の最新Redis機能への追従にタイムラグの可能性
  • 企業での大規模導入事例がまだ限定的
  • ドキュメントやサードパーティツールがRedis中心
  • エコシステム移行期間中の不確実性

参考ページ

書き方の例

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

# macOS (Homebrew)
brew install valkey

# サービスとして起動
brew services start valkey

# サービス状態確認
brew services info valkey

# サービス停止
brew services stop valkey

# Alpine Linux
sudo apk update
sudo apk add valkey

# valkey-cliのインストール
sudo apk add valkey-cli

# Redis互換シンボリックリンクのインストール
sudo apk add valkey-compat

# CentOS/RHEL/Fedora
sudo yum install valkey

# Redis互換シンボリックリンク
sudo yum install valkey-compat

# マニュアルページ(man valkey.conf等)
sudo yum install valkey-doc

# Ubuntu/Debian
sudo apt update
sudo apt install valkey

# Valkeyサーバー起動
valkey-server

# 設定ファイル指定での起動
valkey-server /path/to/valkey.conf

# 接続テスト
valkey-cli ping
# PONG

基本設定(valkey.conf)

# ネットワーク設定
bind 127.0.0.1                    # 接続許可IPアドレス
port 6379                         # リッスンポート
tcp-backlog 511                   # TCP接続キュー

# メモリ管理
maxmemory 2gb                     # 最大メモリ使用量
maxmemory-policy allkeys-lru      # メモリ不足時の削除ポリシー

# 永続化設定
save 900 1                        # 900秒間に1つ以上の変更でスナップショット
save 300 10                       # 300秒間に10以上の変更でスナップショット
save 60 10000                     # 60秒間に10000以上の変更でスナップショット

# AOF永続化
appendonly yes                    # AOF有効化
appendfilename "appendonly.aof"   # AOFファイル名

# ログ設定
loglevel notice                   # ログレベル
logfile /var/log/valkey/valkey-server.log

# セキュリティ設定
# requirepass your-password        # アクセスパスワード
# rename-command FLUSHDB ""        # 危険なコマンドの無効化
# rename-command FLUSHALL ""
# rename-command CONFIG ""

# クラスター設定(クラスターモード使用時)
# cluster-enabled yes
# cluster-config-file nodes.conf
# cluster-node-timeout 5000

# コマンドライン設定の例
# ./valkey-server --port 6380 --replicaof 127.0.0.1 6379

Python redis-pyライブラリでの接続

import redis
import time

# ValkeyサーバーへのRedisクライアント接続(完全互換)
valkey_client = redis.Redis(
    host='localhost',
    port=6379,
    db=0,
    decode_responses=True,  # 文字列として結果を取得
    socket_keepalive=True,
    socket_keepalive_options={},
    health_check_interval=30
)

# 接続確認
try:
    response = valkey_client.ping()
    print(f"Valkey接続成功: {response}")  # True
    
    # サーバー情報取得
    info = valkey_client.info()
    print(f"Valkeyバージョン: {info.get('valkey_version', 'Unknown')}")
    print(f"使用メモリ: {info['used_memory_human']}")
    print(f"接続クライアント数: {info['connected_clients']}")
    
except redis.ConnectionError as e:
    print(f"Valkey接続失敗: {e}")

# 基本的なデータ操作
# 文字列データ操作
valkey_client.set('user:1:name', '田中太郎')
valkey_client.set('user:1:age', 30)
valkey_client.set('user:1:email', '[email protected]')

# 有効期限付きデータ
valkey_client.setex('session:abc123', 3600, 'session_data')  # 1時間で期限切れ
valkey_client.expire('user:1:name', 86400)  # 24時間で期限切れ

# データ取得
name = valkey_client.get('user:1:name')
age = valkey_client.get('user:1:age')
print(f"ユーザー: {name}, 年齢: {age}")

# ハッシュ操作
user_data = {
    'name': '佐藤花子',
    'age': '25',
    'city': '東京',
    'job': 'エンジニア',
    'salary': '5000000'
}

valkey_client.hset('user:2', mapping=user_data)
user_info = valkey_client.hgetall('user:2')
print(f"ユーザー情報: {user_info}")

# 特定フィールドの存在確認
if valkey_client.hexists('user:2', 'salary'):
    salary = valkey_client.hget('user:2', 'salary')
    print(f"給与: {salary}")

# リスト操作
valkey_client.lpush('notifications', 'メッセージ1', 'メッセージ2', 'メッセージ3')
notifications_count = valkey_client.llen('notifications')
print(f"通知件数: {notifications_count}")

latest_notification = valkey_client.lpop('notifications')
print(f"最新通知: {latest_notification}")

# セット操作
valkey_client.sadd('tags:python', 'web', 'api', 'automation', 'data-science')
valkey_client.sadd('tags:javascript', 'web', 'frontend', 'nodejs', 'api')

# 共通タグの取得
common_tags = valkey_client.sinter('tags:python', 'tags:javascript')
print(f"共通タグ: {common_tags}")

# ソートセット操作
valkey_client.zadd('leaderboard', {
    'player1': 1000, 
    'player2': 1500, 
    'player3': 800,
    'player4': 1200
})

# 上位プレイヤー取得
top_players = valkey_client.zrevrange('leaderboard', 0, 2, withscores=True)
print(f"上位3プレイヤー: {top_players}")

# 範囲内のプレイヤー取得
mid_range_players = valkey_client.zrangebyscore('leaderboard', 900, 1300, withscores=True)
print(f"900-1300点のプレイヤー: {mid_range_players}")

Valkey CLIでの管理操作

# Valkey CLIでの接続
valkey-cli -h localhost -p 6379

# インタラクティブモード
valkey> PING
PONG

valkey> SET mykey "Hello Valkey"
OK

valkey> GET mykey
"Hello Valkey"

# サーバー情報の確認
valkey> INFO server
# Valkeyバージョン、稼働時間、設定情報等

valkey> INFO memory
# メモリ使用量、断片化率等

valkey> INFO stats
# 統計情報、接続数、処理済みコマンド数等

# 設定確認
valkey> CONFIG GET *
# 全設定パラメータの取得

valkey> CONFIG GET maxmemory
1) "maxmemory"
2) "2147483648"

# クライアント接続監視
valkey> CLIENT LIST
# 接続中のクライアント一覧

valkey> CLIENT INFO
# 現在のクライアント情報

# キー操作
valkey> KEYS pattern*    # パターンマッチングでキー検索(本番非推奨)
valkey> SCAN 0           # カーソルベースのキー走査(推奨)
valkey> EXISTS mykey     # キー存在確認
valkey> TYPE mykey       # キーのデータ型確認
valkey> TTL mykey        # 残り有効期限確認

# 複数キーの存在確認
valkey> MSET firstname Jack lastname Stuntman age 35
OK
valkey> EXISTS firstname lastname nonexistent
(integer) 2

# データベース管理
valkey> SELECT 1         # データベース切り替え
valkey> FLUSHDB          # 現在のDBをクリア
valkey> FLUSHALL         # 全DBをクリア(注意)

# コマンド情報の取得
valkey> COMMAND INFO get set eval
# 指定コマンドの詳細情報

# ACL(アクセス制御リスト)管理
valkey> ACL LIST
# ユーザー一覧

valkey> ACL USERS
# ユーザー名一覧

# パフォーマンス監視
valkey-cli --monitor     # リアルタイムコマンド監視
valkey-cli --latency     # レイテンシ監視
valkey-cli --stat        # 統計情報表示

クラスター設定例

# クラスターノード設定(valkey.conf)
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

# 複数ノードのディレクトリ作成
mkdir 7000 7001 7002 7003 7004 7005

# 各ノード用設定ファイル作成
for port in 7000 7001 7002 7003 7004 7005; do
  cat > $port/valkey.conf << EOF
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir ./$port
EOF
done

# 各ノードの起動
for port in 7000 7001 7002 7003 7004 7005; do
  cd $port
  valkey-server ./valkey.conf &
  cd ..
done

# クラスター初期化(valkey-cli使用)
valkey-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

# クラスター状態確認
valkey-cli -c -h 127.0.0.1 -p 7000
127.0.0.1:7000> CLUSTER INFO
127.0.0.1:7000> CLUSTER NODES

システムサービス設定例

# システムディレクトリ作成
sudo mkdir /etc/valkey
sudo mkdir /var/valkey

# 設定ファイルのコピー
sudo cp valkey.conf /etc/valkey/6379.conf

# init.dスクリプトのコピー(提供されている場合)
sudo cp utils/valkey_init_script /etc/init.d/valkey_6379

# 実行権限付与
sudo chmod +x /etc/init.d/valkey_6379

# システム起動時の自動起動設定
sudo update-rc.d valkey_6379 defaults

# サービスの手動開始
sudo /etc/init.d/valkey_6379 start

# サービス状態確認
sudo /etc/init.d/valkey_6379 status

# systemd設定例
sudo tee /etc/systemd/system/valkey.service << EOF
[Unit]
Description=Valkey In-Memory Data Store
After=network.target

[Service]
User=valkey
Group=valkey
ExecStart=/usr/local/bin/valkey-server /etc/valkey/valkey.conf
ExecStop=/usr/local/bin/valkey-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# systemdでの管理
sudo systemctl daemon-reload
sudo systemctl enable valkey
sudo systemctl start valkey
sudo systemctl status valkey

レプリケーション設定例

import redis
import time

# プライマリサーバー設定確認
primary = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)

# レプリカサーバー設定
replica = redis.Redis(host='127.0.0.1', port=6380, decode_responses=True)

# レプリケーション状態確認
def check_replication_status():
    try:
        # プライマリでデータ設定
        primary.set('replication_test', f'data_{int(time.time())}')
        
        # レプリカでデータ確認
        time.sleep(0.1)  # レプリケーション待機
        replica_data = replica.get('replication_test')
        
        print(f"レプリケーション成功: {replica_data}")
        
        # レプリケーション情報取得
        replication_info = replica.info('replication')
        print(f"レプリカ状態: {replication_info['role']}")
        print(f"マスター接続状態: {replication_info.get('master_link_status', 'N/A')}")
        
    except Exception as e:
        print(f"レプリケーション確認エラー: {e}")

check_replication_status()

# レプリケーション設定変更(CLIから)
# valkey-cli -p 6380
# 127.0.0.1:6380> REPLICAOF 127.0.0.1 6379
# 127.0.0.1:6380> REPLICAOF NO ONE  # レプリケーション停止