рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ: рдХрдИ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рд╡рд╛рд╣ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрдзрд┐рдорд╛рдирддрдГ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ), рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдХрдИ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдбреЗрдЯрд╛ рдЯреЗрдмрд▓ рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рдХрд▓реНрдк Redis + C ++ рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ред
рд░реЗрдбрд┐рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЪреБрдирдирд╛
рдпрджрд┐ рдЖрдк
рдпрд╣рд╛рдВ рджреЗрдЦрддреЗ
рд╣реИрдВ , рддреЛ рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд░реЗрдбрд┐рд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрддреЗ рд╣реИрдВ: рд╣рд╛рдпрд░рд┐рд╕, рдХреНрд░реЗрдбрд┐рдЯ, рд▓рд┐рдмреНрд░реЗрдбрд┐рд╕ рдФрд░ рд╕реА ++ рдХреНрд▓рд╛рдЗрдВрдЯред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреА рдЬрд░реВрд░рдд рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп "рд╕рдорд╛рдкреНрддрд┐" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рдЬреЛ рддреБрд░рдВрдд рдЗрд╕ рддрдереНрдп рдкрд░ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓, рдЙрддреНрд╕рд╛рд╣ рдФрд░ рдорд╣рд╛рди рдзреИрд░реНрдп рдХреЗ рд╕рд╛рде рдмрд╛рдВрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рд╢реНрд░рдо рдХреА рд░рд╛рд╢рд┐ рдХреЗ рд▓рд┐рдП рдкреИрд╕реЗ рдХрд╛ рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдЧреНрд░рд╛рд╣рдХ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдм рддрдХ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИред
Libredisред рдпрд╣ рдмрд╛рдд рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ PHP рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд╣реИред рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред
Credisред рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХрдореНрдкрд╛рдЙрдВрдб рдХрдорд╛рдВрдб рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдореВрд▓ рд░реЗрдбрд┐рд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╡реЗ рдЕрдм TODO рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд░рдорд╛рдгреБ рдХрдИ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рддреЛ, рдЪреБрдирд╛рд╡
рднрд╛рдбрд╝реЗ рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ - рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреНрд░рд╛рд╣рдХред
рдЗрд╡реЗрдВрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЪрдпрди
рдЖрдИрдЯреА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдирд╡реАрдирддрдо рд░реБрдЭрд╛рдиреЛрдВ рдХреЗ рдмрд╛рдж рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд░реЗрдбрд┐рд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдпрд╣ рдбреАрдмреАрдПрдордПрд╕ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рд╣рд╛рдпрд░рд┐рд╕ 3 рдИрд╡реЗрдВрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдПрдИ, рд▓реАрдмрд╡реЗрдВрдЯ рдФрд░ рд▓рд┐рдмреЗрд╡ред
рдпрд╣рд╛рдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд░реЗрдбрд┐рд╕ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗрд╡рд▓ рдЙрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдбреЗрдЯрд╛ рдХреЛ рдЕрдиреНрдп рд╕реНрдЯреНрд░реАрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдПрдИ ред рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ, рддреЛ Google рдХрд┐рд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░реЗрдЧрд╛ - рдХреГрдкрдпрд╛ рдПрдХ рдкреНрд░реВрдлрд╝рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред
Libeventред рд╕рдВрд╕реНрдХрд░рдг 2.xx рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ 1.xx рдпрд╣ рддрдереНрдп рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
рд▓рд┐рд╣рд╛рдЬрд╛, рдЪреБрдирд╛рд╡
рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ред рдЖрдЧреЗ рдХрд╛ рд╡рд┐рд╡рд░рдгред
рд╣реЗрд░реАрдбрд┐рд╕ + рд▓рд┐рдмрд╛рд╡ + рдорд▓реНрдЯреАрдереНрд░реЗрдб
рд▓реЗрдЦ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдирд╣реАрдВ рд╣реИрдВред рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдИрд╡реЗрдВрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ (рдпрд╣рд╛рдБ
рдкреНрд░рдорд╛рдг рд╣реИ ) рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рд░реЗрдВрдЯреАрдЬрд╝ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рд╕реЗ рдкреНрд░рдХрд╛рд╢рди рд╣реИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдореВрд▓реНрдпрд╡рд╛рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ Ev_async рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдЪреМрдХреАрджрд╛рд░, рдЬреЛ рдЕрдиреНрдп рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред
рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдореИрдВрдиреЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╛ рддреЛ рдореБрдЭреЗ рдкрд░реНрдпрд╛рдкреНрдд рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдореБрдЭреЗ рд╕реНрд░реЛрдд рдореЗрдВ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджрд┐рдП рдЧрдП рдПрдбрд╛рдкреНрдЯрд░ рдХреЛ рд▓рд┐рдкреЗрд╡ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред
So. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, redisLibevEvents рдЗрд╡реЗрдВрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдФрд░ рджреНрд░рд╖реНрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ:
typedef struct redisLibevEvents { redisAsyncContext *context; struct ev_loop *loop; int reading, writing; ev_io rev, wev; ev_async aev;
рдЕрдЧрд▓рд╛ред рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ:
void redisLibevAsyncEvent(EV_P_ ev_async *watcher, int revents) {
рдЕрдЧрд▓рд╛ред рд╕рдВрджрд░реНрдн рдХреЛ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реВрдк рдореЗрдВ рдмрд╛рдЗрдВрдб рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ, рдЬрд┐рд╕реЗ redisLibevAttach рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
ev_async_init(&e->aev, redisLibevAsyncEvent);
рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЧрд╛рдпрдм рд╣реИ: рдмрдирд╛рдП рдЧрдП рдЪреМрдХреАрджрд╛рд░ рдХреЛ рдПрдХ рд╕рдВрдХреЗрддрдХ рдорд┐рд▓рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо redisLibevAttach рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
int redisLibevAttach(EV_P_ redisAsyncContext *ac, ev_async **_pEvAsync) { ... *_pEvAsync = &e->aev; return REDIS_OK; }
рджрд░рдЕрд╕рд▓ рдЗрд╕рдХреЗ рдмрд╛рдж рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп:
m_pRedisAsyncContext = redisAsyncConnect(m_strIP, m_nDBPort);
рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди:
ev_loop(m_pEventLoop, 0);
рдЦреИрд░, рдПрдХ рдирдИ рдШрдЯрдирд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп:
рдЦреИрд░, рдпрд╣ рд╕рдм рд╣реИред рд╕реА рдФрд░ рд╕реА ++ рдХрд╛ рдкрд░рд┐рдгрд╛рдореА рдорд┐рд╢реНрд░рдг рдХрд╛рдлреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реИрдз рд╕реА ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рд░реА рд╣реЛрдиреЗ рддрдХ рдХреЛрдИ рдХрд╛рдо рдЖрддрд╛ рд╣реИред
рдкреБрдирд╢реНрдЪ:
рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдкрдврд╝реЗрдВред