LoginSignup
21
21

More than 5 years have passed since last update.

【初心者向け】Redisのデータ型とPythonでの使い方サンプル

Last updated at Posted at 2019-03-25

Redisのデータ型とPythonでの使い方サンプルです。言語処理100本ノックをやっていて、第7章でKVSとしてRedisを使いました。そのときに学習したことのメモです。
NoSQLは使い所も多く学習価値が高いと考えたので「RDB技術者のためのNoSQLガイド」を購入してやや比重を重くして勉強しました。RDBと比べて考え方が斬新で面白かったです(非常にわかりやすく、初心者にありがたい本でした)。

環境

インストールに関しては記事「最新RedisのUbuntuへのインストールとPythonで使うまで」を参照ください。

種類 バージョン 内容
OS Ubuntu18.04.01 LTS 仮想で動かしています
Redis 5.0.4 2019/3/22時点でStableの最新です
pyenv 1.2.9 複数Python環境を使うことがあるのでpyenv使っています
Python 3.7.2 pyenv上でpython3.7.2を使っています
パッケージはvenvを使って管理しています

参考リンク

RDB技術者のためのNoSQLガイド
公式 Documentation - Data types
公式チュートリアル
SlideShare : Redisの特徴と活用方法について
SlideShare : webエンジニアのためのはじめてのredis
PrestoとHyperLogLogで、大量ログからユニークユーザー数を高速に推定する(理論編)

データ型

一覧

データ型 概要 イメージ図
Strings 文字型
KeyとValueが1:1のシンプル構造
RedisDataType01String.jpg
Lists 順序ありの文字型リスト(重複許容)
左端と右端を持ち、要素に対してどちらかから追加/削除を実行
SNSやブログのタイムラインに使われる
RedisDataType02List.jpg
Sets 順序、重複なしの文字型集合
タギングに使われる
RedisDataType03Sets.jpg
Sorted Sets 重複なしScoreによる順序ありの文字型集合
Scoreの値を使って特定が可能
RedisDataType04SortedSets.jpg
Hashes 重複なく、順序のない値とキーをセットで持つ RedisDataType05Hashed.jpg
Bitmap 0か1のbit集合を扱うためのデータ型 なし
HyperLogLog 大量データに対してユニークな要素数を高速に推定するためのデータ型 なし

1. Strings

Stringは基本の文字型。インクリメントもできる。
GitHub link : 10.DataString.ipynb

10.DataString.ipynb
from redis import Redis
r = Redis( )

# Keyを"key"にしてvalue"foo"を登録
r.set("key", "foo")
print(r.get("key"))
#=>b'foo'

# Keyを"test_int"にしてvalue 10を登録
r.set("test_int",10)

# インクリメントできる
r.incr("test_int")
print(r.get("test_int"))
#=>b'11'

# 削除
r.flushall()

2. Lists

単純なStringsのリスト型。重複可能で順序性あり。
GitHub link : 20.DataList.ipynb

from redis import Redis
r = Redis( )

# Listに値を追加(重複確認のためAを2回追加)
r.rpush("mylist", "A")
r.rpush("mylist", "B")
r.rpush("mylist", "A")

# Listの最初に値を追加
r.lpush("mylist", "first")

# Listを0(最初)から-1(全部)まで照会
r.lrange("mylist", 0, -1)
#=> [b'first', b'A', b'B', b'A']

# Listを1(2つ目)から2つまで照会
r.lrange("mylist", 1, 2)
#=> [b'A', b'B']

# 削除
r.flushall()

3. Sets

順序性がなく重複不可な文字型集合。
GitHub link : 30.DataSets.ipynb

from redis import Redis
r = Redis( )

# Setsに1, 2, 3を追加
r.sadd("myset", 1, 2, 3)
r.smembers("myset")
#=> {b'1', b'2', b'3'}

# 重複不可なので1を追加しようとしてもできない(return=0)
print(r.sadd("myset", 1))
#=> 0

# 削除
r.flushall()

4.Sorted Sets

Scoreというソートキーを内部的に持っているSets。重複不可。
GitHub link : 40.DataSortedSets.ipynb

from redis import Redis
r = Redis( )

# 辞書型の作成
dict = {}
dict["Alan Kay"]         = 1940
dict["Sophie Wilson"]    = 1957
dict["Richard Stallman"] = 1953

# 追加
r.zadd("hackers", dict)

# 参照(Scoreなし)
r.zrange("hackers",0,-1)
#=> [b'Alan Kay', b'Richard Stallman', b'Sophie Wilson']

# 参照(Scoreあり)
r.zrange("hackers",0,-1, withscores=True)
#=> [(b'Alan Kay', 1940.0),
#=>  (b'Richard Stallman', 1953.0),
#=>  (b'Sophie Wilson', 1957.0)]

# ちなみに、同じKeyで別値をzaddすると値上書き
dict2 = {}
dict2["Alan Kay"]         = 19401
r.zadd("hackers", dict2)

# 削除
r.flushall()

5. Hashes

順序のない値とセットをキーで保持。重複不可。
GitHub link : 50.DataHash.ipynb

from redis import Redis
r = Redis( )

# 1Valueをセット
r.hset("user:1000", "username", "antirez")
r.hgetall("user:1000")
#=> {b'username': b'antirez'}

# まとめてセット
dict = {}
dict["birthyear"]   = 1977
dict["verified"]    = 1
r.hmset("user:1000",dict)
r.hgetall("user:1000")
#=> {b'username': b'antirez', b'birthyear': b'1977', b'verified': b'1'}

# ちなみに、同じKeyで別値をセットすると値上書き
r.hset("user:1000", "username", "antirez2")
r.hgetall("user:1000")
#=> {b'username': b'antirez2', b'birthyear': b'1977', b'verified': b'1'}

# 削除
r.flushall()

主なクエリ一覧

コマンド redis-pyコマンド 説明
SET set(name, value, ex=None, px=None, nx=False, xx=False) Keyに対するValueを指定して新規格納/上書き
GET get(name) Keyに対するValueを取得
DEL delete(*names) Keyに対するValueを削除
INCR incr(name, amount=1) Keyに対してValueを1インクリメント
MSET mset(mapping) SETを複数一括処理
MGET mget(keys, *args) GETを複数一括処理
LPUSH lpush(name, *values) Keyに対するListの左端に要素追加
RPUSH rpush(name, *values) Keyに対するListの右端に要素追加
LLEN llen(name) Keyに対するList長取得
LRANGE lrange(name, start, end) Keyに対する開始と終了位置を指定したListの要素取得
LPOP lpop(name) Keyに対するList左端からの要素取得
RPOP rpop(name) Keyに対するList右端からの要素取得
SADD sadd(name, *values) Setsに対する要素追加
SREM srem(name, *values) Setsに対しての指定した要素削除
SISMEMBER sismember(name, value) Setsに対しての要素存在確認
SMEMBERS smembers(name) Setsに対しての要素全取得
SUNION sunion(keys, *args) 複数のSets結合結果取得(重複除外されている)
ZADD zadd(name, mapping, nx=False, xx=False, ch=False, incr=False) Sorted Setsに要素追加
ZRANGE zrange(name, start, end, desc=False, withscores=False, score_cast_func=) Sorted Setsに対する開始と終了位置を指定した要素取得
HSET hset(name, key, value) Hashesに対する要素追加
HGETALL hgetall(name) Hashesの要素を全取得
HMSET hmset(name, mapping) HSETを複数一括処理
HGET hget(name, key) Hashesに対して指定したフィールドのValue取得
HINCRBY hincrby(name, key, amount=1) Hashesに対して指定したフィールドのValueを1インクリメント
HDEL hdel(name, *keys) Hashesに対して指定したフィールドとValue削除
EXPIRE expire(name, time) Keyと秒数を指定して有効期限設定
TTL ttl(name) Keyを指定して有効期限取得
INFO info(section=None) Reidsサーバの状態・統計情報等取得
21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21