2017-07-31 7 views
0

Je prévois d'utiliser Redis comme ma base de données de 2ème classe pour mon API PHP (Predis pour PHP & Redis connexion), ma base de données principale est MySQL. Je suis nouveau et je me demande si je suis sur la bonne voie ou si je me trompe complètement. Je vais utiliser Redis pour toutes les requêtes "SELECT" ou Retrieval au lieu de l'obtenir depuis MySQL. Voici l'exemple de flux.Un bon moyen de mettre à jour un enregistrement spécifique sur le LIST/SET dans Redis

J'ai un utilisateur qui a plusieurs enregistrements sur l'autre table (1: plusieurs). TableA contient tous les utilisateurs et TableB contient tous les enregistrements d'expérience de tous les utilisateurs.

**TableA** 
UserID - 1234 
UserID - 4567 
UserID - 7890 

------------------------------------------------------- 


**TableB** 
ExperienceID - 1 | UserID - 1234 | Experience - Waiter 
ExperienceID - 2 | UserID - 1234 | Experience - Chef 
ExperienceID - 3 | UserID - 4567 | Experience - Developer 
ExperienceID - 4 | UserID - 4567 | Experience - Technician 
ExperienceID - 5 | UserID - 4567 | Experience - Support 
ExperienceID - 6 | UserID - 7890 | Experience - Engineer 
ExperienceID - 7 | UserID - 7890 | Experience - Engineer 
ExperienceID - 8 | UserID - 7890 | Experience - Draftsman 
  • Enregistrer de nouvelles expériences sur MySQL et une fois le succès, il poussera la même expérience sur Redis (le format Redis).
  • Get/retreive tous les enregistrements de Redis au lieu de MySQL
  • Mise à jour de l'expérience sur MySQL et une fois le succès, il mettra à jour l'expérience spécifique Redis --->Je ne sais pas comment faire cela sur Redis sans boucle sur PHP qui n'est pas une bonne idée si je énorme liste d'enregistrements :(

Voici ma mise en page Redis.

uid:1234:experience 
uid:4567:experience 
uid:7890:experience 

a l'intérieur de l'expérience enregistrement namespace

I utilisé SADD avec des données codées JSON pour définir

$userExperience1 = array(
    'id'   => 1, 
    'user_id'  => 1234, 
    'experience' => 'Waiter' 
); 

$userExperience2 = array(
    'id'   => 2, 
    'user_id'  => 1234, 
    'experience' => 'Chef' 
); 


$redis->sadd('uid:' . $userId . ':experience', json_encode($userExperience1)); 
$redis->sadd('uid:' . $userId . ':experience', json_encode($userExperience2)); 

J'ai aussi essayé d'utiliser LISTE

$redis->rpush('uid:' . $userId . ':experience', json_encode($userExperience1)); 
$redis->rpush('uid:' . $userId . ':experience', json_encode($userExperience2)); 

Mais je ne sais pas la bonne façon de mettre à jour enregistrement spécifique sur Redis, comme je veux pour mettre à jour uniquement l'expérience "Waiter" de l'utilisateur 1234.

Une suggestion ou un conseil? Merci les gars.

Répondre

1

Avec les ensembles, vous n'avez pas d'autre option mais parcourez l'ensemble au niveau de l'application.

Avec les listes vous pouvez travailler avec des objets individuels, il vous suffit de mapper l'identifiant de l'élément dans la liste pour voir l'identifiant. Quelque chose comme ceci:

$listId = $redis->rpush('uid:' . $userId . ':experience', json_encode($userExperience1)); 
$redis->set('eid:' . $userExperience1['id'] . ':listId', $listId); 

donc mise à jour est assez simple:

$listId = $redis->get('eid:' . $newUserExperience['id'] . ':listId', $listId); 
$redis->lset('uid:' . $userId . ':experience', $listId - 1, json_encode($newUserExperience)); 

mais vous devez prendre des précautions supplémentaires si vous supprimez une expérience de la liste pour garder la carte en synchronisation.

+0

Cool. Merci @Alex Blex. c'est une bonne façon. $ redis-> lset ('uid:'. $ userId. ': expérience', $ listId-1, json_encode ($ newUserExperience)); Je mets "-1" pour obtenir le bon index. Pour la suppression, pensez-vous qu'il est préférable de faire une suppression douce? ou avez-vous une suggestion sur la façon de supprimer un enregistrement spécifique sur la liste. – jamcoder

+1

Merci, mis à jour la réponse. Oui, la suppression douce est le moyen le plus simple. Si vous en avez beaucoup, vous devrez peut-être "recharger" l'ensemble après un certain nombre d'expériences effacées. –

+0

l'ai eu. Je vais faire l'approche de suppression douce. merci @Alex Blex. – jamcoder