この記事の要点
• RedisのLinux Foundationによるコミュニティフォーク
• Redis 7.2互換でコマンド・プロトコルをそのまま利用可能
• 完全なBSD/MIT/Apache 2.0ライセンスでベンダーロックインなし
Redisはin-memoryデータストアの代表格として広く使われてきましたが、ライセンス変更によりオープンソースコミュニティに大きな波紋が広がりました。Valkeyは、こうした状況を受けて誕生したRedisのコミュニティフォークとして、完全なOSS体制で開発が進められています。本記事では、Valkeyの背景・特徴・移行方法を解説します。
Valkeyとは
Valkeyは、Redis 7.2を基点としてLinux Foundationのもとでフォークされた、完全オープンソースのin-memoryデータストアです。AWSやGoogle Cloud、Oracleなど主要なクラウドベンダーが支援に参加し、コミュニティ主導で開発が進められています。
主要な特徴
- Redis互換性: Redis 7.2のコマンド・プロトコル・データ構造を完全互換
- オープンソースライセンス: BSD 3-Clause License(Redisの初期ライセンス)
- コミュニティガバナンス: Linux Foundationによる透明性の高い開発プロセス
- 高性能: Redisと同等のメモリ効率・レイテンシ・スループット
- マルチクラウド対応: AWS・GCP・Azure等の主要クラウドでサポート
- 活発な開発: 月次リリース・バグフィックス・新機能追加が継続中
ポイント: ValkeyはRedisの「代替」ではなく、Redisの初期の理念(完全オープンソース)を引き継ぐ「継続」です。既存のRedisユーザーは最小限の変更で移行できます。
Valkeyが誕生した背景
Redisのライセンス変更
Redisは長年BSD 3-Clauseライセンスで提供されてきましたが、2024年にライセンスが変更され、クラウドプロバイダーによるマネージドサービス提供に制限が加えられました。この変更により、以下の懸念が生じました。
- オープンソースの定義から逸脱: OSI(Open Source Initiative)の基準を満たさなくなった
- ベンダーロックイン: 特定企業の判断に依存するライセンス運用
- コミュニティ分断: 主要貢献者やクラウドベンダーが離脱
Valkeyプロジェクトの立ち上げ
これを受けて、AWS・Google Cloud・Oracle・Ericsson等が中心となり、Linux Foundationのもとで完全オープンソースのフォークとしてValkeyを立ち上げました。Valkeyの目標は以下の通りです。
- Redis 7.2の機能・互換性を維持
- 透明性の高いガバナンスモデル
- コミュニティからのフィードバックに基づく開発
- マルチベンダー・マルチクラウドでの中立性
ポイント: Valkeyは「反Redis」ではなく、Redisの初期の価値観を守るためのプロジェクトです。Redis開発者の多くがValkeyに参加しています。
アーキテクチャ
Valkeyのアーキテクチャは、Redisとほぼ同一です。
flowchart TB
subgraph Client["クライアント"]
A1["Redis CLI"]
A2["Python<br/>(redis-py)"]
A3["Node.js<br/>(ioredis)"]
end
subgraph Valkey["Valkey Server"]
B1["Network Layer<br/>(RESP Protocol)"]
B2["Command Processor"]
B3["Data Structures<br/>(String, List, Hash, Set, ZSet)"]
B4["Persistence<br/>(RDB, AOF)"]
B5["Replication<br/>(Master-Replica)"]
B6["Cluster<br/>(Sharding)"]
end
A1 --> B1
A2 --> B1
A3 --> B1
B1 --> B2
B2 --> B3
B3 --> B4
B3 --> B5
B3 --> B6
- Network Layer: RESPプロトコル(Redis Serialization Protocol)でクライアントと通信
- Command Processor: Redisコマンドを解析・実行
- Data Structures: String・List・Hash・Set・Sorted Set等をin-memoryで管理
- Persistence: RDB(スナップショット)・AOF(追記ログ)で永続化
- Replication: マスター/レプリカ構成でデータ複製
- Cluster: 複数ノードでデータをシャーディング
インストール
Dockerで起動
# Valkeyイメージをpull
docker pull valkey/valkey:latest
# コンテナを起動
docker run -d -p 6379:6379 --name valkey valkey/valkey:latest
# CLIで接続
docker exec -it valkey valkey-cli
パッケージマネージャーでインストール
# Ubuntu/Debian
sudo apt update
sudo apt install valkey
# macOS (Homebrew)
brew install valkey
# 起動
valkey-server
# 別ターミナルでCLI接続
valkey-cli
実践メモ: Valkeyはポート6379(Redisのデフォルトポート)をそのまま使用するため、既存のRedisクライアントライブラリが変更なしで動作します。
基本的な使い方
Valkeyのコマンドは、Redisと完全互換です。
String操作
# 値を設定
SET user:1000:name "Alice"
# 値を取得
GET user:1000:name
# 出力: "Alice"
# TTL(有効期限)付きで設定
SETEX session:abc123 3600 "user_data"
# 複数のキーを一括取得
MGET user:1000:name user:1001:name
# インクリメント
SET counter 0
INCR counter
# 出力: 1
List操作
# リストに追加
LPUSH tasks "task1"
LPUSH tasks "task2"
LPUSH tasks "task3"
# リストを取得
LRANGE tasks 0 -1
# 出力: ["task3", "task2", "task1"]
# リストから取り出し
LPOP tasks
# 出力: "task3"
Hash操作
# ハッシュを設定
HSET user:1000 name "Alice" age 30 email "alice@example.com"
# ハッシュを取得
HGET user:1000 name
# 出力: "Alice"
# すべてのフィールドを取得
HGETALL user:1000
# 出力: {"name": "Alice", "age": "30", "email": "alice@example.com"}
Set操作
# セットに追加
SADD tags:article:1 "redis" "database" "cache"
# セットを取得
SMEMBERS tags:article:1
# 出力: ["redis", "database", "cache"]
# セットの共通要素
SADD tags:article:2 "redis" "nosql"
SINTER tags:article:1 tags:article:2
# 出力: ["redis"]
Sorted Set操作
# スコア付きで追加
ZADD leaderboard 100 "player1"
ZADD leaderboard 200 "player2"
ZADD leaderboard 150 "player3"
# スコア順に取得
ZRANGE leaderboard 0 -1 WITHSCORES
# 出力: [("player1", 100), ("player3", 150), ("player2", 200)]
# 降順で取得
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 出力: [("player2", 200), ("player3", 150), ("player1", 100)]
Pythonクライアントとの統合
既存のRedisクライアントライブラリ(redis-py等)がそのまま動作します。
redis-pyでの接続
import redis
# Valkeyに接続(ホスト名・ポートはRedisと同じ)
client = redis.Redis(host='localhost', port=6379, decode_responses=True)
# 値を設定
client.set('user:1000:name', 'Alice')
# 値を取得
name = client.get('user:1000:name')
print(name) # 出力: Alice
# ハッシュ操作
client.hset('user:1000', mapping={
'name': 'Alice',
'age': 30,
'email': 'alice@example.com',
})
user = client.hgetall('user:1000')
print(user)
# 出力: {'name': 'Alice', 'age': '30', 'email': 'alice@example.com'}
# リスト操作
client.lpush('tasks', 'task1', 'task2', 'task3')
tasks = client.lrange('tasks', 0, -1)
print(tasks) # 出力: ['task3', 'task2', 'task1']
ポイント: コードを一切変更せずにRedisからValkeyに移行できます。接続先のホスト名・ポートを変更するだけです。
Node.jsクライアントとの統合
import { createClient } from 'redis';
// Valkeyに接続
const client = createClient({
socket: {
host: 'localhost',
port: 6379,
},
});
await client.connect();
// 値を設定
await client.set('user:1000:name', 'Alice');
// 値を取得
const name = await client.get('user:1000:name');
console.log(name); // 出力: Alice
// ハッシュ操作
await client.hSet('user:1000', {
name: 'Alice',
age: '30',
email: 'alice@example.com',
});
const user = await client.hGetAll('user:1000');
console.log(user);
// 出力: { name: 'Alice', age: '30', email: 'alice@example.com' }
await client.disconnect();
Redisからの移行
移行ステップ
- バックアップ取得: 既存のRedisデータをRDBまたはAOFでバックアップ
- Valkeyインストール: Valkeyサーバーをセットアップ
- データ移行: RDB/AOFファイルをValkeyにロード
- アプリケーション接続先変更: 接続先をValkeyに切り替え
- 動作確認: すべての機能が正常に動作することを確認
データ移行例
# Redisでデータをダンプ
redis-cli SAVE
# dump.rdbが生成される
# ValkeyにRDBをコピー
cp /var/lib/redis/dump.rdb /var/lib/valkey/dump.rdb
# Valkeyを再起動
sudo systemctl restart valkey
# Valkeyでデータを確認
valkey-cli
> KEYS *
注意: 本番環境での移行は、まずステージング環境で十分にテストしてから実施してください。特に、レプリケーション構成やクラスタ構成の場合は、切り替え手順を慎重に計画する必要があります。
クラウドプロバイダーのサポート
主要なクラウドプロバイダーは、ValkeyをマネージドサービスまたはMarketplaceで提供しています。
AWS ElastiCache for Valkey
AWSは、ElastiCacheでValkeyをサポートしています。
# AWS CLIでValkeyクラスタを作成
aws elasticache create-replication-group \
--replication-group-id my-valkey-cluster \
--replication-group-description "Valkey cluster" \
--engine valkey \
--cache-node-type cache.r7g.large \
--num-cache-clusters 3
Google Cloud Memorystore for Valkey
Google Cloudも、Memorystoreで Valkeyをサポートする予定です(詳細は公式ドキュメントを参照)。
ValkeyとRedisの比較
| 項目 | Valkey | Redis |
|---|---|---|
| ライセンス | BSD 3-Clause(完全OSS) | Redis Source Available License 2.0(制限あり) |
| ガバナンス | Linux Foundation(コミュニティ) | Redis Ltd.(単一企業) |
| 互換性 | Redis 7.2と完全互換 | - |
| 新機能開発 | コミュニティ主導 | Redis Ltd.主導 |
| クラウドサポート | AWS・GCP・Azure全て支援 | 一部制限あり |
ライセンス・ガバナンスの透明性を重視するならValkey、最新機能を最速で使いたいならRedisという選択になります。
ValkeyとMemcachedの比較
同じin-memoryストアとして、Memcachedとの違いも理解しておくと便利です。
| 項目 | Valkey | Memcached |
|---|---|---|
| データ構造 | String・List・Hash・Set・ZSet等 | Key-Valueのみ |
| 永続化 | RDB・AOFで永続化可能 | 非対応 |
| レプリケーション | マスター/レプリカ対応 | 非対応 |
| クラスタ | 標準対応 | クライアント側で実装 |
| 用途 | キャッシュ・セッション管理・ランキング・キュー等 | 単純なキャッシュ |
単純なキャッシュならMemcached、複雑なデータ構造や永続化が必要ならValkeyを選択します。
実践的なユースケース
1. セッション管理
import redis
from flask import Flask, session
from flask_session import Session
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(host='localhost', port=6379)
Session(app)
@app.route('/login')
def login():
session['user_id'] = 1000
return 'Logged in'
@app.route('/profile')
def profile():
user_id = session.get('user_id')
return f'User ID: {user_id}'
2. キャッシュ戦略
import redis
import json
from datetime import timedelta
client = redis.Redis(host='localhost', port=6379, decode_responses=True)
def get_user_with_cache(user_id: int) -> dict:
cache_key = f'user:{user_id}'
# キャッシュを確認
cached = client.get(cache_key)
if cached:
return json.loads(cached)
# キャッシュになければDBから取得
user = fetch_user_from_db(user_id)
# キャッシュに保存(1時間)
client.setex(
cache_key,
timedelta(hours=1),
json.dumps(user),
)
return user
def fetch_user_from_db(user_id: int) -> dict:
# DBクエリ(ダミー)
return {'id': user_id, 'name': 'Alice'}
詳細なキャッシュ戦略については、Redis キャッシング戦略 を参照してください。
3. ランキングシステム
import redis
client = redis.Redis(host='localhost', port=6379, decode_responses=True)
# スコアを追加
client.zadd('leaderboard:2026-04', {
'player_alice': 1500,
'player_bob': 2000,
'player_charlie': 1800,
})
# トップ10を取得
top10 = client.zrevrange('leaderboard:2026-04', 0, 9, withscores=True)
for rank, (player, score) in enumerate(top10, start=1):
print(f'{rank}. {player}: {score}')
# プレイヤーの順位を取得
rank = client.zrevrank('leaderboard:2026-04', 'player_alice')
print(f'Alice rank: {rank + 1}')
まとめ
Valkeyは、Redisの初期の理念を引き継ぎ、完全オープンソースで透明性の高いガバナンス体制を確立したin-memoryデータストアです。Redis 7.2との完全互換性により、既存のアプリケーションをほぼ変更なしで移行できます。
Valkeyを選ぶべきケース
- オープンソースライセンスを重視する
- マルチクラウド環境で中立性を保ちたい
- コミュニティ主導の開発プロセスを支持する
- ベンダーロックインを避けたい
- 既存のRedisアプリケーションをそのまま移行したい
ValkeyはLinux Foundationのもとで活発に開発が進められており、AWS・Google Cloud・Oracle等の主要ベンダーが支援しています。Redisのライセンス変更に懸念を持つ開発者・企業にとって、Valkeyは信頼できる選択肢となります。