Redis入門

Home PDF

Redisの公式サイトを開くと、最初の一文には、Redisはオープンソースのインメモリ型データ構造ストレージで、データベースやキャッシュとしてよく使われると書かれています。Redisは非常に一般的です。

Redisのインストール

公式サイトからRedisをインストールできます。SQLiteと同様です。インストールが完了したら、PythonRedisをどのように使用するのでしょうか。

pip install redis
>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, db=0)
>>> r.set('foo', 'bar')
True
>>> r.get('foo')
b'bar'

このコードは、PythonでRedisデータベースに接続し、キーと値のペアを設定・取得する基本的な操作を示しています。以下に各ステップの説明を日本語で記載します。

  1. import redis: Redisライブラリをインポートします。
  2. r = redis.Redis(host='localhost', port=6379, db=0): Redisサーバーに接続します。hostはサーバーのアドレス、portは接続ポート、dbはデータベース番号を指定します。
  3. r.set('foo', 'bar'): キー 'foo' に値 'bar' を設定します。成功すると True が返されます。
  4. r.get('foo'): キー 'foo' に対応する値を取得します。値はバイト文字列として返されるため、b'bar' と表示されます。

Pythonのドキュメントにはいくつかの例が記載されています。ここでpipのようなものが登場します。pipはパッケージ管理ツールです。パッケージ管理ツールとは何かについては、「プログラミング環境に慣れる」の章を参照してください。pipPythonにとって、HomebrewmacOSシステムにとっての存在に相当します。

pipは通常、Pythonをインストールする際に既に含まれています。もしコンピュータに複数のバージョンのPythonPipが存在する場合、~/.bash_profileに以下の2行を追加することができます:

alias python=/usr/local/Cellar/python@3.9/3.9.1_6/bin/python3
alias pip=/usr/local/Cellar/python@3.9/3.9.1_6/bin/pip3

このコードは、シェルのエイリアスを設定しています。具体的には、pythonpip コマンドを、指定されたパスの Python 3.9.1 の実行ファイルにリンクしています。これにより、ターミナルで pythonpip と入力したときに、指定されたバージョンの Python と pip が使用されるようになります。

指定されたバージョンのpythonpipをインストールする方法の一つとして、Homebrewを使用することができます。また、ソースコードからビルドしてインストールすることも可能です。

make
make test
make install

(注:上記のコードブロックはシェルコマンドであり、翻訳の必要はありません。そのままの形で使用されます。)

$ redis-server
87684:C 2021年3月10日 14:46:06.056 # oO0OoO0OoO0Oo Redisが起動しています oO0OoO0OoO0Oo
87684:C 2021年3月10日 14:46:06.056 # Redisバージョン=6.2.1, ビット=64, コミット=00000000, 変更=0, PID=87684, 起動直後
87684:C 2021年3月10日 14:46:06.056 # 警告: 設定ファイルが指定されていません。デフォルトの設定を使用します。設定ファイルを指定するには、redis-server /path/to/redis.conf を使用してください
87684:M 2021年3月10日 14:46:06.057 * 開くファイルの最大数を10032に増やしました(元々は4864に設定されていました)。
87684:M 2021年3月10日 14:46:06.057 * 単調増加クロック: POSIX clock_gettime
...
Redis 6.2.1 (00000000/0) 64ビット
...
87684:M 2021年3月10日 14:46:06.058 # サーバーが初期化されました
87684:M 2021年3月10日 14:46:06.058 * 接続を受け入れる準備ができました

以下に一部の内容を抜粋しました。これでインストールが完了したことがわかります。バージョンは6.2.1で、公式サイトの最新版です。別のターミナルウィンドウを開いて、試しに操作してみましょう:

$ redis-cli
127.0.0.1:6379> set a 2
OK
127.0.0.1:6379> get a
"2"

以下のコードを実行してください。

import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')
print(r.get('foo'))

出力:

$ python fib_redis.py
b'bar'

Redis キャッシュの例

以下是一个使用Redis实现斐波那契数列的示例。我们将使用Redis来存储已经计算过的斐波那契数,以避免重复计算。

1. 安装Redis

首先,确保你已经安装了Redis。你可以通过以下命令安装Redis:

sudo apt-get install redis-server

2. 安装Redis客户端

我们将使用Python来与Redis进行交互。首先,安装redis Python包:

pip install redis

3. 实现斐波那契数列

接下来,我们编写一个Python脚本来实现斐波那契数列,并使用Redis来缓存结果。

import redis

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

def fibonacci(n):
    # 检查Redis中是否已经缓存了结果
    cached_result = r.get(n)
    if cached_result:
        print(f"Cache hit for {n}")
        return int(cached_result)
    
    # 如果n小于等于1,直接返回n
    if n <= 1:
        result = n
    else:
        # 递归计算斐波那契数列
        result = fibonacci(n-1) + fibonacci(n-2)
    
    # 将结果存入Redis
    r.set(n, result)
    print(f"Cache miss for {n}, calculated result: {result}")
    return result

# 测试
if __name__ == "__main__":
    n = 10
    print(f"Fibonacci({n}) = {fibonacci(n)}")

4. 运行脚本

运行上述脚本,你将看到类似以下的输出:

Cache miss for 0, calculated result: 0
Cache miss for 1, calculated result: 1
Cache miss for 2, calculated result: 1
Cache miss for 3, calculated result: 2
Cache miss for 4, calculated result: 3
Cache miss for 5, calculated result: 5
Cache miss for 6, calculated result: 8
Cache miss for 7, calculated result: 13
Cache miss for 8, calculated result: 21
Cache miss for 9, calculated result: 34
Cache miss for 10, calculated result: 55
Fibonacci(10) = 55

5. 解释

6. 性能优化

通过使用Redis缓存,我们可以显著减少重复计算的时间,尤其是在计算较大的斐波那契数时。

7. 总结

通过结合Redis和Python,我们实现了一个高效的斐波那契数列计算器。Redis的缓存机制帮助我们避免了重复计算,从而提高了性能。

import redis
r = redis.Redis(host='localhost', port=6379, db=0)
def f(n):
    nr = r.get(n)
    if nr is not None:
        return int(nr)
    res_n = 0
    if n < 2:
        res_n = n
    else:
        res_n = f(n-1) + f(n-2)
    
    r.set(n, res_n)
    return res_n
print(f(10))

これで完了です。


Back 2025.01.18 Donate