背景
由于在网关中需要对接入的下级平台进行识别校验,只有合法认证的下级平台才会接入到网关中,为了提高数据查询效率,我们不能每次都需要查询数据库,所以我们在早期使用了redis作为下级平台缓存,每次需要查询的时候,都从redis查询有没有该下级平台。如果有则进行接入服务,如果没有在我们系统中注册过,则认为是一个非法接入的下级平台,不允许其接入。
Redis设计规范
实现
通过新建一个maven工程,打包jar包,然后每次系统启动前运行一次,一次把所有接入认证的下级平台加载到redis中,主要代码包括main函数和load方法,如下:
private GlobalMemoryCache cacheHandler = null;
private OracleDataBaseModule dataBaseModule = null;
public void init(){
DOMConfigurator.configureAndWatch("etc/log4j.xml");
dataBaseModule = new OracleDataBaseModule();
JdbcTemplate jdbcTemplate = (JdbcTemplate) GlobalApplicationContext.getBean("jdbcTemplate");
dataBaseModule.setJdbcTemplate(jdbcTemplate);
cacheHandler = (GlobalMemoryCache) GlobalApplicationContext.getBean("cacheHandler");
}
public void doProcess(){
doLoadDeviceMemory();
doLoadSubPlateform();
}
public void doLoadSubPlateform() {
List<SubPlateformEntity> subPlateformList = dataBaseModule.querySubPlateformList();
cacheHandler.addValidSubPlateformList(subPlateformList);
}
public void setCacheHandler(GlobalMemoryCache cacheHandler) {
this.cacheHandler = cacheHandler;
}
public static void main(String[] args) {
Uapmm uapmm = new Uapmm();
uapmm.setCacheHandler((GlobalMemoryCache) GlobalApplicationContext.getBean("cacheHandler"));
uapmm.init();
uapmm.doProcess();
}
redis加载代码
/**
* 首先把所有数据清理掉
*/ public void delValidSubPlateformList(final String accessKey) {
final Jedis jedis = getResource();
if(jedis == null) {
return;
}
jedis.expire("dpf:string:subplatform:profile:" + accessKey,0);
releaseResource(jedis);
}
/**
* 加载下级平台数据到redis中
*/ public void addValidSubPlateformList(final List<SubPlateformEntity> subPlateformList) {
if(subPlateformList == null || subPlateformList.isEmpty()) {
return;
}
final Jedis jedis = getResource();
if(jedis == null) {
return;
}
Transaction t = jedis.multi();
for(SubPlateformEntity subPlateform : subPlateformList) {
System.out.println(subPlateform.toString());
t.set("dpf:string:subplatform:profile:" + subPlateform.getAccesskey(), JSONObject.toJSONString(subPlateform));
}
t.exec();
releaseResource(jedis);
}
网关代码
int TransportUnit::HandleLogin(const byte* buf, int len) {
if (len < 24) {
return BaseUnit::kError;
}
char access_key[8 + 1] = {0};
char access_secret[8 + 1] = {0};
strncpy(access_key, (const char *) buf + 7, 8);
strncpy(access_secret, (const char *) buf + 15, 8);
RedisClient * redis_client = session_->GetUM()->GetRedisInstance();
if(redis_client == NULL) {
gw_log_info("redis server connect error.");
return BaseUnit::kError;
}
Message* m = NULL;
char command[64] = {0};
sprintf(command, "dpf:string:subplatform:profile:%s", access_key);
std::string result = redis_client->GetString((const char *) command);
if(result.empty()) {
gw_log_info("TransportUnit::HandleLogin can not find the subplate info. accesskey=[%s]", access_key);
GenerateLoginAck(&m, buf, 1);
if(m != NULL) {
session_->SendDownMessage(m);
return BaseUnit::kSuccess;
}
}
rapidjson::Document document;
if(document.Parse(result.c_str()).HasParseError()) {
GenerateLoginAck(&m, buf, 0);
} else {
std::string pwd = document["accesssecret"].GetString();
if(strncmp(access_secret, pwd.c_str(), strlen(access_secret)) == 0) {
GenerateLoginAck(&m, buf, 0);
} else {
GenerateLoginAck(&m, buf, 1);
}
}
if(m != NULL) {
session_->SendDownMessage(m);
}
id_ = document["id"].GetInt();
document["state"].SetInt(1);
document["logintm"].SetInt(current_time());
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
std::string result_json = buffer.GetString();
memset(command, 0, 64);
sprintf(command, "dpf:string:platform:profile:%s", access_key);
redis_client->SetString((const char *) command, result_json.c_str());
key_.assign(access_key, 8);
session_->HandleLogin(key_, id_);
is_login_ = true;
return BaseUnit::kSuccess;
}
通过redis实现了获取下级平台信息及更新下级平台登陆信息功能。