Symfoware

Symfowareについての考察blog

PHPからReidsに接続する(phpredis 2.2.5を使用)

PHPからReidsに接続してみます。

http://redis.io/clients

Predisとphpredisがおすすめだそうで。

PredisはPHPのみで記載されたドライバー。
phpredisはC言語での拡張のようです。

今回は、phpredisを使用して接続してみることにしました。
http://pecl.php.net/package/redis



Webサーバーの構築はこちらの手順。
Debian 7 + nginx + php-fpmな環境を構築する

Redisのインストールはこちらの手順で構築した環境を使用します。
Debian 7にapt-getでRedis 2.4.14をインストールする




接続ドライバーのインストール



必要なモジュールをapt-getで事前にインストールします。


# apt-get install php5-dev php5-cli php-pear g++ make




peclコマンドでドライバーをインストール。


# pecl install redis
(略)
Build process completed successfully
Installing '/usr/lib/php5/20100525/redis.so'
install ok: channel://pecl.php.net/redis-2.2.5
configuration option "php_ini" is not set to php.ini location
You should add "extension=redis.so" to php.ini




redis.soが出力されました。
設定ファイルを新規作成し、起動時にロードするよう指定します。


# vi /etc/php5/fpm/conf.d/redis.ini




記載する内容は以下のとおり。


; configuration for php redis module
extension=redis.so




php-fpmを再起動。


# /etc/init.d/php5-fpm restart




phpinfoを表示して、redisと表示されればロードは成功しています。

433_01.png





簡単なサンプル



こちらのページを参考にしました。
https://github.com/nicolasff/phpredis


  1. <?php
  2. // Redisに接続
  3. $redis = new Redis();
  4. $redis->connect('127.0.0.1', 6379);
  5. // 値を設定
  6. $redis->set('key', 'value');
  7. // 値を取得
  8. echo 'key:' . $redis->get('key') . '<br/>';
  9. // 値を削除
  10. $redis->delete('key');
  11. // 再度値を取得
  12. echo 'key:' . $redis->get('key') . '<br/>';
  13. $redis->close();




しょっぱい画面ですが、ちゃんとデータの登録、検索、削除が確認できました。

433_02.png

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/07/27(日) 23:19:45|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Ubuntu 14.04 + redis-py 2.10 を使用して、Redisに接続する

ずいぶん前に、redis-pyでRedisのデータを操作してみました。

key-value database RedisにPythonで接続する(redis-py使用)

すっかり忘れているので、redis-pyのインストールから復習してみます。


easy_install



redis-pyはeasy_installを使用してインストールしました。
https://github.com/andymccurdy/redis-py

バージョンは、2.10がインストールされました。



set,get,del



簡単にデータの登録、取得、削除を思い出します。
接続先のRedisは

Debian 7にapt-getでRedis 2.4.14をインストールする

ここでDebianにインストールしたRedis 2.4です。



登録、検索のサンプルはこんな感じ。


  1. # -*- coding:utf-8 -*-
  2. import redis
  3. r = redis.Redis(host='192.168.1.110', port=6379, db=0)
  4. r.set('foo', 'bar')
  5. print r.get('foo')
  6. print 'ok'




実行時、以下のようなエラーになる場合は、
Debian 7 + Redis 2.4.14の外部接続許可
この設定が漏れている可能性があります。


$ python sample.py
Traceback (most recent call last):
File "sample.py", line 6, in <module>
    r.set('foo', 'bar')
File "build/bdist.linux-x86_64/egg/redis/client.py", line 999, in set
File "build/bdist.linux-x86_64/egg/redis/client.py", line 534, in execute_command
File "build/bdist.linux-x86_64/egg/redis/connection.py", line 532, in send_command
File "build/bdist.linux-x86_64/egg/redis/connection.py", line 508, in send_packed_command
File "build/bdist.linux-x86_64/egg/redis/connection.py", line 412, in connect
redis.exceptions.ConnectionError: Error 111 connecting to 192.168.1.110:6379. Connection refused.




そっけないですが、ちゃんと登録と検索が行えました。


$ python sample.py
bar
ok






データの削除はdeleteです。


  1. # -*- coding:utf-8 -*-
  2. import redis
  3. r = redis.Redis(host='192.168.1.110', port=6379, db=0)
  4. r.set('foo', 'bar')
  5. print r.get('foo')
  6. r.delete('foo')
  7. print r.get('foo')
  8. print 'ok'



削除後、値の取得が行えなくなっています。


$ python sample.py
bar
None
ok


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/07/27(日) 22:58:01|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Debian 7 + Redis 2.4.14の外部接続許可

DebianにRedis 2.4.14をインストールしました。
Debian 7にapt-getでRedis 2.4.14をインストールする

外部から接続できるように構成します。


redis.conf



設定ファイルは「/etc/redis/redis.conf」にあります。
これを編集。


# vi /etc/redis/redis.conf



bindという項目を「127.0.0.1」から「0.0.0.0」に変更。


# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
#bind 127.0.0.1
bind 0.0.0.0





redisを再起動。


# /etc/init.d/redis-server restart




これで外部から接続できるようになりました。

テーマ:データベース - ジャンル:コンピュータ

  1. 2014/07/27(日) 22:54:00|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Debian 7にapt-getでRedis 2.4.14をインストールする

以前もDebianにRedisをインストールしてみました。
Debianにkey-value databaseのRedisをインストールする
Redis2.0をDebianにインストールする

久しぶりにDebian 7へapt-getでRedisをインストールしてみます。


インストール



apt-getでインストールしました。


# apt-get install redis-server






バージョン確認



redis-cli でコンソールを起動。
infoを実行すると、バージョンが表示されます。


# redis-cli
redis 127.0.0.1:6379> info
redis_version:2.4.14
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
(略)





2.4.14がインストールされました。

思い出す意味を込めて、PythonやPHPから接続してみたいと思います。

テーマ:データベース - ジャンル:コンピュータ

  1. 2014/07/27(日) 22:44:36|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Redisに改行コードを含むバイナリデータを保存するプロトコル

ここでライブラリを使用せず、自前でRedisにデータを登録してみました。
ライブラリに依存しないJavaプログラムでRedisにデータを登録、取得する(SET、GET)

これ、改行を含むデータを登録したい時に上手く行きません。
どうやればいいか調べていると、jedisProtocol.javaに答えがありました。

Protocol.java


プロトコル仕様




SET key-name value\r\n



こうやってデータを登録する以外に、もうひとつコマンドを実行する方法があるようです。


*[コマンドの総数]
$[最初のコマンドのバイト数]
[最初のコマンド]
$[次のコマンドのバイト数]
[次のコマンド]
$[次のコマンドのバイト数]
[次のコマンド]
...




具体的に、最初のSETコマンドを分解すると、
コマンドの総数3
最初のコマンド「SET」のバイト数3
SET
次のコマンド「key-name」のバイト数8
key-name
最後のコマンド「value」のバイト数5
value


実行するのは以下の内容になります。


*3
$3
SET
$8
key-name
$5
value




telnetでredisに接続して実行している様子はこちら。

385_01.png


この方法でもちゃんと値が登録できています。




プログラム



上記を踏まえ、登録プログラムを修正してみます。


  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. public class RedisSetSample {
  6.     
  7.     public static void main(String[] args) {
  8.         String host = "192.168.1.111";
  9.         int port = 6379;
  10.         try {
  11.             // ソケットを生成
  12.             Socket socket = new Socket(host, port);
  13.             // 出力ストリーム
  14.             OutputStream osw = socket.getOutputStream();
  15.             // 入力ストリーム
  16.             InputStream is = socket.getInputStream();
  17.             
  18.             // コマンド総数
  19.             osw.write("*3\r\n".getBytes());
  20.             
  21.             // 最初のコマンド「SET」のバイト数と、実際のコマンド指定
  22.             osw.write("$3\r\n".getBytes());
  23.             osw.write("SET\r\n".getBytes());
  24.             
  25.             // 次のコマンド「key-name」のバイト数と、実際のコマンド指定
  26.             osw.write("$8\r\n".getBytes());
  27.             osw.write("key-name\r\n".getBytes());
  28.             
  29.             // 最後のコマンド「va\nlue」のバイト数と、実際のコマンド指定
  30.             osw.write("$6\r\n".getBytes());
  31.             osw.write("va\nlue\r\n".getBytes());
  32.             
  33.             //サーバーに送信
  34.             osw.flush();
  35.             // 読み込み待ち
  36.             while (is.available() == 0);
  37.             
  38.             // 読み込んだ内容をそのまま出力ストリームに書き出す
  39.             while (is.available() != 0) {
  40.                 byte[] data = new byte[is.available()];
  41.                 is.read(data);
  42.                 System.out.print(new String(data));
  43.             }
  44.             System.out.println();
  45.             // 入出力ストリームを閉じる
  46.             osw.close();
  47.             is.close();
  48.             // ソケットを閉じる
  49.             socket.close();
  50.         } catch (IOException e) {
  51.             e.printStackTrace();
  52.         }
  53.     }
  54. }




プログラムを実行した後、データを検索してみます。

385_02.png


ちゃんと改行込みのデータが登録出来ました。



【参考URL】

https://github.com/xetorthio/jedis/

テーマ:データベース - ジャンル:コンピュータ

  1. 2014/03/23(日) 14:06:07|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ 次のページ