異邦人になってみた~~上海生活写真ブログ

中国上海市在住です。もう10年を超えました。休日は星空(天の川)撮影やポートレート撮影等、連休時はカメラを持って中国各地を旅行してます。最近は内モンゴル自治区によく行っています。

 このブログについて(about)
  中国旅行/観光/写真記事一覧(省別)

JAVAでRedisを操ってみました。

大げさなタイトルですが。。。
メモリ上のDBともいえるRedisですが、
なかなか日本語の説明ってありませんね。
ちょっと試行錯誤しながら動作確認してみました。
jedis-2.2.1.jarを使います。
jedisのメソッドは基本的にRedisのコマンドと同じです。
RedisのなかにはString型だけでなくByte[]とかも入れることができるので、
一時対比データ、処理待ちなどに使うには便利です。

以下JAVAソース

//RedisPoolを宣言
JedisPool jedisPool;

//Poolの設定
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxActive(-1);
jedisPoolConfig.setMaxIdle(500);
jedisPoolConfig.setMaxWait(-1);
jedisPoolConfig.setMinEvictableIdleTimeMillis(1800000);
jedisPoolConfig.setMinIdle(0);
jedisPoolConfig.setNumTestsPerEvictionRun(3);
jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1800000);
jedisPoolConfig.setTestOnBorrow(false);
jedisPoolConfig.setTestOnReturn(false);
jedisPoolConfig.setTestWhileIdle(false);
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(-1);
jedisPoolConfig.setWhenExhaustedAction*1;


//値の取得(何度でも取得できる)
jedis.get(key);


//キーの削除(たぶん複数可能)
jedis.del(key);


//リストを一件セット(全部で3件)
jedis.rpush(key, "abcd");//lindex abcdefg 0
jedis.rpush(key, "efgh");//lindex abcdefg 1
jedis.rpush(key, "ijkl");//lindex abcdefg 2
//lpushリストの先頭に追加
//rpushリストの末尾に追加


//リスト長さの取得
jedis.llen(key); //llen abcdefg


//リストから一件ゲット(ゲットすると取得したデータが削除されます)
jedis.lpop(key);// lpop key
//lpopリストの先頭から取得
//rpopリストの末尾から取得


//キーの曖昧検索
Set keys = jedis.keys("abc*"); //keys abc*



//取得したJedisオブジェクトPoolに返却
jedisPool.returnResource(jedis);


注意点はsetしたデータはgetで取得すること
例えばsetしたデータをlpopで取得しようとすると
WRONGTYPE Operation against a key holding the wrong kind of value
のエラーになる。
逆も同じでリスト型で入れたデータはリスト型のメソッドで取得しないとエラーになります。
rpush(lpush)で追加したデータはlpop(rpop)で取得


もう一つ、setを使った後、同じキーでrpushをしても問題ありません。
その場合は最後に入れたrpushの値が保持されるので
当然ですが、getするとやはりエラーになります。





*1:byte) 1); //Poolオブジェクトの作成 jedisPool = new JedisPool(jedisPoolConfig, "192.168.1.1", 6379, 20000); //PoolからJedisオブジェクトを取得 Jedis jedis = jedisPool.getResource(); //値のセット String key ="abcdefg"; String value ="1234567890"; //普通にセット jedis.set(key, value); //時間(seconds)を指定してセット jedis.setex(key, 1, value); //バイト配列でセット jedis.set(SafeEncoder.encode(key), SafeEncoder.encode(key