今さらPython3 (61) - Redis その3

意外にボリュームがある第8章。Redisの3回目に突入。

入門 Python 3

入門 Python 3

ビット

前回の最後にいかにそれっぽいloginsというソート済集合(セット)を作って、ログオン履歴的な感じでやっていたのに、ユーザに数値のIDを割り当てているなら、ビットの方がコンパクトで速いという。圧縮を戻すところのロジックが重たくない限りは、コンパクトの方が探しに行く範囲が狭いから早いよねというのは納得。全然関係ないけど、インメモリDBがここまで実用化できたのも圧縮技術があってこそだと個人的には思ってます。(身元がバレないようにこのぐらいで止めときますw)

>>> days = ['2013-02-25', '2013-02-26', '2013-02-27']
>>> big_spender = 1089
>>> tire_kicker = 40459
>>> late_joiner = 550212

ふむ。日付が3つとユーザIDが3つありますという感じですね。

>>> conn.setbit(days[0], big_spender, 1)
0
>>> conn.setbit(days[0], tire_kicker, 1)
0
>>> conn.setbit(days[1], big_spender, 1)
0
>>> conn.setbit(days[2], big_spender, 1)
0
>>> conn.setbit(days[2], late_joiner, 1)
0
>>> 

これが来訪記録を意味するわけですね。

>>> for day in days:
...     conn.bitcount(day)
... 
2
1
2

日ごとの来場者数ですね。分かります。

>>> conn.getbit(days[1], tire_kicker)
0
>>> conn.getbit(days[1], big_spender)
1
>||

getbit()は来場ありかなしかを0/1で返している。これも分かります。

>|python|
>>> conn.bitop('and', 'everyday', *days)
68777
>>> conn.bitcount('everyday')
1
>>> conn.getbit('everyday', big_spender)
1

bitop()は、3つあるdaysの内容から積集合的なモノをつくって、everydayに入れている。everydayをbit count()すれば何人いるかが分かるので、ひょっとしてbig_spender?と伺いを立てたら、当たりで1が返ってきたと理解。

>>> conn.bitop('or', 'alldays', *days)
68777
>>> conn.bitcount('alldays')
3
>>> 
>>> conn.getbit('alldays', big_spender)
1
>>> conn.getbit('alldays', tire_kicker)
1
>>> conn.getbit('alldays', late_joiner)
1

こんどはbitop()をOR演算しているので、どれか1日でも来場していればalldaysに返される。alldaysをbitcount()すれば3人という答えが得られますって事だね。

キャッシュと有効期限

expire()を使ってキャッシュとして保持する時間を秒単位で指定できると。

>>> import time
>>> key = 'now you see it'
>>> conn.set(key, 'but not for long')
True
>>> conn.expire(key, 30)
True
>>> conn.ttl(key)
23
>>> conn.get(key)
b'but not for long'
>>> time.sleep(15)
>>> conn.get(key)
>>> 

自分のようなおじさんには5秒ですべてを入力し終えるスピードはないので、expireの数字を30ぐらいの大きい数字にしてやってみました。ttl()で残り時間が表示され、その時間内であればconn.get(key)で値を拾えるが、その時間を超えてしまえば、消えちゃうよという説明ですね。

確かディスクにデータを保存できるというのもRedisのウリと書いてあったけど、ひとまずここで打ち止めにします。

そのほかのNoSQLたち

今は、ひとつひとつ試す訳にはいかないけど、こんなのもありますよって事ですね。

cassandra.apache.org
Apache CouchDB
Apache HBase – Apache HBase™ Home
fallabs.com
www.mongodb.org
ビッグデータ製品 | ビッグデータアプリケーション製品向け Riak | Basho

恥ずかしながら、知っていたのはcouchdb, mongodbぐらいで、他のはお初にお目に掛かりますって感じでした。

neo4j.com

個人的に、時間取って学習したいのはグラフデータベースのneo4jですね。

フルテキストDB

これも、後で必要になったときのためにリンクだけ置いておく。

Apache Lucene - Apache Lucene Core
Apache Solr -
www.elastic.co
sphinxsearch.com
The Xapian Project
mchaput / whoosh / wiki / Home — Bitbucket

(つづく)