おいしいブログ

Cache用途にRedisを使う

2018-08-11

ブログにちょっとしたCacheが欲しくなったので、Redis on Dockerを追加する。

libary/redis を利用します。

library/redis - Docker Hub

# start a redis instance
$ docker run --name some-redis -d redis

# start with persistent storage
$ docker run --name some-redis -d redis redis-server --appendonly yes
If persistence is enabled, data is stored in the VOLUME /data, which can be used with --volumes-from some-volume-container or -v /docker/host/dir:/data

上記ページには persistent storage で動かしたい場合は --appendonly yes で起動して、/data をマウントすれば良いとありますが、永続化する必要はないので今回はそのまま起動。

python, redisの環境を準備

pythonのclientとして andymccurdy/redis-py を使ってRedisにRead/Writeしてみる。

GitHub - andymccurdy/redis-py: Redis Python Client

docker-composeは以下。

# docker-compose.yml
version: '3'
services:
    python3:
        image: frolvlad/alpine-python3
        container_name: python3
        links:
            - redis
        command: sleep  100000000
    redis:
        image: redis
        container_name: redis    

起動して、pythonのコンテナに入ります。

$ docker-compose up

pythonはこんな感じで、

/ # python -V
Python 3.6.3

/ # pip install redis
Collecting redis
  Downloading https://files.pythonhosted.org/packages/3b/f6/7a76333cf0b9251ecf49efff635015171843d9b977e4ffcf59f9c4428052/redis-2.10.6-py2.py3-none-any.whl (64kB)
    100% |████████████████████████████████| 71kB 3.2MB/s 
Installing collected packages: redis
Successfully installed redis-2.10.6
You are using pip version 9.0.3, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

/ # pip list --format=columns
Package    Version
---------- -------
pip        9.0.3  
redis      2.10.6 
setuptools 39.0.1 
/ # 

pythonからredisにRead/Write

redis-py の github、Getting Startedにぴゃっとした使い方が書いてあるので、そのまま動かす。

/ # python
Python 3.6.3 (default, Nov 21 2017, 14:55:19) 
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis

# `host`にはlinkしているcontainer_name
>>> pool = redis.ConnectionPool(host='redis', port=6379, db=0)
>>> r = redis.StrictRedis(connection_pool=pool)
>>> r.set('key', 'value')
True
>>> r.get('key')
b'value'
>>> 

すんなり動作。素晴らしいです😬

expire付きでset

ちょっとしたCache用途なので、いつまでもしつこく残っていられると面倒。ということでdata retention settingを。 ドキュメントには、

set(name, value, ex=None, px=None, nx=False, xx=False)[source]
    Set the value at key name to value
    ex sets an expire flag on key name for ex seconds.
    px sets an expire flag on key name for px milliseconds.
    nx if set to True, set the value at key name to value only
        if it does not exist.
    xx if set to True, set the value at key name to value only
        if it already exists.

とあり、 ex に秒を指定できるとあるので、指定。

>>> 
# とりあえず10秒
>>> r.set('exk', 'exv', ex=10)
True
>>> r.get('exk')
b'exv'
>>> r.get('exk')
b'exv'
>>> r.get('exk')
b'exv'
>>> r.get('exk')
b'exv'
>>> r.get('exk')
b'exv'
>>> r.get('exk')
b'exv'
>>> r.get('exk')
b'exv'
>>> r.get('exk')
>>> r.get('exk')
>>> r.get('exk') == None
True
>>> 

ということで、保持されていたデータが消えました。素晴らしいです😊

あとはブログの構成に組み込むだけなので、お手軽で助かります🙇