翻訳元記事:https://lightning.network/lightning-network-summary.pdf
翻訳者:士林翻訳サービス
校正者:@jasagiri
翻訳記事のライセンス:CC-BY-4.0
ビットコインライトニングネットワーク(The Bitcoin Lightning Network)
http://lightning.network
ライトニングネットワーク(Lightning Network)は、即時に大量のマイクロ決済を行うための分散型システムで、信頼したサードパーティに資金管理を委譲するリスクを取り除きます。
世界で最も広く使われており、価値のあるデジタル通貨であるビットコインは、信頼される仲介者や預け先を介さない価値の送信を可能にします。ビットコインには先進のスクリプティングシステムが含まれ、ユーザーが資金に関する指示をプログラミングするのが可能になっています。しかし、ビットコインの分散型の設計には欠点があります。ビットコインのブロックチェーンで確認されたトランザクションが不可逆となるには最大1時間かかります。マイクロ決済(数円以下の支払い)の確認は一貫せず、現行のネットワークではそのようなトランザクションは手数料の面から非現実的です。
ライトニングネットワークはそれらの問題を解決します。ライトニングネットワークはビットコインに備わったスクリプティングを用いた、マルチパーティ(複数当事者)スマートコントラクト(プログラム可能なお金)の初めての実装の一つです。ライトニングネットワークはビットコインでのマルチパーティ金融処理(financial computations)における有力な開発技術です。
即時決済. ビットコインはトランザクションを10分毎にブロックに集約します。ビットコイン上の決済は、6つのブロックの確認があれば一般にセキュアであるとみなされています。これは約一時間です。ライトニングネットワークでは、決済においてブロックの確認は必要でなく、即座で一瞬です。ライトニングは小売のPOSターミナルでも、ユーザーデバイス間のトランザクションでも利用できます。実際即時決済が必要なところならどこでも利用できます。
マイクロ決済. マイクロ決済の可能性によって新しい市場が開かれます。ライトニングは0.00000001(訳注:通常1 satoshiと呼ばれる。ナカモトサトシから命名)BTCから、委譲のリスク無しで送金可能です。現行のビットコインブロックチェーンではその数百倍が要求されており、固定の取引手数料はマイクロ決済を非実用的なものにしています。ライトニングはビットコイン建てで、実際のビットコイントランザクションを用いて、最小の決済を可能にします。
スケーラビリティ. ビットコインネットワークは、自動決済の需要を満たすために、現在とは桁違いの取引量を扱わなければならなくなります。今後のインターネットに接続されたデバイスの増加を受けて、M2M(machine-to-machine)決済のためのプラットフォームと自動化されたマイクロ決済サービスが必要になります。ライトニングネットワークのトランザクションはブロックチェーン上で、信頼や所有権の委譲を伴わずに実施され、ユーザーはデバイス間でほぼ無限のトランザクションを実施できます。
仕組み. 資金は二人の当事者による、マルチシグ「チャネル」のビットコインアドレスに置かれます。このチャネルはビットコインの公開台帳へのエントリー(記入)として表されます。このチャネルからの資金を消費するためには、両当事者が新たな残高金額について合意しなければなりません。現行の残高は、チャネルアドレスから消費された、両当事者が署名した直近のトランザクションとして保管されます。決済を行うには、両当事者がチャネルから消費する新しい終了トランザクションに署名します。全ての古い終了トランザクションはそれによって無効化されます。
ライトニングネットワークはチャネルからのエクジットにおいてカウンターパーティー(訳注:相手方当事者。)からの協力を必要としません。両当事者とも一方的にチャネルを閉じ、関係を終了する選択肢があります。全ての当事者が複数の異なるユーザーとマルチシグネチャーのチャンネルを持つため、このネットワークを介して、誰もが支払いをあらゆる任意の当事者に送信できます。
セキュアな暗号学的ハッシュを知っていることを前提とした条件付き支払を埋め込むことにより、決済は、いかなる当事者の一方的な資金の所有的管理の必要なしに、チャネルのネットワークを介して行うことができます。ライトニングネットワークは、市場を独占しがちな信頼された金融システムではこれまで不可能だった事を実現しますー信頼や所有権の保護が必要なければ、ネットワークへの参加はダイナミックかつ全員に開かれたものになりえます。
2016-03-29
2010-11-01
CoffeeScriptインストール
前回何気なく触っていた node.js 界隈が盛り上がっているぽい。
WebSocket 周りはもうちょっと仕様が落ち着いてから確認するとして、
中でも個人的に食指の動いたのが、CoffeeScript 。
javascript を生成するミニマムDSLを提供してくれます。
詳細は参考サイトにて。
前回の cygwin + node.js の残念さのリベンジ兼ねて
忘れないよう現状のインストールメモ(参考サイトの劣化コピー)。
1. cygwin インストール
4. CoffeeScript インストール
動いた!
5. vim 環境整備
Cygwin Bash Shell (cmd.exe) の規定値設定変更
フォント
MSゴシック
フォントサイズ:12
レイアウト
画面バッファ幅:100
ウィンドウ幅:100
ウィンドウ高さ:100
7. 参考サイト
WebSocket 周りはもうちょっと仕様が落ち着いてから確認するとして、
中でも個人的に食指の動いたのが、CoffeeScript 。
javascript を生成するミニマムDSLを提供してくれます。
詳細は参考サイトにて。
前回の cygwin + node.js の残念さのリベンジ兼ねて
忘れないよう現状のインストールメモ(参考サイトの劣化コピー)。
1. cygwin インストール
- devel -> gcc-g++
- devel -> git
- devel -> make
- devel -> openssl
- devel -> pkg-config
- devel -> zlib-devel
- python -> python
- editor -> vim
- Net -> curl
mkdir ~/srccd ~/srcgit clone git://github.com/ry/node.gitcd node
git fetch --all
git tag
git checkout v0.2.4
./configure --prefix=~/.nodejs
make
make install
export PATH=$PATH:~/.nodejs/bin - v0.3.0 で ./configure しようとするが途中で止まるので断念。 autoconf 入れるだけでは駄目っぽい。
- node -v すると v0.2.2 って返ってくるけども...?
vim /etc/resolv.conf----nameserver 8.8.8.8nameserver 8.8.4.4----cd ~/srcgit clone git://github.com/isaacs/npm.git
cd npm
make
make link4. CoffeeScript インストール
cd ~/src
npm install coffee-script
git clone git://github.com/jashkenas/coffee-script.git
cake test動いた!
5. vim 環境整備
cd ~/src
git clone git://github.com/tpope/vim-pathogen.git
mkdir -p ~/.vim/autoload
cp -r ./vim-pathogen/autoload ~/.vim/autoload
mkdir ~/.vim/bundle
cd ~/.vim/bundle
git clone git://github.com/kchmck/vim-coffee-script.git
git clone git://github.com/thinca/vim-quickrun.git vim-quickrun
git clone git://github.com/tyru/stickykey.vim.git
vim ~/.vim/bundle/vim-coffee-script/ftplugin/coffee.vim の最後に追記。
----
function! JavaScriptUnderScoreBecomesCamelCase()
if matchstr(getline('.'), '.', col('.')-2) =~ '\w'
return "\(stickykey-shift)"
else
return '_'
endif
endfunction!
imap _ JavaScriptUnderScoreBecomesCamelCase()
----
- [vim] :set paste するとインデントが崩れないで貼り付けられる。:set nopaste でモードを元に戻す。
Cygwin Bash Shell (cmd.exe) の規定値設定変更
フォント
MSゴシック
フォントサイズ:12
レイアウト
画面バッファ幅:100
ウィンドウ幅:100
ウィンドウ高さ:100
7. 参考サイト
2010-08-06
プロダクトとしてのWave終了のお知らせ
各所で Google Wave 開発中止の報道が流れています。
Complete Guide のなんちゃって翻訳を行っていた身として、
感謝のエントリー。
Google 自身も、もともと「Surprise us」というくらい
何に使っていいか分からない状態でのサービス提供。
入力した内容を多言語にリアルタイム翻訳したり、
XMLで表現できるものなら、何でも同時編集できるという
クラウドサービスのパワーと技術的な可能性を感じるプロダクトでした。
イチ利用者として、プロダクトのポテンシャルに
発想が追いつかなかったわけですが、
私にとってはオンラインに戻るキッカケとなったサービスで、
普段の生活では、接点の無さそうな方々と知り合いになれ
夢のようなヒトトキでした。そして夢はまだ続いています。
最近興味の引いたコンテンツは、
成果物としての「UX」とはなにかを考えよう (@yhassy)
など、どこに向かうか楽しみな wave も出てきており、
参加型プレスリリースの新しい形かなと期待していました。
# 今や、「それ buzzで(ry 」ですかね。
サービスとしては、プロトコルが主な興味で「バージョン管理されたドキュメント」という側面と
「ロボットやガジェットAPIによる拡張性」という側面に
特に注目していました。
Operational Transformation (日本語訳:@noriyo)は関数型言語の流行もあって、
使いやすい実装が出てくるのを期待します(他力本願モード)。
(というか、欲しいので勉強しなきゃ。)
ともあれ、開発終了はプロダクトとしての Wave なので、
思想は受け継がれ、他のサービスに生き続けることでしょう。
# リファレンス実装は他にも出てますし、やりようによっては、自宅の俺Waveサーバ建てれますし。
私は、この思想への興味は尽きそうにありません。
Complete Guide のなんちゃって翻訳を行っていた身として、
感謝のエントリー。
Google 自身も、もともと「Surprise us」というくらい
何に使っていいか分からない状態でのサービス提供。
入力した内容を多言語にリアルタイム翻訳したり、
XMLで表現できるものなら、何でも同時編集できるという
クラウドサービスのパワーと技術的な可能性を感じるプロダクトでした。
イチ利用者として、プロダクトのポテンシャルに
発想が追いつかなかったわけですが、
私にとってはオンラインに戻るキッカケとなったサービスで、
普段の生活では、接点の無さそうな方々と知り合いになれ
夢のようなヒトトキでした。そして夢はまだ続いています。
最近興味の引いたコンテンツは、
成果物としての「UX」とはなにかを考えよう (@yhassy)
など、どこに向かうか楽しみな wave も出てきており、
参加型プレスリリースの新しい形かなと期待していました。
# 今や、「それ buzzで(ry 」ですかね。
サービスとしては、プロトコルが主な興味で「バージョン管理されたドキュメント」という側面と
「ロボットやガジェットAPIによる拡張性」という側面に
特に注目していました。
Operational Transformation (日本語訳:@noriyo)は関数型言語の流行もあって、
使いやすい実装が出てくるのを期待します(他力本願モード)。
(というか、欲しいので勉強しなきゃ。)
ともあれ、開発終了はプロダクトとしての Wave なので、
思想は受け継がれ、他のサービスに生き続けることでしょう。
# リファレンス実装は他にも出てますし、やりようによっては、自宅の俺Waveサーバ建てれますし。
私は、この思想への興味は尽きそうにありません。
2010-08-02
宿題に回答
先日とある食事会に参加し、私に振られはしたものの
中途半端な回答になった感のある話題を
ピックアップして備忘録的にキーワードを羅列しておきます。
■SGMLベースで電子カルテって言ってる人たちっていましたよね...?情報元って何?
=> オープンな仕様は、今では XML ベースになってて、地域によっては一患者一カルテが実現しています。 (医師で好きなヒトがいる)
...が、私が扱ってる範囲ではまったく兆候が見られません(医療機関内だけでなくベンダーにもギャップがある)。
...で本題。
一言で終わろうと思えば終わる、別れ際の宿題の回答を
あえてエントリー。
別れ際に
@bardiche 「翻訳するのにいいツールない?」
私「私の場合個人レベルなので使ってないけどw」
というやり取りがあり、観測範囲でチラミしている感じでは
規模によってはこんな方法もあるみたいですよと適当に返事をしてしまいました。
詳細は後日ということで、その場は別れましたのでその回答。
1つめ:
分散構成管理システムの Mercurial を翻訳に利用しているグループもあるようです。
2つめ:
あの場では phenix って言いましたが間違ってましたw
正しくは Sphinx です。
3つめ:
DocuWiki というものもあるようですが、
PHP 製は個人的な理由で敬遠中。
(すばらしいフレームワークが多いので、個人的に損してると思う)
■その他キーワード
これくらいにして忘却します。
続きはまたの機会に。
2010/08/03修正
ちょっと配慮に欠けた感がそこはかとなく漂っていたので一部訂正しました。
中途半端な回答になった感のある話題を
ピックアップして備忘録的にキーワードを羅列しておきます。
■SGMLベースで電子カルテって言ってる人たちっていましたよね...?情報元って何?
=> オープンな仕様は、今では XML ベースになってて、地域によっては一患者一カルテが実現しています。 (医師で好きなヒトがいる)
...が、私が扱ってる範囲ではまったく兆候が見られません(医療機関内だけでなくベンダーにもギャップがある)。
- MEDIS/DC
- JIHIS
- HL7/MML
- Dolphin Project
- 医療情報技師(民間資格ビジネス)
...で本題。
一言で終わろうと思えば終わる、別れ際の宿題の回答を
あえてエントリー。
別れ際に
@bardiche 「翻訳するのにいいツールない?」
私「私の場合個人レベルなので使ってないけどw」
というやり取りがあり、観測範囲でチラミしている感じでは
規模によってはこんな方法もあるみたいですよと適当に返事をしてしまいました。
詳細は後日ということで、その場は別れましたのでその回答。
1つめ:
分散構成管理システムの Mercurial を翻訳に利用しているグループもあるようです。
2つめ:
あの場では phenix って言いましたが間違ってましたw
正しくは Sphinx です。
3つめ:
DocuWiki というものもあるようですが、
PHP 製は個人的な理由で敬遠中。
(すばらしいフレームワークが多いので、個人的に損してると思う)
■その他キーワード
- シンプルなことは複雑(単純化するのは難しい)。(大人になるといろいろ判って考えちゃうよね)
- 「分かること」と「ヒトを評価すること」(最近、情報消費の感覚が雑だよね。バイナリシンキング)
- IAは基本的なヒューマンスキル。誰にでも素養はある。
- コンテンツとコンテキスト(外情報(exformation)と情報の流動化、などなど。)
- 五感の中で嗅覚って WEB では置いてけぼりっぽい。
- ルサンチマンとポジティブシンキング(ポリアンナ症候群)。
- 「日本版」とか「俺仕様」とか。
- 世の中知らないで良いこともたくさんある。(派閥ってxxx)
- 建築写真集ジャケットフェチという消費方法に共感。
これくらいにして忘却します。
続きはまたの機会に。
2010/08/03修正
ちょっと配慮に欠けた感がそこはかとなく漂っていたので一部訂正しました。
2010-07-24
RedisCookbook 日本語訳を(やっと) github に公開しました。
放置されていた RedisCookbook ですが、
先日ひょんなこと(node.js)から触った cygwin 使ったら
うまく リモートサーバに push できたのでご報告。
----
■cygwin に git セットアップ
git config --global user.name "jasagiri"
git config --global user.email "jasagirixxx at gmail dot com"
git config --global color.ui "auto"
設定確認
git config --global --list
■SSH設定
鍵作成
ssh-keygen -t dsa
注): ssh-keygen -b 2048 -t rsa -f ~/.ssh/github_rsa だと、「Permission denied (publickey)」と怒られて push できない。
参照):http://help.github.com/troubleshooting-ssh/
パスフレーズ入れる
クリップボードにコピー
cat ~/.ssh/id_dsa.pub | putclip
鍵の保管場所を変更しておく。
github サイトで公開鍵を登録 (最後の改行注意)
■ フォーク
http://github.com/rediscookbook/rediscookbook からさっくりフォーク
■修正
修正元取得
git clone xxx@xxxx:jasagiri/rediscookbook.translation.git
ごにょごにょ変更
変更点をローカルリポジトリに知らせる
git add .
変更点をローカルリポジトリに登録する
git commit -m 'japanese translation: fixed changeset 04abfa6 (2010/07/01)'
変更点をリモートリポジトリに登録する
git push origin master
Enter passphrase for key 'key path and name': <sshのパスフレーズ>
公開されているか確認
http://github.com/jasagiri/rediscookbook.translation
■メモ
先日ひょんなこと(node.js)から触った cygwin 使ったら
うまく リモートサーバに push できたのでご報告。
----
■cygwin に git セットアップ
- openssh
- git
git config --global user.name "jasagiri"
git config --global user.email "jasagirixxx at gmail dot com"
git config --global color.ui "auto"
設定確認
git config --global --list
■SSH設定
鍵作成
ssh-keygen -t dsa
注): ssh-keygen -b 2048 -t rsa -f ~/.ssh/github_rsa だと、「Permission denied (publickey)」と怒られて push できない。
参照):http://help.github.com/troubleshooting-ssh/
パスフレーズ入れる
クリップボードにコピー
cat ~/.ssh/id_dsa.pub | putclip
鍵の保管場所を変更しておく。
github サイトで公開鍵を登録 (最後の改行注意)
■ フォーク
http://github.com/rediscookbook/rediscookbook からさっくりフォーク
■修正
修正元取得
git clone xxx@xxxx:jasagiri/rediscookbook.translation.git
ごにょごにょ変更
変更点をローカルリポジトリに知らせる
git add .
変更点をローカルリポジトリに登録する
git commit -m 'japanese translation: fixed changeset 04abfa6 (2010/07/01)'
変更点をリモートリポジトリに登録する
git push origin master
Enter passphrase for key 'key path and name': <sshのパスフレーズ>
公開されているか確認
http://github.com/jasagiri/rediscookbook.translation
■メモ
- フォーク元に迷惑かからないようにできているのか不安。
- upstream とか基本的なことがわかってないw
- submodule 化したほうが良かったかもと今更ながら
- en-US分を翻訳元として追随使用と思うとどうフォークするのが正解?
2010-07-19
Node.js を試してみる
御贔屓の RedisDB のページで気になってた Node.js を試してみる。
(結論としては、Redis 使うところまで届かず、コンパイルで時間切れという残念な結果。次回期待)
やったこと(残念な流れ):
=> いろいろ not found と出る。
5. libssl-dev 入れると幸せ(via:tricknotes)という情報を入手。
6. cygwin のパッケージ眺めてもそれっぽいのが無いので Devel\openssl-devel を入れてみる。
7. 何個かは not found が消えたがまだコンパイル通らない。(情報と not found の数も合わない)
8. cygwin 用フルパッケージを配っているヒト(via: DTrejo)がいたので拝借。
9. cygwin/bin 配下から現環境とくらべて新しそうなの(や無いの)を持ってくる。(何者なのかは調べてない)
11. not found がまだ出るが気にせず、make と make install。
=> 通った!
12. make test
=> module オブジェクトに GuessArchitecture アトリビュートが無いと怒られる。
同じヒトがいた。python のバージョンかもらしい。 (via: vwxyz)
13. サンプルのチャットアプリ(via: ry)を試す。
=> node server.js
http://127.0.0.1:8001/ にブラウザでアクセス。 => 動いた。
RedisDBまでいかなかった orz。
以下 ./configure と make test のメモ
----
$ ./configure
Checking for program g++ or c++ : /usr/bin/g
Checking for program cpp : /usr/bin/c
Checking for program ar : /usr/bin/a
Checking for program ranlib : /usr/bin/r
Checking for g++ : ok
Checking for program gcc or cc : /usr/bin/g
Checking for gcc : ok
Checking for library dl : yes
Checking for library execinfo : not found
Checking for openssl : not found
Checking for function SSL_library_init : yes
Checking for header openssl/crypto.h : yes
Checking for library rt : yes
--- libeio ---
Checking for library pthread : yes
Checking for function pthread_create : yes
Checking for function pthread_atfork : yes
Checking for futimes(2) : yes
Checking for readahead(2) : no
Checking for fdatasync(2) : yes
Checking for pread(2) and pwrite(2) : yes
Checking for sendfile(2) : no
Checking for sync_file_range(2) : no
--- libev ---
Checking for header sys/inotify.h : not found
Checking for header sys/epoll.h : not found
Checking for header port.h : not found
Checking for header poll.h : yes
Checking for function poll : yes
Checking for header sys/event.h : not found
Checking for header sys/queue.h : yes
Checking for function kqueue : not found
Checking for header sys/select.h : yes
Checking for function select : yes
Checking for header sys/eventfd.h : not found
Checking for SYS_clock_gettime : no
Checking for library rt : yes
Checking for function clock_gettime : yes
Checking for function nanosleep : yes
Checking for function ceil : yes
Checking for fdatasync(2) with c++ : yes
'configure' finished successfully (53.469s)
----
$ make test
Waf: Entering directory `/cygdrive/d/user/bin/node/build'
DEST_OS: cygwin
DEST_CPU: x86
Parallel Jobs: 2
Waf: Leaving directory `/cygdrive/d/user/bin/node/build'
'build' finished successfully (0.516s)
python tools/test.py --mode=release simple message
Traceback (most recent call last):
File "tools/test.py", line 1066, in
ARCH_GUESS = utils.GuessArchitecture()
AttributeError: 'module' object has no attribute 'GuessArchitecture'
make: *** [test] Error 1
----
(結論としては、Redis 使うところまで届かず、コンパイルで時間切れという残念な結果。次回期待)
やったこと(残念な流れ):
- cygwin ダウンロードする。
- cygwin インストールする。
- python gcc/c gcc/c++ make を追加で選択
- 本家参考にソースをダウンロード/展開する。
- cygwin/bash で ./configure
=> いろいろ not found と出る。
5. libssl-dev 入れると幸せ(via:tricknotes)という情報を入手。
6. cygwin のパッケージ眺めてもそれっぽいのが無いので Devel\openssl-devel を入れてみる。
7. 何個かは not found が消えたがまだコンパイル通らない。(情報と not found の数も合わない)
8. cygwin 用フルパッケージを配っているヒト(via: DTrejo)がいたので拝借。
9. cygwin/bin 配下から現環境とくらべて新しそうなの(や無いの)を持ってくる。(何者なのかは調べてない)
- cygintl-1
- cygintl-2
- cygpcre
- cygrensvr
- cygssp
- cygwap
- ln.exe
- nano.exe
11. not found がまだ出るが気にせず、make と make install。
=> 通った!
12. make test
=> module オブジェクトに GuessArchitecture アトリビュートが無いと怒られる。
同じヒトがいた。python のバージョンかもらしい。 (via: vwxyz)
13. サンプルのチャットアプリ(via: ry)を試す。
=> node server.js
http://127.0.0.1:8001/ にブラウザでアクセス。 => 動いた。
RedisDBまでいかなかった orz。
以下 ./configure と make test のメモ
----
$ ./configure
Checking for program g++ or c++ : /usr/bin/g
Checking for program cpp : /usr/bin/c
Checking for program ar : /usr/bin/a
Checking for program ranlib : /usr/bin/r
Checking for g++ : ok
Checking for program gcc or cc : /usr/bin/g
Checking for gcc : ok
Checking for library dl : yes
Checking for library execinfo : not found
Checking for openssl : not found
Checking for function SSL_library_init : yes
Checking for header openssl/crypto.h : yes
Checking for library rt : yes
--- libeio ---
Checking for library pthread : yes
Checking for function pthread_create : yes
Checking for function pthread_atfork : yes
Checking for futimes(2) : yes
Checking for readahead(2) : no
Checking for fdatasync(2) : yes
Checking for pread(2) and pwrite(2) : yes
Checking for sendfile(2) : no
Checking for sync_file_range(2) : no
--- libev ---
Checking for header sys/inotify.h : not found
Checking for header sys/epoll.h : not found
Checking for header port.h : not found
Checking for header poll.h : yes
Checking for function poll : yes
Checking for header sys/event.h : not found
Checking for header sys/queue.h : yes
Checking for function kqueue : not found
Checking for header sys/select.h : yes
Checking for function select : yes
Checking for header sys/eventfd.h : not found
Checking for SYS_clock_gettime : no
Checking for library rt : yes
Checking for function clock_gettime : yes
Checking for function nanosleep : yes
Checking for function ceil : yes
Checking for fdatasync(2) with c++ : yes
'configure' finished successfully (53.469s)
----
$ make test
Waf: Entering directory `/cygdrive/d/user/bin/node/build'
DEST_OS: cygwin
DEST_CPU: x86
Parallel Jobs: 2
Waf: Leaving directory `/cygdrive/d/user/bin/node/build'
'build' finished successfully (0.516s)
python tools/test.py --mode=release simple message
Traceback (most recent call last):
File "tools/test.py", line 1066, in
ARCH_GUESS = utils.GuessArchitecture()
AttributeError: 'module' object has no attribute 'GuessArchitecture'
make: *** [test] Error 1
----
2010-04-20
[翻訳]rediscookbook/4_higher_level_data_structures/implement_a_social_graph
### 問題
ある種のアプリケーションでユーザのソーシャルグラフを実装するのに単一または複数の方向の関係が利用可能な状態(フォローやフレンドシップ)で Redis を使いたいとしましょう。
### 解法
Redis 組み込みの set 関数を使って、各ユーザのユニークID をキーとした「follow」、「follower」と「blocked」リストを構成してください。redis の生データではこのように見えます:
redis> SADD user:1:follows 2
(integer) 1
redis> SADD user:2:followers 1
(integer) 1
redis> SADD user:3:follows 1
(integer) 1
redis> SADD user:1:followers 3
(integer) 1
redis> SADD user:1:follows 3
(integer) 1
redis> SADD user:3:followers 1
(integer) 1
redis> SINTER user:1:follows user:1:followers
1. 3
### 検討
Redis はキーに割り当てられたユニークな値の集まりの「sets」を構成することができます。
特定のユーザのために「follows」「followers」リストの両方を作成し、簡単なセットの交点を使用することで彼らの「friendships」について求められるでしょう。
Ruby でそのシステムを実装する場合には、このように見えます。:
{% code_snippet social_graph.rb %}
ある種のアプリケーションでユーザのソーシャルグラフを実装するのに単一または複数の方向の関係が利用可能な状態(フォローやフレンドシップ)で Redis を使いたいとしましょう。
### 解法
Redis 組み込みの set 関数を使って、各ユーザのユニークID をキーとした「follow」、「follower」と「blocked」リストを構成してください。redis の生データではこのように見えます:
redis> SADD user:1:follows 2
(integer) 1
redis> SADD user:2:followers 1
(integer) 1
redis> SADD user:3:follows 1
(integer) 1
redis> SADD user:1:followers 3
(integer) 1
redis> SADD user:1:follows 3
(integer) 1
redis> SADD user:3:followers 1
(integer) 1
redis> SINTER user:1:follows user:1:followers
1. 3
### 検討
Redis はキーに割り当てられたユニークな値の集まりの「sets」を構成することができます。
特定のユーザのために「follows」「followers」リストの両方を作成し、簡単なセットの交点を使用することで彼らの「friendships」について求められるでしょう。
Ruby でそのシステムを実装する場合には、このように見えます。:
{% code_snippet social_graph.rb %}
2010-04-14
rediscookbook翻訳中です。
最近めっきりご無沙汰の Redis 絡みで、
先日公開されていた RedisCookbook を
リハビリがてら、いつものなんちゃって日本語訳中です。
(一部動作未確認)
本当は githubのリポジトリ に公開したいのですが、
push 時のエラーが解決できなく、時間切れ中。
(リポジトリ作った後の手順で README は push できたのですが。)
懐に温めててもしかたがないので、ブログに公開することにしました。
(チェンジセット:5c5816b312bf33adc429ac45633b4c61c4fa9cef までのrecipe.md)
(11日の最後のチェンジセット以降は未確認)
(チェンジセット:57216e1 に合わせて修正)
■構成
先日公開されていた RedisCookbook を
リハビリがてら、いつものなんちゃって日本語訳中です。
(一部動作未確認)
本当は githubのリポジトリ に公開したいのですが、
push 時のエラーが解決できなく、時間切れ中。
(リポジトリ作った後の手順で README は push できたのですが。)
懐に温めててもしかたがないので、ブログに公開することにしました。
(チェンジセット:57216e1 に合わせて修正)
■構成
- __sample_recipe__
- 1_install_configure
- 2_basic_commands
- 3_object_level_interaction
- 4_higher_level_data_structures
- 5_durability_and_consistency
[翻訳]rediscookbook/README.md
# Redis クックブック
### みんなの知識で Redis コミュニティを育てましょう!
この Redis Cookbook にみんなのパターンやメソッドのアイデアを持ち寄りましょう。
- - -
### レシピに貢献する方法
1. このリポジトリを Fork して新しいトピックのブランチ(フォルダ)を作成してください。
2. メタデータ(著者やタグ)を含んだ YAML ファイルを作成したフォルダに追加してください。
3. pull request を送ってください。-- 新規や追加したレシピの簡単な紹介を含めてください。
4. ドキドキしましょう。
### もっと貢献する方法
下記のことが可能です:
* 既存のレシピにプログラム言語に寄らずサンプルコードを追加すること。リポジトリを Fork して関連ディレクトリにコードを追加してください!
* rediscookbook.org ウェブサイトを訪れてください。このサイトはオープンソースで `site` フォルダに丸ごと入っています。
* 誤字、書式誤り、リンク切れ、その他小さなことを見つけてください。 どんな潜在的な改良でも「小さすぎる」ということはありません。-- とにかくフォークしてください。
### 主催者
* [Tim Lossen](http://github.com/tlossen)
* [Ted Nyman](http://github.com/tnm)
### ライセンス
Creative Commons Attribution Share Alike 3.0
### みんなの知識で Redis コミュニティを育てましょう!
この Redis Cookbook にみんなのパターンやメソッドのアイデアを持ち寄りましょう。
- - -
### レシピに貢献する方法
1. このリポジトリを Fork して新しいトピックのブランチ(フォルダ)を作成してください。
2. メタデータ(著者やタグ)を含んだ YAML ファイルを作成したフォルダに追加してください。
3. pull request を送ってください。-- 新規や追加したレシピの簡単な紹介を含めてください。
4. ドキドキしましょう。
### もっと貢献する方法
下記のことが可能です:
* 既存のレシピにプログラム言語に寄らずサンプルコードを追加すること。リポジトリを Fork して関連ディレクトリにコードを追加してください!
* rediscookbook.org ウェブサイトを訪れてください。このサイトはオープンソースで `site` フォルダに丸ごと入っています。
* 誤字、書式誤り、リンク切れ、その他小さなことを見つけてください。 どんな潜在的な改良でも「小さすぎる」ということはありません。-- とにかくフォークしてください。
### 主催者
* [Tim Lossen](http://github.com/tlossen)
* [Ted Nyman](http://github.com/tnm)
### ライセンス
Creative Commons Attribution Share Alike 3.0
[翻訳]rediscookbook/IDEAS
ウェブチャットの作成方法 (Pieter Noordhuis) ?
http://gist.github.com/348262
現在オンラインのユーザをトラックする方法 (Luke Melia) ?
http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/
分散ロックの実装方法 (amix)
http://amix.dk/blog/post/19386
twitter クローンを書く方法 (Daniel Lucraft) ?
http://github.com/danlucraft/retwis-rb
Node.js によるユーザの位置情報をトラックする方法 (Rick Olson)
http://techno-weenie.net/2010/2/3/where-s-waldo-track-user-locations-with-node-js-and-redis
stats を組み込みで使う方法 (Ben O'Steen)
http://oxfordrepo.blogspot.com/2010/01/usage-stats-and-redis.html
クラウドを利用した文書解析方法 (Simon Willison)
http://simonwillison.net/2009/Dec/20/crowdsourcing/
短縮 URL サービスの構築方法 (Sunil Arora) ?
http://sunilarora.org/url-shortener-service-using-redis
メモ化の方法 (Levi Cook)
http://github.com/levicook/memodis
redis の内容を点検する方法 (Chris Kite)
http://github.com/chriskite/rediscover
大量のアトミックな操作を発生させる方法 (Nate Wiger)
http://github.com/nateware/redis-objects
boogle クローンを書く方法 (Nick Quaranto)
http://github.com/qrush/beesknees
http://gist.github.com/348262
現在オンラインのユーザをトラックする方法 (Luke Melia) ?
http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/
分散ロックの実装方法 (amix)
http://amix.dk/blog/post/19386
twitter クローンを書く方法 (Daniel Lucraft) ?
http://github.com/danlucraft/retwis-rb
Node.js によるユーザの位置情報をトラックする方法 (Rick Olson)
http://techno-weenie.net/2010/2/3/where-s-waldo-track-user-locations-with-node-js-and-redis
stats を組み込みで使う方法 (Ben O'Steen)
http://oxfordrepo.blogspot.com/2010/01/usage-stats-and-redis.html
クラウドを利用した文書解析方法 (Simon Willison)
http://simonwillison.net/2009/Dec/20/crowdsourcing/
短縮 URL サービスの構築方法 (Sunil Arora) ?
http://sunilarora.org/url-shortener-service-using-redis
メモ化の方法 (Levi Cook)
http://github.com/levicook/memodis
redis の内容を点検する方法 (Chris Kite)
http://github.com/chriskite/rediscover
大量のアトミックな操作を発生させる方法 (Nate Wiger)
http://github.com/nateware/redis-objects
boogle クローンを書く方法 (Nick Quaranto)
http://github.com/qrush/beesknees
[翻訳]rediscookbook/5_durability_and_consistency/make_data_more_durable
### 問題
Redis にあるデータの耐久性を上げたい。
### 解法
Redis 組み込みのbuilt-in *追記型ファイル* (AOF) を使用してください。
`redis.conf` という Redis 構成ファイルを編集して、次の行を含めてください:
appendonly yes
Redis はすべてのコマンドを AOF に対応させる予定です。
もしサーバがクラッシュしてもこのファイルから状態の再構築ができるでしょう。
MySQL の binlog など、他のデータベースで一般的なログファイルととてもよく似た振舞いをします。
### 検討
AOF 自身は構成可能です。 耐久性と速度のトレードオフを特徴とする3つの異なるオプションがあります。
`redis.conf` にこれら構成を設定できます。
3つのコマンドとは、すべてのコマンドで強制的に同期する、1秒毎に同期する、同期しない(つまりオペレーティングシステムのプロセスに任せる)です。Redis のデフォルトはすべてのコマンドで同期するですが、とても遅くなるでしょう。通常、2番目のオプションは安全性(訳注:耐久性?)と速度とのトレードオフです。
### 参照
Redis にあるデータの耐久性を上げたい。
### 解法
Redis 組み込みのbuilt-in *追記型ファイル* (AOF) を使用してください。
`redis.conf` という Redis 構成ファイルを編集して、次の行を含めてください:
appendonly yes
Redis はすべてのコマンドを AOF に対応させる予定です。
もしサーバがクラッシュしてもこのファイルから状態の再構築ができるでしょう。
MySQL の binlog など、他のデータベースで一般的なログファイルととてもよく似た振舞いをします。
### 検討
AOF 自身は構成可能です。 耐久性と速度のトレードオフを特徴とする3つの異なるオプションがあります。
`redis.conf` にこれら構成を設定できます。
3つのコマンドとは、すべてのコマンドで強制的に同期する、1秒毎に同期する、同期しない(つまりオペレーティングシステムのプロセスに任せる)です。Redis のデフォルトはすべてのコマンドで同期するですが、とても遅くなるでしょう。通常、2番目のオプションは安全性(訳注:耐久性?)と速度とのトレードオフです。
### 参照
[翻訳]rediscookbook/4_higher_level_data_structures/implement_a_fifo_queue
### 問題
基本的な push と pop 操作でシンプルな抽象化された先入れ、先出しのキューを実装して Redis を使いたい。
### 解法
Redis 組み込みの `List` データ型は自然なキューです。事実、単なるキューの実装で、`List` 操作の限定されたセットを便利にする必要があります。
redis> LPUSH queue1 tom
(integer) 1
redis> LPUSH queue1 dick
(integer) 2
redis> LPUSH queue1 harry
(integer) 3
redis> RPOP queue1
tom
redis> RPOP queue1
dick
redis> RPOP queue1
harry
### 検討
Redis は *ブロッキングポップ*操作と同等の4つの基本的なリストプッシュとポップ操作(RPUSH, LPUSH, LPOP, RPOP)が提供されています。これらはすべて O(1) オーダで、コマンドの時間的コストはリストの長さに依存しません。
Redis コマンド上で簡単なキューを実装するには、簡単で、さらっと Redis の力を把握するには良いイントロです。
例えば、ここに、オブジェクトレベルの相互作用(新しいキューの ID を一意にするために INCR を使います)を提供する Python キューがあります。:
r = redis.Redis()
class Queue(object):
"""抽象 FIFO キュー"""
def __init__(self):
local_id = r.incr("queue_space")
id_name = "queue:%s" %(local_id)
self.id_name = id_name
def push(self, element):
"""キューの最後に要素を Push する"""
id_name = self.id_name
push_element = redis.lpush(id_name, element)
def pop(self):
"""キューの最初の要素を Pop する。"""
id_name = self.id_name
popped_element = redis.rpop(id_name)
return popped_element
### 参照
基本的な push と pop 操作でシンプルな抽象化された先入れ、先出しのキューを実装して Redis を使いたい。
### 解法
Redis 組み込みの `List` データ型は自然なキューです。事実、単なるキューの実装で、`List` 操作の限定されたセットを便利にする必要があります。
redis> LPUSH queue1 tom
(integer) 1
redis> LPUSH queue1 dick
(integer) 2
redis> LPUSH queue1 harry
(integer) 3
redis> RPOP queue1
tom
redis> RPOP queue1
dick
redis> RPOP queue1
harry
### 検討
Redis は *ブロッキングポップ*操作と同等の4つの基本的なリストプッシュとポップ操作(RPUSH, LPUSH, LPOP, RPOP)が提供されています。これらはすべて O(1) オーダで、コマンドの時間的コストはリストの長さに依存しません。
Redis コマンド上で簡単なキューを実装するには、簡単で、さらっと Redis の力を把握するには良いイントロです。
例えば、ここに、オブジェクトレベルの相互作用(新しいキューの ID を一意にするために INCR を使います)を提供する Python キューがあります。:
r = redis.Redis()
class Queue(object):
"""抽象 FIFO キュー"""
def __init__(self):
local_id = r.incr("queue_space")
id_name = "queue:%s" %(local_id)
self.id_name = id_name
def push(self, element):
"""キューの最後に要素を Push する"""
id_name = self.id_name
push_element = redis.lpush(id_name, element)
def pop(self):
"""キューの最初の要素を Pop する。"""
id_name = self.id_name
popped_element = redis.rpop(id_name)
return popped_element
### 参照
[翻訳]rediscookbook/3_object_level_interaction/using_a_ruby_library_to_store_objects
### 問題
Ruby オブジェクトを永続化する [remodel](http://github.com/tlossen/remodel) を使いたい。
### 解法
オプションを探し、1つ選んでください! Ruby には オブジェクトを保存するいくつかの永続化ライブラリがあります続化オブジェクトが存在しています。
このレシピでは、例として [Ohm](http://github.com/soveran/ohm) と [remodel](http://github.com/tlossen/remodel) を取り上げます。
しかし、読者はこの目的のために使用できる他の良いライブラリがあることを忘れないでください。
[どうか、他のライブラリやたくさんの使用例を追加してください。]
一般的な抽象化戦略は複雑なスキーマ定義無しでオブジェクトをマッピングすることで、
同等の結果を得るためにとても簡単なドメイン固有言語を使用しています。
次に Ohm の例を考えてください。
ここでは、3つの任意のオブジェクト(Event, Venue, および Person)をモデル化し、Event にバリデーションを提供するつもりです。
{% code_snippet ohm.rb %}
Remodel は永続化エントリの説明的なシンプルな DSL を提供します。:
よく知られている 'has_many' 関連は remodel ではこうです。
{% code_snippet remodel.rb %}
もし上記を `cookbook.rb` として保存して、Redis をローカルで動かせるなら、
Ruby シェルを開いて、実行できます。
>> require 'cookbook.rb'
=> true
>> book = Cookbook.create :title => 'Python Cookbook', :author => 'Alex Martelli'
=> #
>> recipe = book.recipes.create :name => 'Sorting a Dictionary'
=> #
>> recipe.book
=> #
### 検討
永続化オブジェクトのために既存のライブラリを使う重要な理由は、
組み込みのbuilt-in *アサーション* や バリデーションの力です。
例えば Ohm では、数値のみフィールドには確かに数値にマッチするかをアサーションします。
`format` バリデーションのために正規表現を使うことが出来ます。:
assert_format :username, /^\w+$/
Remodel はそれ自身「最小のオブジェクト-redis マッパー」として定義され、簡単なマッピング戦略に使います。:
オブジェクトのすべてのプロパティは JSON ハッシュにシリアライズされ、単一キー配下に保存されます。
関連の扱いは異なっており、専ら — で扱われます。
関連の両端は別々のキーに保存されます。
`has_many` は Redis list を使い、関連オブジェクトのキーを保存し、
`has_one` は Redis string を使い単一の関連キーを保存します。
この手法は、どんなオブジェクトでも(デ)シリアライズすること無く、関連を変更できるという利点があります。
### 参照
----
追記
チェンジセット(57216e1)に合わせて変更
Ruby オブジェクトを永続化する [remodel](http://github.com/tlossen/remodel) を使いたい。
### 解法
オプションを探し、1つ選んでください! Ruby には オブジェクトを保存するいくつかの永続化ライブラリがあります続化オブジェクトが存在しています。
このレシピでは、例として [Ohm](http://github.com/soveran/ohm) と [remodel](http://github.com/tlossen/remodel) を取り上げます。
しかし、読者はこの目的のために使用できる他の良いライブラリがあることを忘れないでください。
[どうか、他のライブラリやたくさんの使用例を追加してください。]
一般的な抽象化戦略は複雑なスキーマ定義無しでオブジェクトをマッピングすることで、
同等の結果を得るためにとても簡単なドメイン固有言語を使用しています。
次に Ohm の例を考えてください。
ここでは、3つの任意のオブジェクト(Event, Venue, および Person)をモデル化し、Event にバリデーションを提供するつもりです。
{% code_snippet ohm.rb %}
Remodel は永続化エントリの説明的なシンプルな DSL を提供します。:
よく知られている 'has_many' 関連は remodel ではこうです。
{% code_snippet remodel.rb %}
もし上記を `cookbook.rb` として保存して、Redis をローカルで動かせるなら、
Ruby シェルを開いて、実行できます。
>> require 'cookbook.rb'
=> true
>> book = Cookbook.create :title => 'Python Cookbook', :author => 'Alex Martelli'
=> #
>> recipe = book.recipes.create :name => 'Sorting a Dictionary'
=> #
>> recipe.book
=> #
### 検討
永続化オブジェクトのために既存のライブラリを使う重要な理由は、
組み込みのbuilt-in *アサーション* や バリデーションの力です。
例えば Ohm では、数値のみフィールドには確かに数値にマッチするかをアサーションします。
`format` バリデーションのために正規表現を使うことが出来ます。:
assert_format :username, /^\w+$/
Remodel はそれ自身「最小のオブジェクト-redis マッパー」として定義され、簡単なマッピング戦略に使います。:
オブジェクトのすべてのプロパティは JSON ハッシュにシリアライズされ、単一キー配下に保存されます。
関連の扱いは異なっており、専ら — で扱われます。
関連の両端は別々のキーに保存されます。
`has_many` は Redis list を使い、関連オブジェクトのキーを保存し、
`has_one` は Redis string を使い単一の関連キーを保存します。
この手法は、どんなオブジェクトでも(デ)シリアライズすること無く、関連を変更できるという利点があります。
### 参照
[翻訳]rediscookbook/3_object_level_interaction/introduction_to_storing_objects
### 問題
任意の Ruby オブジェクトを Redis に保存したい。
### 解法
どんなキー/値データベースでも、構造化するのにキーを使えます。:
ここでは Ruby を使った例ですが、原則どんなプログラミング言語でも利用できます。
>> redis.set "event:42:name", "Redis Meetup"
=> "OK"
>> redis.get "event:42:name"
=> "Redis Meetup"
同じ例ですが、今回はまず固有の ID を生成しています。:
>> id = redis.incr "event"
=> 1
>> redis.set "event:#{id}:name", "Redis Meetup"
=> "OK"
>> redis.get "event:#{id}:name"
=> "Redis Meetup"
別解は、保存するときにデータをシリアライズして、検索するときにデコードすることです。:
>> id = redis.incr "event"
=> 2
>> redis.set "event:#{id}", {:name => "Redis Meetup"}.to_json
=> "OK"
>> JSON.parse redis.get("event:#{id}")
=> {"name" => "Redis Meetup"}
最新バージョンの Redis で利用可能なもう1つの解は、新しいデータ Hash 型を使うことです。:
>> id = redis.incr "event"
=> 3
>> redis.hset "event:#{id}", "name", "Redis Meetup"
=> "OK"
>> redis.hget "event:#{id}", "name"
=> "Redis Meetup"
お分かりのように、Redis は非常に柔軟で、情報を保存する最も良い戦略を決められます。
オブジェクト属性に基づくキー生成を自動化するいくつかのライブラリがあります。これらをチェックして使い方を学んでください。
* [DataMapper Adapter](http://github.com/whoahbot/dm-redis-adapter)
* [Ohm](http://ohm.keyvalue.org)
* [Redis Model](http://github.com/voloko/redis-model)
* [Redis Objects](http://github.com/nateware/redis-objects)
* [Remodel](http://github.com/tlossen/remodel)
### 参照
いろいろなライブラリを使った戦略のRuby のオプションを確認するには
**オブジェクトを保存するために Ruby ライブラリを使う** をチェックアウトしてください。
任意の Ruby オブジェクトを Redis に保存したい。
### 解法
どんなキー/値データベースでも、構造化するのにキーを使えます。:
ここでは Ruby を使った例ですが、原則どんなプログラミング言語でも利用できます。
>> redis.set "event:42:name", "Redis Meetup"
=> "OK"
>> redis.get "event:42:name"
=> "Redis Meetup"
同じ例ですが、今回はまず固有の ID を生成しています。:
>> id = redis.incr "event"
=> 1
>> redis.set "event:#{id}:name", "Redis Meetup"
=> "OK"
>> redis.get "event:#{id}:name"
=> "Redis Meetup"
別解は、保存するときにデータをシリアライズして、検索するときにデコードすることです。:
>> id = redis.incr "event"
=> 2
>> redis.set "event:#{id}", {:name => "Redis Meetup"}.to_json
=> "OK"
>> JSON.parse redis.get("event:#{id}")
=> {"name" => "Redis Meetup"}
最新バージョンの Redis で利用可能なもう1つの解は、新しいデータ Hash 型を使うことです。:
>> id = redis.incr "event"
=> 3
>> redis.hset "event:#{id}", "name", "Redis Meetup"
=> "OK"
>> redis.hget "event:#{id}", "name"
=> "Redis Meetup"
お分かりのように、Redis は非常に柔軟で、情報を保存する最も良い戦略を決められます。
オブジェクト属性に基づくキー生成を自動化するいくつかのライブラリがあります。これらをチェックして使い方を学んでください。
* [DataMapper Adapter](http://github.com/whoahbot/dm-redis-adapter)
* [Ohm](http://ohm.keyvalue.org)
* [Redis Model](http://github.com/voloko/redis-model)
* [Redis Objects](http://github.com/nateware/redis-objects)
* [Remodel](http://github.com/tlossen/remodel)
### 参照
いろいろなライブラリを使った戦略のRuby のオプションを確認するには
**オブジェクトを保存するために Ruby ライブラリを使う** をチェックアウトしてください。
[翻訳]rediscookbook/2_basic_commands/pipeline_multiple_commands
### 問題
単一のアトミックコマンドを使って、いくつかの Redis コマンドを実行したい。
### 解法
コマンドのキューを作成し、それらをアトミックに実行するには MULTI/EXEC コマンドを使います。
キューの開始には `MULTI` コマンドを使います。Redis は `OK` を返します。
それから各コマンドのキューを作ってください。最終的には、`EXEC` を使用してコマンドを実行します。
Redis は各コマンド毎にか返値と一緒に multi-bulk を返します。
この基本的な例で、3つの値をリストに追加し、'country-count' と呼ばれるキーを(3に)増加させ、
それからリストのすべての値の範囲を求めます。
必要なら、MULTI キュー と既存のキューをクリアするために DISCARD コマンドを使うことができます。
redis> MULTI
OK
redis> LPUSH country_list france
QUEUED
redis> LPUSH country_list italy
QUEUED
redis> LPUSH country_list germany
QUEUED
redis> INCRBY country_count 3
QUEUED
redis> LRANGE country_list 0 -1
QUEUED
redis> EXEC
1. (integer) 1
2. (integer) 2
3. (integer) 3
4. (integer) 3
5.
1. germany
2. italy
3. france
### 検討
MULTI/EXEC (Redis 2.0 で追加予定)は Redis の非常に重要なコンポーネントで、多く語るに値します。
これが何をするのか、そして何をしないのか知ることはとても重要です。
M/E は次に述べるような意味で、「アトミック」です。
キューが実行されている間、他のクライアントが全く Redis サーバにアクセスできません
-- このキューは単一操作として扱われます。これはデータの完全性にとって重要です。
M/E プロセスは、コマンドがキューに追加されるときはいつでも、
構文エラーがあるとすぐに構文エラーを報告しながら実行するよう設計されています。例えば:
redis> MULTI
OK
redis> LPUSH country_list italy
QUEUED
redis> LPUSH country_list italy germany
Wrong number of arguments for 'lpush'
さて、 M/E は完全な「トランザクション」を提供 *しません*
-- 少なくとも常識的な意味では。-- 「ロールバック」の機能を含んでいないからです。
以下のような状況を考えてください。
比較的大きな M/E キュー(例えば、200個のコマンド)を作成して、EXEC を実行します。
すべての溜め込まれたコマンドが実行される前に、
(おそらくメモリを使い果たして)コマンド #148 でサーバがクラッシュしたとしましょう。
はじめの 148 個のコマンドは本当に実行されますが、残りは実行されません。
実際は、M/E では、EXEC コマンドが実行される *前* (つまり、溜め込み中)は 'すべてか無しか' 操作だけなのです。
-- 実行中はそうではありません。
Redis は問題に対処する興味深い方法を提供します。:馴染み深い追加のみファイルです。
Redis の次バージョンでは、キューのコマンド群は EXEC コマンドが完全に成功したときに AOF に書かれるだけです。
このため、万一サーバが中途半端な EXEC 状態でクラッシュしても、前の pre-EXEC 状態に従って状態を再構築できます。
### 参照
単一のアトミックコマンドを使って、いくつかの Redis コマンドを実行したい。
### 解法
コマンドのキューを作成し、それらをアトミックに実行するには MULTI/EXEC コマンドを使います。
キューの開始には `MULTI` コマンドを使います。Redis は `OK` を返します。
それから各コマンドのキューを作ってください。最終的には、`EXEC` を使用してコマンドを実行します。
Redis は各コマンド毎にか返値と一緒に multi-bulk を返します。
この基本的な例で、3つの値をリストに追加し、'country-count' と呼ばれるキーを(3に)増加させ、
それからリストのすべての値の範囲を求めます。
必要なら、MULTI キュー と既存のキューをクリアするために DISCARD コマンドを使うことができます。
redis> MULTI
OK
redis> LPUSH country_list france
QUEUED
redis> LPUSH country_list italy
QUEUED
redis> LPUSH country_list germany
QUEUED
redis> INCRBY country_count 3
QUEUED
redis> LRANGE country_list 0 -1
QUEUED
redis> EXEC
1. (integer) 1
2. (integer) 2
3. (integer) 3
4. (integer) 3
5.
1. germany
2. italy
3. france
### 検討
MULTI/EXEC (Redis 2.0 で追加予定)は Redis の非常に重要なコンポーネントで、多く語るに値します。
これが何をするのか、そして何をしないのか知ることはとても重要です。
M/E は次に述べるような意味で、「アトミック」です。
キューが実行されている間、他のクライアントが全く Redis サーバにアクセスできません
-- このキューは単一操作として扱われます。これはデータの完全性にとって重要です。
M/E プロセスは、コマンドがキューに追加されるときはいつでも、
構文エラーがあるとすぐに構文エラーを報告しながら実行するよう設計されています。例えば:
redis> MULTI
OK
redis> LPUSH country_list italy
QUEUED
redis> LPUSH country_list italy germany
Wrong number of arguments for 'lpush'
さて、 M/E は完全な「トランザクション」を提供 *しません*
-- 少なくとも常識的な意味では。-- 「ロールバック」の機能を含んでいないからです。
以下のような状況を考えてください。
比較的大きな M/E キュー(例えば、200個のコマンド)を作成して、EXEC を実行します。
すべての溜め込まれたコマンドが実行される前に、
(おそらくメモリを使い果たして)コマンド #148 でサーバがクラッシュしたとしましょう。
はじめの 148 個のコマンドは本当に実行されますが、残りは実行されません。
実際は、M/E では、EXEC コマンドが実行される *前* (つまり、溜め込み中)は 'すべてか無しか' 操作だけなのです。
-- 実行中はそうではありません。
Redis は問題に対処する興味深い方法を提供します。:馴染み深い追加のみファイルです。
Redis の次バージョンでは、キューのコマンド群は EXEC コマンドが完全に成功したときに AOF に書かれるだけです。
このため、万一サーバが中途半端な EXEC 状態でクラッシュしても、前の pre-EXEC 状態に従って状態を再構築できます。
### 参照
[翻訳]rediscookbook/2_basic_commands/get_and_delete
### 問題
Redis からオブジェクトをアトミックに GET し、 DELETE したい。
### 解法
success = RENAME key key:tmp
if success
value = GET key:tmp
DELETE key:tmp
return value
end
using `redis-cli`:
>> SET TOTO 1
OK
>> GET TOTO
1
>> RENAME TOTO TOTO:TMP
OK
>> GET TOTO:TMP
1
>> DEL TOTO:TMP
(integer) 1
>> GET TOTO
(nil)
>> RENAME TOTO TOTO:TMP
(error) ERR no such key
### 検討
これは、簡単な例ですが、有効にRedisのアトミックな特徴を利用しています。RENAME 関数は最初に呼ばれた場合、成功し、その後呼ばれる場合はキーが変更されたので失敗するでしょう。GET と DEL は RENAME 関数のおかげで他のクライアントが操作しているオブジェクトデータを参照するのを防ぎます。(??)
### 参照
----
追記:
チェンジセット(57216e1)に合わせて修正
Redis からオブジェクトをアトミックに GET し、 DELETE したい。
### 解法
success = RENAME key key:tmp
if success
value = GET key:tmp
DELETE key:tmp
return value
end
using `redis-cli`:
>> SET TOTO 1
OK
>> GET TOTO
1
>> RENAME TOTO TOTO:TMP
OK
>> GET TOTO:TMP
1
>> DEL TOTO:TMP
(integer) 1
>> GET TOTO
(nil)
>> RENAME TOTO TOTO:TMP
(error) ERR no such key
### 検討
これは、簡単な例ですが、有効にRedisのアトミックな特徴を利用しています。RENAME 関数は最初に呼ばれた場合、成功し、その後呼ばれる場合はキーが変更されたので失敗するでしょう。GET と DEL は RENAME 関数のおかげで他のクライアントが操作しているオブジェクトデータを参照するのを防ぎます。(??)
### 参照
----
追記:
チェンジセット(57216e1)に合わせて修正
[翻訳]rediscookbook/2_basic_commands/empty_the_database
### 問題
Redis に既に保存されたすべてのキー(と関連する値)を削除したい。
### 解法
Redis の FLUSHALL コマンドを使用してください。
$redis-cli flushall
OK
### 検討
### 参照
Redis に既に保存されたすべてのキー(と関連する値)を削除したい。
### 解法
Redis の FLUSHALL コマンドを使用してください。
$redis-cli flushall
OK
### 検討
### 参照
[翻訳]rediscookbook/2_basic_commands/create_unique_ids
### 問題
あなたは、任意のオブジェクトに重複しない固有の ID を提供したい。
### 解法
Redis 組み込みのアトミックな INCR 関数を利用してください。
$redis-cli INCR
(interger) 1
$redis-cli INCR
(interger) 2
$redis-cli GET
1
$redis-cli GET
2
### 検討
固有の ID を提供する INCR を使うことは Redis の中心概念の1つです。しばしば「主キー」スタイルとしてリレーショナルデータベースで使われてきた同等な機能の代わりに使用されます。
固有のID を使うより多くの例は *Redis における Ruby オブジェクトの保存* を参照してください。
### 参照
あなたは、任意のオブジェクトに重複しない固有の ID を提供したい。
### 解法
Redis 組み込みのアトミックな INCR 関数を利用してください。
$redis-cli INCR
(interger) 1
$redis-cli INCR
(interger) 2
$redis-cli GET
1
$redis-cli GET
2
### 検討
固有の ID を提供する INCR を使うことは Redis の中心概念の1つです。しばしば「主キー」スタイルとしてリレーショナルデータベースで使われてきた同等な機能の代わりに使用されます。
固有のID を使うより多くの例は *Redis における Ruby オブジェクトの保存* を参照してください。
### 参照
[翻訳]rediscookbook/1_install_configure/install_with_make
### 問題
Linux や OS X や Posix 互換のオペレーティングシステムに Redis をインストールしたい。
### 解法
Redis は文字通り「設定いらず」です。最新の Redis [stable release](http://code.google.com/p/redis/) をダウンロードしてください。
tar を解凍し新しいディレクトリにファイルを作り、`cd` でそのディレクトリに入ってください。それから `make` 。 Redis はすぐにインストールされでふぉるのて設定を使って構成されます。`./redis-server` を実行するとサーバが動き出し、目的は達成です。
### 検討
Salvatore Sanfilippo は Redis の作者で、「設定いらず」でインストールすることに強いこだわりがあります。実際、Redis は全く依存関係がありません。「サーバからダウンロードしてmake するまで」どれくらい時間がかかったか計ると、たった 34 秒でした。
### 参照
Linux や OS X や Posix 互換のオペレーティングシステムに Redis をインストールしたい。
### 解法
Redis は文字通り「設定いらず」です。最新の Redis [stable release](http://code.google.com/p/redis/) をダウンロードしてください。
tar を解凍し新しいディレクトリにファイルを作り、`cd` でそのディレクトリに入ってください。それから `make` 。 Redis はすぐにインストールされでふぉるのて設定を使って構成されます。`./redis-server` を実行するとサーバが動き出し、目的は達成です。
### 検討
Salvatore Sanfilippo は Redis の作者で、「設定いらず」でインストールすることに強いこだわりがあります。実際、Redis は全く依存関係がありません。「サーバからダウンロードしてmake するまで」どれくらい時間がかかったか計ると、たった 34 秒でした。
### 参照
[翻訳]rediscookbook/1_install_configure/install_with_installer
### 問題
以下のことをしたい:
* Linux や OS X や Posix 互換のオペレーティングシステムに Redis をインストールする。
* 標準レイアウトを使った設定でバイナリを配置する。
* root にインストールしたい場合は /etc/{init.d,rc.d}/redis にシステムコントロールスクリプトがある。
* 1つ以上のリモートホストにインストールする。
* *1つ* のコマンドを使って、ローカルにインストール可能であること。
### 解法
[redis-installer](http://github.com/wayneeseguin/redis-installer/) を使ってください。
1. localhost にインストールします:
まずは、redis-installer をダウンロードまたはクローンします。:
git clone git://github.com/wayneeseguin/redis-installer/
次に、単に Redis をインストールします。:
bin/install-redis
2. **1つ** のコマンドで localhost にインストールします。
"怠けてるのではなく、賢いんです!"
bash < <(curl http://github.com/wayneeseguin/redis-installer/raw/master/bin/install-redis)
3. 複数のリモートホストにインストールします
まず、下記から redis-installer をダウンロードまたはクローンします。:
git clone git://github.com/wayneeseguin/redis-installer/
次に、1つ以上のリモートホストに Redis をインストールします。
bin/install-redis-on-hosts hostname1 [hostname2 [hostname3 ...]]
### 検討
インストールと設定で気をつけることは、 root としてインストールするかか user としてするかで異なります。 root では、/usr/local/ に、 user では~/.redis/ にインストールされる。
解法2は単に Redis インストーラスクリプトをダウンロードして、`bash` に直接実行コマンドを送んでいるだけです。
### 参照
以下のことをしたい:
* Linux や OS X や Posix 互換のオペレーティングシステムに Redis をインストールする。
* 標準レイアウトを使った設定でバイナリを配置する。
* root にインストールしたい場合は /etc/{init.d,rc.d}/redis にシステムコントロールスクリプトがある。
* 1つ以上のリモートホストにインストールする。
* *1つ* のコマンドを使って、ローカルにインストール可能であること。
### 解法
[redis-installer](http://github.com/wayneeseguin/redis-installer/) を使ってください。
1. localhost にインストールします:
まずは、redis-installer をダウンロードまたはクローンします。:
git clone git://github.com/wayneeseguin/redis-installer/
次に、単に Redis をインストールします。:
bin/install-redis
2. **1つ** のコマンドで localhost にインストールします。
"怠けてるのではなく、賢いんです!"
bash < <(curl http://github.com/wayneeseguin/redis-installer/raw/master/bin/install-redis)
3. 複数のリモートホストにインストールします
まず、下記から redis-installer をダウンロードまたはクローンします。:
git clone git://github.com/wayneeseguin/redis-installer/
次に、1つ以上のリモートホストに Redis をインストールします。
bin/install-redis-on-hosts hostname1 [hostname2 [hostname3 ...]]
### 検討
インストールと設定で気をつけることは、 root としてインストールするかか user としてするかで異なります。 root では、/usr/local/ に、 user では~/.redis/ にインストールされる。
解法2は単に Redis インストーラスクリプトをダウンロードして、`bash` に直接実行コマンドを送んでいるだけです。
### 参照
登録:
投稿 (Atom)