redisオブジェクトを格納する方法
2276 ワード
一、redisはオブジェクトを直接格納する方法はありませんが、redisはバイトを格納するので、まずオブジェクト自身が書いたシーケンス化と逆シーケンス化の方法を書くことができます.
二、redisが持参したhashmap方法を利用する:
例えばユーザクラスがあり、KeyはユーザIDであり、valueはMapであり、このMapのkeyはメンバーの属性名であり、valueは属性値であり、データの修正やアクセスはその内部MapのKey(Redisでは内部Mapのkeyをfieldと呼ぶ)を直接通過することができ、key(ユーザID)+field(属性ラベル)を通じて対応する属性データを操作することができる.データを繰り返し格納する必要もなく、シーケンス化や制御の同時変更の問題もありません.問題をうまく解決した.ここで同時に、Redisはインタフェース(hgetall)を提供し、すべての属性データを直接取得することができるが、内部Mapのメンバーが多い場合、内部Map全体を遍歴する操作に関し、Redis単一スレッドモデルのため、この遍歴操作は時間がかかる可能性があり、他のクライアントの要求はまったく応答しないことに注意する必要がある.
操作は次のとおりです.
hset hashテーブルのkeyのfieldドメインを値valueに設定します.キー値が存在しない場合は、操作に成功した後に1を返し、キー値がすでに存在する場合は元の値を上書きし、成功した後に0を返します.
hsetnxコマンド:hsetnx filedドメインが存在しない場合、valueに設定します.ドメインが存在しない場合は1を返し、ドメインがすでに存在する場合は操作は実行されず、0を返します.
hmsetコマンド:hmset[...]同時に複数のドメイン値ペアをkeyキーに格納し、keyが存在しない場合は自動的に作成され、fieldが存在する場合は元の値が上書きされます.操作に成功したら値OKを返します.
hmgetコマンド:hmget[....]hashテーブルのkeyの1つ以上のドメイン値を返します.指定されたドメイン名名がこのhashテーブルに存在しない場合はnilを返します.
以上のコマンドはjavaのredisクライアントjdeisに対応するコマンドがあります.
package com.gametech.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.log4j.Logger;
public class SerializeUtil {
static Logger log = Logger.getLogger(SerializeUtil.class);
/**
*
* Title: ObjTOSerialize
* Description:
* @param obj
* @return
* @author guangshuai.wang
*/
public static byte[] ObjTOSerialize(Object obj){
ObjectOutputStream oos = null;
ByteArrayOutputStream byteOut = null;
try{
byteOut = new ByteArrayOutputStream();
oos = new ObjectOutputStream(byteOut);
oos.writeObject(obj);
byte[] bytes = byteOut.toByteArray();
return bytes;
}catch (Exception e) {
log.error(" ");
}
return null;
}
/**
*
* Title: unSerialize
* Description:
* @param bytes
* @return
* @author guangshuai.wang
*/
public static Object unSerialize(byte[] bytes){
ByteArrayInputStream in = null;
try{
in = new ByteArrayInputStream(bytes);
ObjectInputStream objIn = new ObjectInputStream(in);
return objIn.readObject();
}catch (Exception e) {
log.error(" ");
}
return null;
}
}
二、redisが持参したhashmap方法を利用する:
例えばユーザクラスがあり、KeyはユーザIDであり、valueはMapであり、このMapのkeyはメンバーの属性名であり、valueは属性値であり、データの修正やアクセスはその内部MapのKey(Redisでは内部Mapのkeyをfieldと呼ぶ)を直接通過することができ、key(ユーザID)+field(属性ラベル)を通じて対応する属性データを操作することができる.データを繰り返し格納する必要もなく、シーケンス化や制御の同時変更の問題もありません.問題をうまく解決した.ここで同時に、Redisはインタフェース(hgetall)を提供し、すべての属性データを直接取得することができるが、内部Mapのメンバーが多い場合、内部Map全体を遍歴する操作に関し、Redis単一スレッドモデルのため、この遍歴操作は時間がかかる可能性があり、他のクライアントの要求はまったく応答しないことに注意する必要がある.
操作は次のとおりです.
hset hashテーブルのkeyのfieldドメインを値valueに設定します.キー値が存在しない場合は、操作に成功した後に1を返し、キー値がすでに存在する場合は元の値を上書きし、成功した後に0を返します.
hsetnxコマンド:hsetnx filedドメインが存在しない場合、valueに設定します.ドメインが存在しない場合は1を返し、ドメインがすでに存在する場合は操作は実行されず、0を返します.
hmsetコマンド:hmset[...]同時に複数のドメイン値ペアをkeyキーに格納し、keyが存在しない場合は自動的に作成され、fieldが存在する場合は元の値が上書きされます.操作に成功したら値OKを返します.
hmgetコマンド:hmget[....]hashテーブルのkeyの1つ以上のドメイン値を返します.指定されたドメイン名名がこのhashテーブルに存在しない場合はnilを返します.
以上のコマンドはjavaのredisクライアントjdeisに対応するコマンドがあります.