今回はRedisを使ったNoSQL入門です。

解説動画はこちら


 

Redisで超簡単NoSQL入門

今回は Redis のお話です。

Redisは
オープンソースのインメモリデータベース(NoSQL)
になります。


Redisの特徴

キーと値の組み合わせ(キー・バリュー型)でデータを保存
すべてのデータをメモリ上に保持し、高速アクセスを実現
永続化(データの保存)も可能
シングルスレッドながら非常に高速な動作
Python, JavaScript, Go など多くの言語に対応
キャッシュやリアルタイム分析に最適です



Redisの仕組み

データは基本的にRAMに格納(超高速アクセス)
サーバーに配置すれば何処からでもアクセス可能
コマンド操作でデータの入出力などを行う

必要に応じてディスクにバックアップ(永続化)
RDB方式(スナップショット型)
一定間隔でメモリの状態を .rdb ファイルに保存



Redisが扱えるデータ構造

次のようなデータ型でデータを保存できます。

String 文字列、数値
List 順序付きリスト(スタック・キュー)
Set 重複のない集合
Sorted Set(ZSet) スコア付き集合(順序あり)
Hash フィールドと値の連想配列
Stream 時系列データのログ
Geo 地理情報(緯度・経度)



Redisの主なユースケース

Webアプリのキャッシュ
セッション管理
メッセージキュー
トークンや一時的なデータの保存



Colab で Redisを動かす

ここからはGoogle Colabで
Redisを動かしていきましょう。

Google Colabにはredis 関連のものが
インストールされていないので
インストール必要があります。


Redisのインストールと起動
!apt-get update > /dev/null
!apt-get install -y redis-server > /dev/null

Redisの起動
!redis-server --daemonize yes

接続確認
!redis-cli ping

Pythonクライアント(redis-py)のインストール
!pip install redis

Pythonでの接続確認
import redis

# Redisに接続
r = redis.Redis(host='localhost', port=6379, db=0)

# 接続テスト → True が返ればOK
r.ping()


ここからはデータの投入方法と
取得方法です。


String型(基本のキー・バリュー)
値のセット
r.set('キー名', '値')

値の取得
r.get('キー名')
※ データはバイト型で返る

# 値の保存(set)と取得(get)
r.set('message', 'こんにちは!')

print(r.get('message').decode())
こんにちは!




数値操作(インクリメント・デクリメント)

インクリメント
r.incr('キー名')

デクリメント
r.decr('キー名') 

# 値のセット(10)
r.set('count', 10)
print(r.get('count').decode())

# インクリメント(11)
r.incr('count')
print(r.get('count').decode())

# デクリメント(10)
r.decr('count')
print(r.get('count').decode())
10
11
10




List型(スタック/キュー構造)

値をキューに追加
r.rpush('キー名', '値1', '値2', '値3')

値をキューから取得(値を削除しつつ取得)
r.lpop('キー名')

値を全件取得
r.lrange('キー名', 0, -1)

# キューに追加(右) 3つ
r.rpush('task_queue', 'task1', 'task2', 'task3')

# キューから取り出す(左) → task1
print(r.lpop('task_queue').decode())

# 全件取得
print(r.lrange('task_queue', 0, -1))
task1
[b'task2', b'task3']




Hash型(辞書データ)

値のセット
r.hset('キー名', mapping=値)

値の取得(一部)
r.hget('キー名', 'キー名')

値の取得(全部)
r.hgetall('キー名')

# ユーザーデータを登録
r.hset('user:1001', mapping={'name': 'Alice', 'age': '30', 'email': 'alice@example.com'})

# 一部の取得
print(r.hget('user:1001', 'email').decode())

# すべての取得
print(r.hgetall('user:1001'))  # バイナリ形式
alice@example.com
{b'name': b'Alice', b'age': b'30', b'email': b'alice@example.com'}




Set型(重複なし集合)

値のセット
r.sadd('キー名', '値1', '値2', '値3')

値の取得(全部)
r.smembers('キー名')

# 値のセット(python は重複しない)
r.sadd('tags', 'python', 'redis', 'ai', 'python')
print(r.smembers('tags'))
{b'ai', b'redis', b'python'}



Sorted Set(ZSet)でランキング

値のセット
r.zadd('キー名', 値)

値の取得(昇順)
r.zrange('キー名', 開始インデックス, 終了インデックス, withscores=True or False)

値の取得(降順)
r.zrevrange('キー名', 開始インデックス, 終了インデックス, withscores=True or False)

# スコア付きで追加(ランキング)
r.zadd('ranking', {'Alice': 100, 'Bob': 80, 'Charlie': 90, 'Jon':20})

# スコアの降順で表示(上位3名)
print(r.zrevrange('ranking', 0, 2, withscores=True))

# スコアの昇順で表示(下位2名)
print(r.zrange('ranking', 0, 1, withscores=False))
[(b'Alice', 100.0), (b'Charlie', 90.0), (b'Bob', 80.0)]
[b'Jon', b'Bob']



キーの一覧と値の削除

キーの一覧を取得
r.keys('*')

値の削除
r.delete("キー名")

# すべてのキー
print(r.keys('*'))  

# 一括削除
r.delete('message', 'count', 'task_queue', 'user:1001', 'tags', 'ranking')  
print(r.keys('*')) 
[b'tags', b'user:1001', b'ranking', b'message', b'count', b'task_queue']
[]



ユースケースでの使い方

デジタル広告業界
広告クリックの誤クリック判定(5秒の一時記録)
クリックから5秒以内のクリックを無効にする

import redis
import time

# Redisに接続(ローカル or クラウド)
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)

def track_ckick(user_id: str, ad_id: str, timeout_sec: int = 5):
    key = f"clicked:{user_id}:{ad_id}"
    if r.exists(key):
        return "No (Already Counted)"
    else:
        r.setex(key, timeout_sec, 1)
        return "OK (New Click)"

print(track_ckick("user123", "ad789"))  # => OK
time.sleep(3)
print(track_ckick("user123", "ad789"))  # => NO
time.sleep(3)
print(track_ckick("user123", "ad789"))  # => OK (5秒過ぎた)
OK (New Click)
No (Already Counted)
OK (New Click)



まとめ

Redisが使えるようになると
プログラミングやシステム開発の幅が広がります

様々な業界の多用途にマッチする使い方があり
大規模なキャッシュサーバー構築なども出来るので
システム開発ではNoSQLの使用は必須項目です

まずは入門編で使い方を学んでみましょう
それでは