Tries, guardar y cargar datos SQL ¿Pros y contras?
#1
Buenas noches, ya había hecho un thread sobre esto, pero me surgen varias dudas. ¿Es correcto hacer esto?, ¿Qué pros y contras tendría?, ¿Afectaría en algo al servidor o en los datos de los usuarios? Gracias...

Al comenzar el mapa, cargo todas los datos de todos los usuarios y las almaceno en una Trie de esta manera.

Código PHP:
new Trie:g_trie_user_stats;

public 
plugin_init()
{
    
set_task(0.5"update_accounts");
}

public 
plugin_end()
{
    
TrieDestroy(g_trie_user_stats);
}

public 
update_accounts()
{
    new 
Handle:query;
    
query SQL_PrepareQuery(g_sql_connection"SELECT * FROM %s;"SQL_TABLE);
    
    if (!
SQL_Execute(query))
        
sql_query_error(query);
    else if (
SQL_NumResults(query))
    {
        static 
trie_stats[TRIE_STATS_STRUCT];
        
        while (
SQL_MoreResults(query))
        {
            
trie_stats[TRIE_STAT_ID] = SQL_ReadResult(query0);
            
SQL_ReadResult(query1trie_stats[TRIE_STAT_NAME], 31);
            
SQL_ReadResult(query2trie_stats[TRIE_STAT_PASSWORD], 31);
            
SQL_ReadResult(query3trie_stats[TRIE_STAT_IP], 16);
            
SQL_ReadResult(query4trie_stats[TRIE_STAT_DATE_REGISTER], 31);
            
SQL_ReadResult(query5trie_stats[TRIE_STAT_LAST_DATE], 31);
            
trie_stats[TRIE_STAT_LEVEL] = SQL_ReadResult(query13);
            
trie_stats[TRIE_STAT_EXPERIENCE] = SQL_ReadResult(query14);
            
trie_stats[TRIE_STAT_EXPERIENCE_TOTAL] = SQL_ReadResult(query15);
            
trie_stats[TRIE_STAT_AMMOPACKS] = SQL_ReadResult(query16);
            
trie_stats[TRIE_STAT_SYSTIME_SECONDS] = SQL_ReadResult(query17);    
                
            
SQL_ReadResult(query18trie_stats[TRIE_STAT_HABS], charsmax(trie_stats[TRIE_STAT_HABS]));
            
SQL_ReadResult(query19trie_stats[TRIE_STAT_COLORS], charsmax(trie_stats[TRIE_STAT_COLORS]));
            
SQL_ReadResult(query20trie_stats[TRIE_STAT_STATS], charsmax(trie_stats[TRIE_STAT_STATS]));
            
SQL_ReadResult(query21trie_stats[TRIE_STAT_ITEMS], charsmax(trie_stats[TRIE_STAT_ITEMS]));
            
SQL_ReadResult(query22trie_stats[TRIE_STAT_WEAPONS], charsmax(trie_stats[TRIE_STAT_WEAPONS]));
            
SQL_ReadResult(query23trie_stats[TRIE_STAT_LAST_ACHIEVEMENT], charsmax(trie_stats[TRIE_STAT_LAST_ACHIEVEMENT]));
            
            
trie_stats[TRIE_STAT_MULTI] = SQL_ReadResult(query24);
            
TrieSetArray(g_trie_user_statstrie_stats[TRIE_STAT_NAME], trie_statssizeof(trie_stats));
            
SQL_NextRow(query);
        }
        
        
SQL_FreeHandle(query);
    }
    else
        
SQL_FreeHandle(query);


Después, cuando un usuario se conecta al servidor, le cargo los datos que están almacendos en la Trie de esta manera.

Código PHP:
public client_putinserver(id)
{
    
set_task(0.2"zp_check_account"id);
}

public 
zp_check_account(id)
{
    static 
trie_stats[TRIE_STATS_STRUCT];
    
    if (
TrieGetArray(g_trie_user_statsg_user_name[id], trie_statssizeof(trie_stats)))
    {
        if (!
equal(g_user_ip[id], trie_stats[TRIE_STAT_IP]))
        {
            
query_account(id);
            return;
        }
        
        
g_load_trie[id] = 1;
        
g_user_auto_logged[id] = 1;
        
g_user_register[id] = 1;
        
        
copy(g_user_date_register[id], 31trie_stats[TRIE_STAT_DATE_REGISTER]);
        
copy(g_user_last_date[id], 31trie_stats[TRIE_STAT_LAST_DATE]);
        
copy(g_user_password[id], charsmax(g_user_password[]), trie_stats[TRIE_STAT_PASSWORD]);
        
        
g_user_id[id] = trie_stats[TRIE_STAT_ID];
        
        
load_data_user
        
(
            
id
            
trie_stats[TRIE_STAT_LEVEL],
            
trie_stats[TRIE_STAT_EXPERIENCE],
            
trie_stats[TRIE_STAT_EXPERIENCE_TOTAL],
            
trie_stats[TRIE_STAT_AMMOPACKS],
            
trie_stats[TRIE_STAT_SYSTIME_SECONDS],
            
trie_stats[TRIE_STAT_HABS],
            
trie_stats[TRIE_STAT_COLORS],
            
trie_stats[TRIE_STAT_STATS],
            
trie_stats[TRIE_STAT_ITEMS],
            
trie_stats[TRIE_STAT_WEAPONS],
            
trie_stats[TRIE_STAT_LAST_ACHIEVEMENT],
            
trie_stats[TRIE_STAT_MULTI]
        );
        
        
clcmd_changeteam(id);
        return;
    }
    
    
query_account(id);
    
client_print(idprint_center"Los datos de tu cuenta están siendo cargados...");


Y al desconectarse los almaceno nuevamente en la Trie y en la base de datos de esta manera.

Código PHP:
public client_disconnect(id)
    
save_data(id);
    
save_data(id)
{
    *** 
CONSULTA AL SQL ***
    
format(sztextcharsmax(sztext), "UPDATE `%s` SET ..... WHERE ...");
    
SQL_TheadQuery(Handle:Tupla"MyFunction"Handle:MyQuerymyData);
    
    
trie_stats[TRIE_STAT_ID] = g_user_id[id];
    
copy(trie_stats[TRIE_STAT_NAME], charsmax(trie_stats[TRIE_STAT_NAME]), g_user_name[id]);
    
copy(trie_stats[TRIE_STAT_PASSWORD], charsmax(trie_stats[TRIE_STAT_PASSWORD]), g_user_password[id]);
    
copy(trie_stats[TRIE_STAT_DATE_REGISTER], charsmax(trie_stats[TRIE_STAT_DATE_REGISTER]), g_user_date_register[id]);
    
copy(trie_stats[TRIE_STAT_LAST_DATE], charsmax(trie_stats[TRIE_STAT_LAST_DATE]), g_user_last_date[id]);
    
    
trie_stats[TRIE_STAT_LEVEL] = g_user[id][USER_LEVEL];
    
trie_stats[TRIE_STAT_EXPERIENCE] = g_user[id][USER_EXPERIENCE];
    
trie_stats[TRIE_STAT_EXPERIENCE_TOTAL] = g_user[id][USER_EXPERIENCE_TOTAL];
    
trie_stats[TRIE_STAT_AMMOPACKS] = g_user[id][USER_AMMOPACKS];
    
trie_stats[TRIE_STAT_SYSTIME_SECONDS] = g_user[id][USER_SYSTIME_SECONDS];    
        
    
copy(trie_stats[TRIE_STAT_HABS], charsmax(trie_stats[TRIE_STAT_HABS]), habs);
    
copy(trie_stats[TRIE_STAT_COLORS], charsmax(trie_stats[TRIE_STAT_COLORS]), colors);
    
copy(trie_stats[TRIE_STAT_STATS], charsmax(trie_stats[TRIE_STAT_STATS]), stats);
    
copy(trie_stats[TRIE_STAT_ITEMS], charsmax(trie_stats[TRIE_STAT_ITEMS]), items);
    
copy(trie_stats[TRIE_STAT_WEAPONS], charsmax(trie_stats[TRIE_STAT_WEAPONS]), weapons);
    
copy(trie_stats[TRIE_STAT_LAST_ACHIEVEMENT], charsmax(trie_stats[TRIE_STAT_LAST_ACHIEVEMENT]), g_last_achievement[id]);
    
copy(trie_stats[TRIE_STAT_IP], charsmax(trie_stats[TRIE_STAT_IP]), g_user_ip[id]);
    
    
trie_stats[TRIE_STAT_MULTI] = g_multi[id];
    
    
TrieSetArray(g_trie_user_statstrie_stats[TRIE_STAT_NAME], trie_statssizeof(trie_stats));

Responder
#2
aunque es mas efectivo a la hora de tener los datos tiene 2 problemas: si tienes muchos usuarios tardara en iniciar el mapa y alto uso de ram: no es recomendable
Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
[Imagen: b_350_20_5A6C3E_383F2D_D2E1B5_2E3226.png]

(14/08/2015, 10:15 PM)Sugisaki escribió: "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

Responder
#3
Gracias por responder, en este caso sería más eficaz almacenar los datos de los usuarios que solo se conectaron en el.mapa?
Responder
#4
También puedes crear una columna de la última conexión de cada jugador y luego al momento de cargar los datos, solo necesitarías cargar los datos de los últimos players que se han conectado almenos x días, y luego tener otra carga aparte por si un player que tiene x días sin entrar cargarle los datos al ingresar al server comúnmente con tu select * from dd where = user user.., pero estos son métodos realmente descabellados. Roflmao
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder
#5
(09/04/2019, 12:06 PM)OsweRRR escribió: También puedes crear una columna de la última conexión de cada jugador y luego al momento de cargar los datos, solo necesitarías cargar los datos de los últimos players que se han conectado almenos x días, y luego tener otra carga aparte por si un player que tiene x días sin entrar cargarle los datos al ingresar al server comúnmente con tu select * from dd where = user user.., pero estos son métodos realmente descabellados. Roflmao

Mmm.. No lo había pensado, para eso tendría que hacer otro contador de días y ver qué onda, aun que creo yo que ese método sería lo mismo que obtener todos los datos de todos los usuarios (Si es que llegaran a jugar todos los usuarios). Por otro lado, creo que lo mejor sería almacenar en la Trie los datos de los usuarios que se conectaron en el mapa y así, si se conectan nuevamente en el mismo mapa, cargarle todos sus datos que fueron almacenados en la Trie para evitar consultas y obtener una mayor eficacia a la hora de obtener sus datos. Gracias por responder.
Responder
#6
Cual es tu miedo para que decidas usar esa forma con Tries ?

PD: No le encuentro el sentido xd
Responder
#7
(09/04/2019, 07:12 PM)Ipolito escribió: Cual es tu miedo para que decidas usar esa forma con Tries ?

PD: No le encuentro el sentido xd

Principalmente para no usar consultas constantemente. Segundo, para una mayor eficacia al cargar los datos, ya que son almacenan directamente en la memoria y tenés más fácil el acceso hacia esos datos.
Responder
#8
(09/04/2019, 10:52 PM)Cristian escribió:
(09/04/2019, 07:12 PM)Ipolito escribió: Cual es tu miedo para que decidas usar esa forma con Tries ?

PD: No le encuentro el sentido xd

Principalmente para no usar consultas constantemente. Segundo, para una mayor eficacia al cargar los datos, ya que son almacenan directamente en la memoria y tenés más fácil el acceso hacia esos datos.

Supongamos que tenes un servidor 32 slots y 32 jugadores conectados.

Al finalizar el mapa o al terminar la ronda, estarias guardando los datos de 32 jugadores.

Al cambiar de mapa, cargando los datos de esos 32 jugadores.

Ahora bien, con tu code esto no seria asi, ponele que tenes el registro de 150 jugadores, al cambiar de mapa cargarias todos estos 150 registros ? Seria mucho de un saque, no estas solucionando nada. Ademas no tiene nada de malo realizar consultas constantemente.

De todas formas lo que podrias hacer, es que cuando el jugador se conecte al servidor, cargarle los datos y que queden almacendos durante todo el mapa, obviamente estos datos se modificarian si el jugador sube de nivel, baja, etc, luego si se desconecta y vuelve a conectar en el mismo mapa, le pones esos datos que no los guardaste, solamente lo almacenaste, ahi te estarias ahorrando el cargar 150 registros de un saque por ejemplo, y tambien te estarias ahorrando 1 consulta por cada jugador que haya entrado al servidor, salido y haya vuelto a entrar
Responder
#9
(10/04/2019, 01:58 AM)Ipolito escribió:
(09/04/2019, 10:52 PM)Cristian escribió:
(09/04/2019, 07:12 PM)Ipolito escribió: Cual es tu miedo para que decidas usar esa forma con Tries ?

PD: No le encuentro el sentido xd

Principalmente para no usar consultas constantemente. Segundo, para una mayor eficacia al cargar los datos, ya que son almacenan directamente en la memoria y tenés más fácil el acceso hacia esos datos.

Supongamos que tenes un servidor 32 slots y 32 jugadores conectados.

Al finalizar el mapa o al terminar la ronda, estarias guardando los datos de 32 jugadores.

Al cambiar de mapa, cargando los datos de esos 32 jugadores.

Ahora bien, con tu code esto no seria asi, ponele que tenes el registro de 150 jugadores, al cambiar de mapa cargarias todos estos 150 registros ? Seria mucho de un saque, no estas solucionando nada. Ademas no tiene nada de malo realizar consultas constantemente.

De todas formas lo que podrias hacer, es que cuando el jugador se conecte al servidor, cargarle los datos y que queden almacendos durante todo el mapa, obviamente estos datos se modificarian si el jugador sube de nivel, baja, etc, luego si se desconecta y vuelve a conectar en el mismo mapa, le pones esos datos que no los guardaste, solamente lo almacenaste, ahi te estarias ahorrando el cargar 150 registros de un saque por ejemplo, y tambien te estarias ahorrando 1 consulta por cada jugador que haya entrado al servidor, salido y haya vuelto a entrar

Justamente, esa era mi duda, por eso el thread, y es más eficaz eso, guardar en la Trie por mapa los que se conectaron.
Responder
#10
Yo los guardo básicamente en client_putinserver (SELECT) y client_disconnect.. (UPDATE).

Código PHP:
public client_disconnect(id)
        
actualizar_datos(id);


public 
actualizar_datos(id){
    new 
Query[256];
    static 
data[1]; data[0] = id;
    new 
nombre[32]; get_user_name(idnombrecharsmax(nombre));
    
formatex(Querycharsmax(Query), "UPDATE %s SET nombre=^"%s^", frags='%d', muertes='%d', headshots='%d', faka='%d', timestamp='%d' WHERE steamid=^"%s^"",
    
TABLEnombreg_frags[id], g_muertes[id], g_headshot[id], g_faka[id], get_systime(), g_steamid[id]);
    
mysql_query(g_connection"DataHandler2"Querydatasizeof(data));
}

client_putinserver(id)
formatex(Querycharsmax(Query), "SELECT * FROM %s WHERE steamid = ^"%s^""TABLEg_steamid[id]); 
Responder
#11
(13/04/2019, 11:47 AM)Kreeze escribió: Yo los guardo básicamente en client_putinserver (SELECT) y client_disconnect.. (UPDATE).

Código PHP:
public client_disconnect(id)
        
actualizar_datos(id);


public 
actualizar_datos(id){
    new 
Query[256];
    static 
data[1]; data[0] = id;
    new 
nombre[32]; get_user_name(idnombrecharsmax(nombre));
    
formatex(Querycharsmax(Query), "UPDATE %s SET nombre=^"%s^", frags='%d', muertes='%d', headshots='%d', faka='%d', timestamp='%d' WHERE steamid=^"%s^"",
    
TABLEnombreg_frags[id], g_muertes[id], g_headshot[id], g_faka[id], get_systime(), g_steamid[id]);
    
mysql_query(g_connection"DataHandler2"Querydatasizeof(data));
}

client_putinserver(id)
formatex(Querycharsmax(Query), "SELECT * FROM %s WHERE steamid = ^"%s^""TABLEg_steamid[id]); 

No tiene nada que ver con lo que pregunto el usuario...Genius
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)