データベース

Redis

概要

Redisは、最も人気の高いインメモリデータ構造ストアです。文字列、ハッシュ、リスト、セット、ソート済みセットなど豊富なデータ型をサポートし、高速キャッシュとセッション管理に最適化されています。データベース、キャッシュ、メッセージブローカーとして使用できます。

詳細

Redis(REmote DIctionary Server)は、2009年にSalvatore Sanfilippoによって開発されたオープンソースのインメモリデータベースです。主要な特徴として、すべてのデータをメモリ上に保持することで非常に高速な読み書きを実現しており、レイテンシが1ミリ秒以下という優れたパフォーマンスを誇ります。

Redisの主な特徴:

  • インメモリストレージによる高速性
  • 豊富なデータ構造(String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、Geospatial、Stream)
  • 永続化機能(RDB、AOF)
  • レプリケーション・クラスタリング
  • Pub/Subメッセージング
  • Lua スクリプト実行
  • TTL(Time To Live)による自動期限切れ
  • Redis Stack(JSON、Search、Graph、Time Series等の拡張機能)
  • アトミック操作
  • 高可用性とスケーラビリティ

メリット・デメリット

メリット

  • 超高速: インメモリ処理により1ミリ秒以下のレイテンシ
  • 豊富なデータ構造: 単なるKey-Valueを超えた多様なデータ型
  • スケーラビリティ: クラスタリングによる水平スケーリング
  • 永続化: RDBとAOFによるデータ保護
  • 使いやすさ: シンプルなAPIと直感的なコマンド
  • コミュニティ: 活発な開発コミュニティとエコシステム
  • 多目的: キャッシュ、データベース、メッセージブローカー
  • Redis Stack: モジュールによる機能拡張

デメリット

  • メモリ使用量: すべてのデータがメモリに必要
  • コスト: 大容量データではメモリコストが高い
  • シングルスレッド: 一部の重い操作でブロックが発生
  • 永続化オーバーヘッド: 永続化によるパフォーマンス影響
  • 複雑なクエリ: SQLのような複雑なクエリは不得意

主要リンク

書き方の例

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

# Ubuntu/Debian
sudo apt update
sudo apt install redis-server redis-cli

# Red Hat/CentOS
sudo yum install redis redis-tools
sudo systemctl start redis
sudo systemctl enable redis

# macOS (Homebrew)
brew install redis
brew services start redis

# Docker
docker run --name redis-server -p 6379:6379 -d redis:7-alpine

# Redis Stack (All modules included)
docker run -p 6379:6379 -p 8001:8001 redis/redis-stack:latest

# Redis CLI接続
redis-cli
redis-cli -h localhost -p 6379

基本操作(データ型)

# 文字列操作
SET mykey "Hello Redis"
GET mykey
INCR counter
INCRBY counter 10
MSET key1 "value1" key2 "value2"
MGET key1 key2

# ハッシュ操作
HSET user:1 name "田中太郎" email "[email protected]" age 30
HGET user:1 name
HGETALL user:1
HINCRBY user:1 age 1

# リスト操作
LPUSH mylist "item1" "item2" "item3"
RPUSH mylist "item4"
LRANGE mylist 0 -1
LPOP mylist
LLEN mylist

# セット操作
SADD myset "apple" "banana" "orange"
SMEMBERS myset
SISMEMBER myset "apple"
SCARD myset
SINTER set1 set2

# ソート済みセット操作
ZADD ranking 100 "Alice" 200 "Bob" 150 "Charlie"
ZRANGE ranking 0 -1 WITHSCORES
ZREVRANGE ranking 0 2
ZRANK ranking "Bob"

データ構造と高度な機能

# TTL(Time To Live)設定
SET temp_key "temporary_value" EX 3600  # 1時間で期限切れ
EXPIRE mykey 300  # 5分後に期限切れ
TTL mykey  # 残り時間確認

# Bitmap操作
SETBIT user_active 123 1  # ユーザー123をアクティブに
GETBIT user_active 123
BITCOUNT user_active  # アクティブユーザー数

# HyperLogLog(カーディナリティ推定)
PFADD unique_visitors "user1" "user2" "user3"
PFCOUNT unique_visitors
PFMERGE merged_visitors visitors_day1 visitors_day2

# Geospatial(地理情報)
GEOADD locations 139.6917 35.6895 "Tokyo" 135.5023 34.6937 "Osaka"
GEODIST locations Tokyo Osaka km
GEORADIUS locations 139.6917 35.6895 100 km

# Streams(ログストリーミング)
XADD mystream * user "alice" action "login" timestamp 1640995200
XRANGE mystream - +
XREAD COUNT 2 STREAMS mystream 0

Redis Stack機能

# JSON操作 (RedisJSON)
JSON.SET user:1001 $ '{"name":"田中太郎","age":30,"skills":["Python","Redis"]}'
JSON.GET user:1001
JSON.SET user:1001 $.age 31
JSON.ARRAPPEND user:1001 $.skills '"JavaScript"'

# 検索・インデックス (RediSearch)
FT.CREATE idx:users ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.age AS age NUMERIC
FT.SEARCH idx:users "@name:田中*"
FT.SEARCH idx:users "@age:[25 35]"

# グラフデータベース (RedisGraph)
GRAPH.QUERY social "CREATE (:Person {name:'Alice', age:30})-[:KNOWS]->(:Person {name:'Bob', age:25})"
GRAPH.QUERY social "MATCH (p:Person) RETURN p.name, p.age"

# 時系列データ (RedisTimeSeries)
TS.CREATE temperature:room1 RETENTION 86400000 LABELS room 1 sensor temp
TS.ADD temperature:room1 * 23.5
TS.RANGE temperature:room1 - +

最適化・パフォーマンス

# メモリ使用量確認
INFO memory
MEMORY USAGE mykey

# パフォーマンス監視
INFO stats
SLOWLOG GET 10  # 遅いクエリ確認
MONITOR  # リアルタイムコマンド監視

# 設定最適化
CONFIG GET maxmemory
CONFIG SET maxmemory 2gb
CONFIG SET maxmemory-policy allkeys-lru

# パイプライン処理(Redis CLI)
redis-cli --pipe < commands.txt

# Lua スクリプト(アトミック操作)
EVAL "
local current = redis.call('GET', KEYS[1])
if current == false then
    redis.call('SET', KEYS[1], ARGV[1])
    return 1
else
    return 0
end
" 1 mykey "new_value"

実用例・本番運用

# レプリケーション設定(マスター)
# redis.conf
bind 0.0.0.0
protected-mode no
port 6379

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

# クラスタ設定
redis-cli --cluster create \
  192.168.1.100:7000 192.168.1.100:7001 192.168.1.100:7002 \
  192.168.1.101:7000 192.168.1.101:7001 192.168.1.101:7002 \
  --cluster-replicas 1

# 永続化設定(redis.conf)
# RDB設定
save 900 1    # 900秒間に1回以上の変更があればRDB保存
save 300 10   # 300秒間に10回以上の変更があればRDB保存
save 60 10000 # 60秒間に10000回以上の変更があればRDB保存

# AOF設定
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# セキュリティ設定
requirepass mypassword
rename-command FLUSHDB ""
rename-command FLUSHALL ""

# バックアップ・復旧
BGSAVE  # バックグラウンドでRDBファイル作成
BGREWRITEAOF  # AOFファイルの最適化