您的位置 首页 java

Java加载下级平台数据库数据到redis内存

背景

由于在网关中需要对接入的下级平台进行识别校验,只有合法认证的下级平台才会接入到网关中,为了提高数据查询效率,我们不能每次都需要查询数据库,所以我们在早期使用了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实现了获取下级平台信息及更新下级平台登陆信息功能。

文章来源:智云一二三科技

文章标题:Java加载下级平台数据库数据到redis内存

文章地址:https://www.zhihuclub.com/193490.shtml

关于作者: 智云科技

热门文章

网站地图