コンテンツにスキップ

Redis@NoSQL

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. DBエンジンの種類

インメモリ方式

メモリ上にデータを保管する。

揮発的なため、Redisを再起動するとデータが削除されてしまう。


オンディスク方式

ディスク上にデータを永続化する。


02. ユースケース

セッション


クエリキャッシュ


DB排他制御 (分散ロック)

*実装例*

import redis

client = redis.Redis()

# ロックを定義する
client.setnx('LOCK_NAME', 'foo_lock')  # True

# 確認する
client.get('LOCK_NAME')  # 'foo_lock'

# 同じキーで登録を試みると失敗する。この判定を排他制御のために使用する。
client.setnx('LOCK_NAME', 'foo_lock')  # False

# アンロックする
client.delete('LOCK_NAME')

*実装例*

func (c *Client) updateCache(ctx context.Context, contentID string) error {

        // ロックする
        // ロックのクライアントで障害が起こってアンロックできなくなることを防ぐために、ロックの失効時間を設定しておく
        nx, err := c.cli.SetNX(ctx, "lock:"+contentID, true, lockTTL).Result()

        if err != nil {
                return err
        }

        if !nx {
                return errors.New("failed to lock")
        }

        // 処理の最後にアンロックする
        defer func() {
                c.cli.Del(ctx, "lock:"+contentID)
        }()

        // なんらかの永続処理
        // ...

        // 処理結果のキャッシュを作成する
        _, err = c.cli.Set(ctx, contentID, content, cacheTTL).Result()

        if err != nil {
                return err
        }

        return nil
}