今さらPython3 (59) - Redis その1
ひきつづき第8章。

- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Redis
Redisは、データ構造サーバーで原則としてメモリに収めると聞くと、memcachedに近いモノを想像してしまうけど、ディスクにデータを保存できるとか、文字列以外のデータ構造もあるなら、先にこっちを教えてくれよって感じもするw。
これもインストールして試してみよう。こうやって、自分のMacにゴミが溜まっていくわけだが、将来への投資だから甘んじて受け入れよう。(何様?)
$ brew install Redis
==> Downloading https://homebrew.bintray.com/bottles/redis-3.0.1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring redis-3.0.1.yosemite.bottle.tar.gz
==> Caveats
To have launchd start redis at login:
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
redis-server /usr/local/etc/redis.conf
==> Summary
🍺 /usr/local/Cellar/redis/3.0.1: 9 files, 888KHomebrewで簡単にインストールできました。起動の仕方も書いてあったので、そのまま起動してみる。
$ redis-server /usr/local/etc/redis.conf
11263:M 24 Dec 12:10:39.549 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.1 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 11263
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
11263:M 24 Dec 12:10:39.551 # Server started, Redis version 3.0.1
11263:M 24 Dec 12:10:39.551 * The server is now ready to accept connections on port 6379つづいて、ドライバのインストール。これは、別ターミナルウィンドウを開いて行う必要あり。てか、最初から2つ開いておけば良いんだけどね。
$ pip3 install redis
Collecting redis
Downloading redis-2.10.5-py2.py3-none-any.whl (60kB)
100% |████████████████████████████████| 61kB 4.4MB/s
Installing collected packages: redis
Successfully installed redis-2.10.5これで準備完了のはず。Pythonに戻って、
>>> import redis
>>> conn = redis.Redis()
Redisの起動画面にPort番号なんかが出ていたが、redis.Redis('localhost', 6379)でもOKという事だね。これで準備完了。
文字列
>>> conn.keys('*')
[]
すべてのキーのリストを出そうとしたが、まだ何も作っていないので空のリストが返ってきた。
>>> conn.set('secret', 'ni!') True >>> conn.set('carats', 24) True >>> conn.set('fever', 101.5) True >>> conn.keys('*') [b'fever', b'carats', b'secret'] >>> conn.get('secret') b'ni!' >>> conn.get('carats') b'24' >>> conn.get('fever') b'101.5'
とりあえず3つキーと値を登録して、それらの値を取り出してみたところ。
>>> ni = 'ni!' >>> ni == conn.get('secret') False >>> ni == conn.get('secret').decode('utf-8') True
バイナリになっているので、文字列として扱うときはデコードする必要がありそう。
>>> conn.setnx('secret', 'icky-icky-icky-ptang-zoop-boing!') False >>> conn.get('secret') b'ni!' >>> conn.getset('secret', 'icky-icky-icky-ptang-zoop-boing!') b'ni!' >>> conn.get('secret') b'icky-icky-icky-ptang-zoop-boing!' >>>
setnx()は上書きを禁止した状態で値のセットを試みる、getset()は元の値を返しつつ、新しい値に上書きするオプション。
>>> conn.getrange('secret', -6, -1) b'boing!' >>> conn.setrange('secret', 0, 'ICKY') 32 >>> conn.get('secret') b'ICKY-icky-icky-ptang-zoop-boing!'
getrange()はキーの指定した範囲の内容を取り出している。setrange()は指定した位置(0なので先頭)から文字列を置き換えている。戻り値の32とは何を意味するんだろう?
>>> conn.mset({'pie': 'cherry', 'cordial': 'sherry'})
True
>>> conn.mget(['fever', 'carats'])
[b'101.5', b'24']
>>> conn.delete('fever')
1
>>>
>>> conn.keys('*')
[b'carats', b'cordial', b'secret', b'pie']
>>>
mset(), mget()で複数のキーを設定したり、値を取得できる。delete()は要素の削除ができる。
>>> conn.incr('carats') 25 >>> conn.incr('carats', 10) 35 >>> conn.decr('carats') 34 >>> conn.decr('carats', 15) 19 >>> conn.set('fever', '101.5') True >>> conn.incrbyfloat('fever') 102.5 >>> conn.incrbyfloat('fever', 0.5) 103.0 >>> conn.incrbyfloat('fever', -2.0) 101.0 >>> conn.incr('carats', -10) 9 >>> conn.decr('carats', -10) 19
インクリメント、デクリメントをやっている。オプションなしだと1(floatなら1.0)ずつ、第2引数に数字を指定してやることで、その数値分値を動かすことが出来る。decrbyfloatがないので負数を使っていると説明されているが、incr/decrで負数を使う事が禁じられているわけではないようだ。
(つづく)