Valkey - Redisフォークのオープンソースin-memoryデータベース

中級 | 10分 で読める | 2026.04.24

公式ドキュメント

この記事の要点

• 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年にライセンスが変更され、クラウドプロバイダーによるマネージドサービス提供に制限が加えられました。この変更により、以下の懸念が生じました。

  1. オープンソースの定義から逸脱: OSI(Open Source Initiative)の基準を満たさなくなった
  2. ベンダーロックイン: 特定企業の判断に依存するライセンス運用
  3. コミュニティ分断: 主要貢献者やクラウドベンダーが離脱

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からの移行

移行ステップ

  1. バックアップ取得: 既存のRedisデータをRDBまたはAOFでバックアップ
  2. Valkeyインストール: Valkeyサーバーをセットアップ
  3. データ移行: RDB/AOFファイルをValkeyにロード
  4. アプリケーション接続先変更: 接続先をValkeyに切り替え
  5. 動作確認: すべての機能が正常に動作することを確認

データ移行例

# 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の比較

項目ValkeyRedis
ライセンス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との違いも理解しておくと便利です。

項目ValkeyMemcached
データ構造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は信頼できる選択肢となります。

関連記事

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る