×Ô´ÓRedis³öÏÖÒÔÀ´£¬¾ÍÔÚʱ¼äÐòÁÐÊý¾ÝµÄ´æ´¢Óë·ÖÎö·½ÃæµÃµ½ÁËÒ»¶¨³Ì¶ÈµÄʹÓá£Redis×î³õÖ»ÊDZ»ÊµÏÖΪһÖÖ»º³å£¬ÆäÄ¿µÄÊÇÓÃÓÚÈÕÖ¾µÄ¼Ç¼£¬¶øËæ×ů书ÄܵIJ»¶Ï·¢Õ¹£¬ËüÒѾ¾ß±¸ÁË5ÖÖÏÔʽ¡¢3ÖÖÒþʽµÄ½á¹¹»òÀàÐÍ£¬ÎªRedisÖеÄÊý¾Ý·ÖÎöÌṩÁ˶àÖÖ·½·¨¡£±¾ÎĽ«Îª¶ÁÕß½éÉÜʹÓÃRedis½øÐÐʱ¼äÐòÁзÖÎö×îÁé»îµÄÒ»ÖÖ·½·¨¡£
¹ØÓÚ¾ºÌ¬ÓëÊÂÎñ
ÔÚRedisÖУ¬Ã¿¸öµ¥¶ÀµÄÃüÁî±¾Éí¶¼ÊÇÔ×ÓÐԵ쬵«°´Ë³ÐòÖ´ÐеĶàÌõÃüÁîȴδ±ØÊÇÔ×ÓÐԵģ¬ÓпÉÄÜÒò³öÏÖ¾ºÌ¬¶øµ¼Ö²»ÕýÈ·µÄÐÐΪ¡£ÎªÁËÓ¦¶ÔÕâÒ»ÏÞÖÆ£¬±¾ÎĽ«Ê¹Óá°ÊÂÎñ¹ÜµÀ¡±ÒÔ¼°¡°Lua½Å±¾"ÕâÁ½ÖÖ·½Ê½±ÜÃâ³öÏÖÊý¾ÝµÄ¾ºÌ¬³åÍ»¡£
ÔÚʹÓÃRedisÒÔ¼°ÓÃÓÚÁ¬½ÓRedisµÄPython¿Í»§¶Ëʱ£¬ÎÒÃÇ»áµ÷ÓÃRedisÁ¬½ÓµÄ.pipeline()·½·¨ÒÔ´´½¨Ò»¸ö¡°ÊÂÎñ¹ÜµÀ¡±£¨ÔÚʹÓÃÆäËû¿Í»§¶Ëʱ£¬Í¨³£Ò²½«Æä³ÆÎª¡°ÊÂÎñ¡±»ò¡°MULTI/EXEC ÊÂÎñ¡±£©£¬ÔÚµ÷ÓÃʱÎÞÐè´«Èë²ÎÊý£¬»òÕß¿ÉÒÔ´«ÈëÒ»¸ö²¼¶ûÖµTrue¡£Í¨¹ý¸Ã·½·¨´´½¨µÄ¹ÜµÀ½«ÊÕ¼¯ËùÓд«ÈëµÄÃüÁֱµ½µ÷ÓÃ.execute()·½·¨ÎªÖ¹¡£µ±.execute()·½·¨µ÷ÓÃÖ®ºó£¬¿Í»§¶Ë½«¶ÔRedis·¢ËÍMULTIÃüÁȻºó·¢ËÍËùÊÕ¼¯µÄÈ«²¿ÃüÁ×îºóÊÇEXECÃüÁî¡£µ±RedisÔÚÖ´ÐÐÕâÒ»×éÃüÁîʱ£¬²»»á±»ÆäËûÈκÎÃüÁîËù´ò¶Ï£¬´Ó¶øÈ·±£ÁËÔ×ÓÐÔµÄÖ´ÐС£
ÔÚRedisÖжÔһϵÁÐÃüÁî½øÐÐÔ×ÓÐÔµÄÖ´Ðл¹´æÔÚ×ÅÁíÒ»ÖÖÑ¡Ôñ£¬¼´·þÎñ¶ËµÄLua½Å±¾¡£¼òµ¥À´Ëµ£¬Lua½Å±¾µÄÐÐΪÓë¹ØÏµÐÍÊý¾Ý¿âÖеĴ洢¹ý³Ì·Ç³£ÏàËÆ£¬µ«½öÏÞÓÚʹÓÃLuaÓïÑÔÒÔ¼°Ò»ÖÖרÓõÄRedis APIÒÔÖ´ÐÐLua¡£ÓëÊÂÎñµÄÐÐΪ·Ç³£ÏàËÆ£¬LuaÖеĽű¾ÔÚÖ´ÐÐʱͨ³£À´Ëµ²»»á±»´ò¶Ï1£¬²»¹ýδ´¦ÀíµÄ´íÎóÒ²»áÔì³ÉLua½Å±¾ÌáǰÖжϡ£´ÓÓï·¨ÉÏ˵£¬ÎÒÃǽ«Í¨¹ýµ÷ÓÃRedisÁ¬½Ó¶ÔÏóµÄ.register_script()·½·¨ÒÔ¼ÓÔØÒ»¸öLua½Å±¾£¬¸Ã·½·¨Ëù·µ»ØµÄ¶ÔÏó¿ÉÒÔ×÷Ϊһ¸öº¯Êý£¬ÒÔµ÷ÓÃRedisÖеĽű¾£¬¶øÎÞÐèÔÙµ÷ÓÃRedisÁ¬½ÓÖÐµÄÆäËû·½·¨£¬²¢½áºÏʹÓÃSCRIPT LOADÓëEVALSHAÃüÁîÒÔ¼ÓÔØÓëÖ´Ðнű¾¡£
ÓÃÀý
µ±Ì¸µ½RedisÒÔ¼°Ê¹ÓÃËü×÷Ϊһ¸öʱ¼äÐòÁÐÊý¾Ý¿âʱ£¬ÎÒÃÇÊ×ÏÈÌá³öµÄÒ»¸öÎÊÌâÊÇ£º¡°Ê±¼äÐòÁÐÊý¾Ý¿âµÄÓÃ;»òÄ¿µÄÊÇʲô£¿¡±Ê±¼äÐòÁÐÊý¾Ý¿âµÄÓÃÀý¸ü¶àµØÓëÊý¾ÝÏà¹Ø£¬ÓÈÆäÔÚÄãµÄÊý¾Ý½á¹¹±»¶¨ÒåΪһϵÁÐʼþ¡¢Ò»¸ö»ò¶à¸öÖµµÄʾÀý¡¢ÒÔ¼°Ëæ×Åʱ¼äÍÆÒÆ¶ø±ä»¯µÄ¶ÈÁ¿ÖµµÄÇé¿öÏ¡£ÒÔÏÂÊÇÕâЩ·½ÃæÓ¦ÓõÄһЩʾÀý£¨µ«²»½öÏÞÓÚ´Ë£©£º
- ¹ÉƱ½»Ò×µÄÂô¼ÛÓë½»Ò×Á¿
- ÔÚÏßÁãÊÛÉ̵Ķ©µ¥×ܼÛÓëËÍ»õµØÖ·
- ÊÓÆµÓÎÏ·ÖÐÍæ¼ÒµÄ²Ù×÷
- IoTÉ豸ÖÐÄÚǶµÄ´«¸ÐÆ÷ÖÐÊÕ¼¯µÄÊý¾Ý
ÎÒÃǽ«¼ÌÐø½øÐÐÉîÈëµÄ̽ÌÖ£¬²»¹ý»ù±¾ÉÏÀ´Ëµ£¬Ê±¼äÐòÁÐÊý¾Ý¿âµÄ×÷ÓþÍÊÇÈç¹û·¢ÉúÁËij¼þÊ£¬»òÊÇÄã½øÐÐÁËÒ»´ÎÆÀ¹À²Ù×÷ºó£¬¿ÉÒÔÔڼǼµÄÊý¾ÝÖмÓÈëÒ»¸öʱ¼ä´Á¡£Ò»µ©ÄãÊÕ¼¯ÁËijЩʼþµÄÐÅÏ¢£¬¾Í¿ÉÒÔ¶ÔÕâЩʼþ½øÐзÖÎö¡£Äã¿ÉÒÔÑ¡ÔñÔÚÊÕ¼¯µÄͬʱ½øÐÐʵʱ·ÖÎö£¬Ò²¿ÉÒÔÔÚʼþ·¢ÉúºóÐèÒª½øÐÐijЩ¸ü¸´ÔӵIJéѯʱ½øÐзÖÎö¡£
ʹÓÃͨ¹ýÓÐÐò¼¯ºÏÓë¹þÏ£½øÐи߼¶·ÖÎö
ÔÚRedisÖУ¬¶ÔÓÚʱ¼äÐòÁÐÊý¾ÝµÄ±£´æÓë·ÖÎöÓÐÒ»ÖÖ×îΪÁé»îµÄ·½Ê½£¬ËüÐèÒª½áºÏʹÓÃRedisÖеÄÁ½ÖÖ²»Í¬µÄ½á¹¹£¬¼´ÓÐÐò¼¯ºÏ£¨Sorted Set£©Óë¹þÏ££¨Hash£©¡£
ÔÚRedisÖУ¬ÓÐÐò¼¯ºÏÕâÖֽṹÈÚºÏÁ˹þÏ£±íÓëÅÅÐòÊ÷£¨RedisÔÚÄÚ²¿Ê¹ÓÃÁËÒ»¸öÌø±í½á¹¹£¬²»¹ýÄã¿ÉÒÔÏȺöÂÔÕâһϸ½Ú£©µÄÌØÐÔ¡£¼òµ¥À´Ëµ£¬ÓÐÐò¼¯ºÏÖеÄÿ¸öÏî¶¼ÊÇÒ»¸ö×Ö·û´®Ð͵ġ°³ÉÔ±¡±ÒÔ¼°Ò»¸ödoubleÐ͵ġ°·ÖÊý¡±µÄ×éºÏ¡£³ÉÔ±ÔÚ¹þÏ£ÖаçÑÝÁ˼üµÄ½ÇÉ«£¬¶ø·ÖÊýÔò³Ðµ£ÁËÊ÷ÖеÄÅÅÐòÖµµÄ×÷Óá£Í¨¹ýÕâÖÖ×éºÏ£¬Äã¾Í¿ÉÒÔͨ¹ý³ÉÔ±»ò·ÖÊýµÄÖµÖ±½Ó·ÃÎʳÉÔ±Óë·ÖÊý£¬´ËÍ⣬ÄãÒ²¿ÉÒÔͨ¹ý¶àÖÖ·½Ê½¶Ô°´ÕÕ·ÖÊýµÄÖµÅźÃÐòµÄ³ÉÔ±Óë·ÖÊý½øÐзÃÎÊ2¡£
±£´æÊ¼þ
Èç½ñ£¬´Ó¸÷ÖÖ·½ÃæÀ´Ëµ£¬Ê¹ÓÃÒ»¸ö»ò¶à¸öÓÐÐò¼¯ºÏÒÔ¼°²¿·Ö¹þÏ£µÄ×éºÏÓÃÓÚ±£´æÊ±¼äÐòÁÐÊý¾ÝµÄ×ö·¨¶¼ÊÇRedis×î³£¼ûµÄÓÃÀýÖ®Ò»¡£Ëü±íÏÖÁËÒ»ÖֵײãµÄ¹¹½¨¿é£¬ÓÃÓÚʵÏÖ¸÷ÖÖ²»Í¬µÄÓ¦ÓóÌÐò¡£°üÀ¨ÏñTwitterÒ»ÑùµÄÉç½»ÍøÂ磬ÒÔ¼°ÀàËÆÓÚRedditºÍHacker NewsÒ»ÑùµÄÐÂÎÅÍøÕ¾£¬ÄËÖÁÓÚ»ùÓÚRedis±¾ÉíµÄÒ»ÖÖ½Ó½üÍê³ÉµÄ¹ØÏµ-¶ÔÏóÓ³ÉäÆ÷
ÔÚ±¾ÎĵÄʾÀýÖУ¬ÎÒÃǽ«»ñÈ¡Óû§ÔÚÍøÕ¾Öеĸ÷ÖÖÐÐΪËù²úÉúµÄʼþ¡£ËùÓеÄʼþ¶¼½«¹²Ïí4ÖÖÊôÐÔ£¬ÒÔ¼°²»Í¬ÊýÁ¿µÄÆäËûÊôÐÔ£¬ÕâÈ¡¾öÓÚʼþµÄÀàÐÍ¡£ÎÒÃÇÒÑÖªµÄÊôÐÔ°üÀ¨£ºid¡¢timestamp¡¢typeÒÔ¼°user¡£ÎªÁ˱£´æÃ¿¸öʼþ£¬ÎÒÃǽ«Ê¹ÓÃÒ»¸öRedis¹þÏ££¬ËüµÄ¼üÓÉʼþµÄidËùÅÉÉú¶øÀ´¡£ÎªÁËÉú³ÉʼþµÄid£¬ÎÒÃǽ«ÔÚ´óÁ¿µÄÔ´ÖÐÑ¡ÔñÒ»ÖÖ·½Ê½£¬µ«ÏÖÔÚÎÒÃǽ«Í¨¹ýRedisÖеÄÒ»¸ö¼ÆÊýÆ÷À´Éú³ÉÎÒÃǵÄid¡£Èç¹ûÔÚ64λµÄƽ̨ÉÏʹÓÃ64λµÄRedis£¬ÎÒÃǽ«Äܹ»´´½¨×î¶à263-1¸öʼþ£¬Ö÷ÒªµÄÏÞÖÆÈ¡¾öÓÚ¿ÉÓõÄÄÚ´æ´óС¡£
µ±ÎÒÃÇ×¼±¸ºÃ½øÐÐÊý¾ÝµÄ¼Ç¼Óë²åÈëºó£¬ÎÒÃǾÍÐèÒª½«Êý¾Ý±£´æÎª¹þÏ££¬²¢ÔÚÓÐÐò¼¯ºÏÖвåÈëÒ»¸ö³ÉÔ±/·ÖÊý¶Ô£¬·Ö±ð¶ÔӦʼþµÄid£¨³ÉÔ±£©ÓëʼþµÄʱ¼ä´Á£¨·ÖÊý£©¡£¼Ç¼ij¸öʼþµÄ´úÂëÈçÏÂ
def record_event(conn, event): id = conn.incr('event:id') event['id'] = id event_key = 'event:{id}'.format(id=id)
pipe = conn.pipeline(True)
pipe.hmset(event_key, event)
pipe.zadd('events', **{id: event['timestamp']})
pipe.execute()
|
ÔÚÕâ¸örecord_event()º¯ÊýÖУ¬ÎÒÃÇ»ñÈ¡ÁËÒ»¸öʼþ£¬´ÓRedisÖлñµÃÒ»¸ö¼ÆËãµÃ³öµÄÐÂid£¬½«Ëü¸³¸øÊ¼þ£¬²¢Éú³ÉÁËʼþ±£´æµÄ¼ü¡£Õâ¸ö¼üµÄ¹¹³ÉÊÇ×Ö·û´®¡°event¡±¼ÓÉÏеÄid£¬²¢ÔÚÁ½ÕßÖ®¼äÓÉðºÅ·Ö¸îËù¹¹³ÉµÄ3¡£ËæºóÎÒÃÇ´´½¨ÁËÒ»¸ö¹ÜµÀ£¬²¢×¼±¸ÉèÖøÃʼþÏà¹ØµÄÈ«²¿Êý¾Ý£¬Í¬Ê±×¼±¸½«Ê¼þidÓëʱ¼ä´Á¶Ô±£´æÔÚÓÐÐò¼¯ºÏÖС£µ±ÊÂÎñ¹ÜµÀÍê³ÉÖ´ÐÐÖ®ºó£¬Õâһʼþ½«±»¼Ç¼²¢±£´æÔÚRedisÖС£
ʼþ·ÖÎö
´ÓÏÖÔÚÆð£¬ÎÒÃÇ¿ÉÒÔͨ¹ý¶àÖÖ·½Ê½¶Ôʱ¼äÐòÁнøÐзÖÎöÁË¡£ÎÒÃÇ¿ÉÒÔͨ¹ýZRANGE 4µÄÉèÖöÔ×îлò×îÔçµÄʼþid½øÐÐɨÃ裬²¢ÇÒ¿ÉÒÔÔÚÉÔºó»ñÈ¡ÕâЩʼþ±¾ÉíÒÔ½øÐзÖÎö¡£Í¨¹ý½áºÏʹÓÃZRANGEBYSCOREÓëLIMIT²ÎÊý£¬ÎÒÃÇÄܹ»Á¢¼´»ñÈ¡µ½Ä³¸öʱ¼ä´Á֮ǰ»òÖ®ºóµÄ10¸ö¡¢ÉõÖÁÊÇ100¸öʼþ¡£ÎÒÃÇÒ²¿ÉÒÔͨ¹ýZCOUNT¼ÆËãÄ³Ò»ÌØ¶¨Ê±¼ä¶ÎÄÚʼþ·¢ÉúµÄ´ÎÊý£¬ÉõÖÁÑ¡ÔñÓÃLua½Å±¾ÊµÏÖ×Ô¼ºµÄ·ÖÎö·½Ê½¡£ÒÔϵÄʾÀý½«Í¨¹ýLua½Å±¾¼ÆËãÔÚÒ»¸ö¸ø¶¨Ê±¼ä·¶Î§ÄÚ¸÷ÖÖ²»Í¬µÄʼþÀàÐ͵ÄÊýÁ¿¡£
import json
def count_types(conn, start, end):
counts = count_types_lua(keys=['events'], args=[start, end])
return json.loads(counts)
count_types_lua = conn.register_script('''
local counts = {}
local ids = redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[2])
for i, id in ipairs(ids) do
local type = redis.call('HGET', 'event:' .. id, 'type')
counts[type] = (counts[type] or 0) + 1
end
return cjson.encode(counts)
''')
|
ÕâÀïËù¶¨ÒåµÄcount_types()º¯ÊýÊ×ÏȽ«²ÎÊý´«µÝ¸ø¾¹ý·â×°µÄLua½Å±¾£¬²¢¶Ô¾¹ýjson±àÂëµÄʼþÀàÐÍÓëÊýÁ¿µÄÓ³Éä½øÐнâÂë¡£Lua½Å±¾Ê×ÏÈ´´½¨ÁËÒ»¸ö½á¹û±í£¨¶ÔÓ¦counts±äÁ¿£©£¬Ëæºóͨ¹ýZRANGEBYSCORE¶ÁÈ¡Õâһʱ¼ä·¶Î§ÄÚµÄʼþidµÄÁÐ±í¡£µ±»ñÈ¡µ½ÕâЩidÖ®ºó£¬½Å±¾½«Ò»´ÎÐÔ¶Áȡÿ¸öʼþÖеÄÀàÐÍÊôÐÔ£¬ÈÃʼþÊýÁ¿±í±£³Ö²»¶ÏÔö³¤£¬×îºó½áÊøÊ±·µ»ØÒ»¸ö¾¹ýjson±àÂëµÄÓ³Éä½á¹û¡£
¶ÔÐÔÄܵÄ˼¿¼ÒÔ¼°Êý¾Ý½¨Ä£
ÕýÈç´úÂëËùչʾµÄÒ»Ñù£¬Õâ¸öÓÃÓÚÔÚÌØ¶¨Ê±¼ä·¶Î§ÄÚ¼ÆË㲻ͬʼþÀàÐÍÊýÁ¿µÄ·½·¨Äܹ»Õý³£¹¤×÷£¬µ«ÕâÖÖ·½Ê½ÐèÒª¶ÔÕâһʱ¼ä·¶Î§ÄÚµÄÿ¸öʼþµÄÀàÐÍÊôÐÔ½øÐдóÁ¿µÄ¶ÁÈ¡¡£¶ÔÓÚ°üº¬¼¸°Ù»òÊǼ¸Ç§¸öʼþµÄʱ¼ä·¶Î§À´Ëµ£¬ÕâÑùµÄ·ÖÎöÊDZȽϿìµÄ¡£µ«Èç¹ûij¸öʱ¼ä·¶Î§ÄÚÒûʳÁ˼¸ÍòÄËÖÁ¼¸°ÙÍò¸öʼþ£¬Çé¿öÓÖ»áÈçºÎÄØ£¿´ð°¸ºÜ¼òµ¥£¬RedisÔÚ¼ÆËã½á¹ûʱ½«»á×èÈû¡£
ÓÐÒ»ÖÖ·½·¨Äܹ»´¦ÀíÔÚ·ÖÎöʼþÁ÷ʱ£¬ÓÉÓÚ³¤Ê±¼äµÄ½Å±¾Ö´Ðжø²úÉúµÄÐÔÄÜÎÊÌ⣬¼´Ô¤ÏÈ¿¼ÂÇÒ»ÏÂÐèÒª±»Ö´ÐеIJéѯ¡£¾ßÌåÀ´Ëµ£¬Èç¹ûÄãÖªµÀÄãÐèÒª¶Ôijһ¶Îʱ¼ä·¶Î§ÄÚµÄÿÖÖʼþµÄ×ÜÊý½øÐвéѯ£¬Äã¾Í¿ÉÒÔΪÿÖÖʼþÀàÐÍʹÓÃÒ»¸ö¶îÍâµÄÓÐÐò¼¯ºÏ£¬Ã¿¸ö¼¯ºÏÖ»±£´æÕâÖÖÀàÐÍʼþµÄidÓëʱ¼ä´Á¶Ô¡£µ±ÄãÐèÒª¼ÆËãÿÖÖÀàÐÍʼþµÄ×ÜÊýʱ£¬Äã¿ÉÒÔÖ´ÐÐһϵÁÐZCOUNT»òÏàͬ¹¦Äܵķ½·¨µ÷ÓÃ5£¬²¢·µ»Ø¸Ã½á¹û¡£ÈÃÎÒÃÇÀ´¿´Ò»ÏÂÕâ¸öÐ޸ĺóµÄrecord_event()º¯Êý£¬Ëü½«±£´æ»ùÓÚʼþÀàÐ͵ÄÓÐÐò¼¯ºÏ¡£
def record_event_by_type(conn, event): id = conn.incr('event:id') event['id'] = id event_key = 'event:{id}'.format(id=id) type_key = 'events:{type}'.format(type=event['type'])
ref = {id: event['timestamp']}
pipe = conn.pipeline(True)
pipe.hmset(event_key, event)
pipe.zadd('events', **ref)
pipe.zadd(type_key, **ref)
pipe.execute()
|
еÄrecord_event_by_type()º¯ÊýÓë¾ÉµÄrecord_event()º¯ÊýÔÚÐí¶à·½Ãæ¶¼ÊÇÏàͬµÄ£¬µ«Ð¼ÓÈëÁËһЩ²Ù×÷¡£ÔÚеĺ¯ÊýÖУ¬ÎÒÃǽ«¼ÆËãÒ»¸ötype_key£¬ÕâÀォ±£´æ¸ÃʼþÔÚ¶ÔÓ¦ÕâÒ»ÀàÐÍʼþµÄÓÐÐò¼¯ºÏÖеÄλÖÃË÷Òý¡£µ±idÓëʱ¼ä´Á¶ÔÌí¼Óµ½eventsÓÐÐò¼¯ºÏÖкó£¬ÎÒÃÇ»¹Òª½«idÓëʱ¼ä´Á¶ÔÌí¼Óµ½type_keyÕâ¸öÓÐÐò¼¯ºÏÖУ¬ËæºóÓë¾ÉµÄ·½·¨Ò»ÑùÖ´ÐÐÊý¾Ý²åÈë²Ù×÷¡£
ÏÖÔÚ£¬Èç¹ûÐèÒª¼ÆËãÁ½¸öʱ¼äµãÖ®¼ä¡°visit¡±ÕâÒ»ÀàÐ͵ÄʼþËù·¢ÉúµÄ´ÎÊý£¬ÎÒÃÇÖ»ÐèÔÚµ÷ÓÃZCOUNTÃüÁîʱ´«ÈëËù¼ÆËãµÄʼþÀàÐ͵ÄÌØ¶¨¼ü£¬ÒÔ¼°¿ªÊ¼Óë½áÊøµÄʱ¼ä´Á¡£
def count_type(conn, type, start, end): type_key = 'events:{type}'.format(type=type) return conn.zcount(type_key, start, end)
|
Èç¹ûÎÒÃÇÄܹ»Ô¤ÏÈÖªµÀËùÓпÉÄܳöÏÖµÄʼþÀàÐÍ£¬ÎÒÃǾÍÄܹ»¶ÔÿÖÖÀàÐÍ·Ö±ðµ÷ÓÃÒÔÉϵÄcount_type()º¯Êý£¬²¢¹¹½¨³ö֮ǰÔÚcount_types()ÖÐËù´´½¨µÄ±í¡£¶øÈç¹ûÎÒÃÇÎÞ·¨Ô¤ÏÈÖªµÀËùÓпÉÄÜ»á³öÏÖµÄʼþÀàÐÍ£¬»òÊÇÓпÉÄÜÔÚδÀ´³öÏÖеÄʼþÀàÐÍ£¬ÎÒÃǽ«¿ÉÒÔ½«Ã¿ÖÖÀàÐͼÓÈëÒ»¸ö¼¯ºÏ£¨Set£©½á¹¹ÖУ¬²¢ÔÚÖ®ºóʹÓÃÕâ¸ö¼¯ºÏÒÔ·¢ÏÖËùÓеÄʼþÀàÐÍ¡£ÒÔÏÂÊǾÎÒÃÇÐ޸ĺóµÄ¼Ç¼Ê¼þº¯Êý¡£
def record_event_types(conn, event): id = conn.incr('event:id') event['id'] = id event_key = 'event:{id}'.format(id=id) type_key = 'events:{type}'.format(type=event['type'])
ref = {id: event['timestamp']}
pipe = conn.pipeline(True)
pipe.hmset(event_key, event)
pipe.zadd('events', **ref)
pipe.zadd(type_key, **ref)
pipe.sadd('event:types', event['type'])
pipe.execute()
|
Óë֮ǰÏà±È£¬Î¨Ò»µÄ¸Ä±ä¾ÍÔÚÓÚÎÒÃǽ«Ê¼þµÄÀàÐͼÓÈëÁËÒ»¸öÃüÃûΪ¡°event:types¡±µÄ¼¯ºÏ£¬È»ºóÎÒÃÇÐèÒªÏàÓ¦µØÐÞ¸ÄÒ»ÏÂcount_types()º¯ÊýµÄʵÏÖ¡¡
def count_types_fast(conn, start, end): event_types = conn.smembers('event:types') counts = {} for event_type in event_types: counts[event_type] = conn.zcount( 'events:{type}'.format(type=event_type), start, end) return counts
|
Èç¹ûij¸öʱ¼ä·¶Î§ÄÚ´æÔÚ´óÁ¿µÄʼþ£¬ÄÇôеÄcount_types_fast()º¯Êý½«±È¾ÉµÄcount_types()º¯ÊýÖ´Ðиü¿ì£¬Ö÷ÒªÔÒòÔÚÓÚZCOUNTÃüÁî±ÈÆð´Ó¹þÏ£Öлñȡÿ¸öʼþÀàÐÍËٶȸü¿ì¡£
ÒÔRedis×÷ΪÊý¾Ý´æ´¢
ËäÈ»Redis×Ô´øµÄ·ÖÎö¹¤¾ß¼°ÆäÃüÁîºÍLua½Å±¾·Ç³£Áé»î²¢ÇÒÐÔÄܳöÉ«£¬µ«Ä³Ð©ÀàÐ͵Äʱ¼äÐòÁзÖÎö»¹Äܹ»´ÓÌØ¶¨µÄ¼ÆËã·½·¨¡¢¿â»ò¹¤¾ßÖÐÊÜÒæ¡£¶ÔÓÚÕâЩÇéÐÎÀ´Ëµ£¬½«Êý¾Ý±£´æÔÚRedisÖÐÈÔÈ»ÊÇÒ»Öַdz£ÓÐÒâÒåµÄ×ö·¨£¬ÒòΪRedis¶ÔÓÚÊý¾ÝµÄ´æÈ¡·Ç³£¿ì¡£
¾ÙÀýÀ´Ëµ£¬¶ÔÓÚÒ»Ö§¹ÉƱÀ´Ëµ£¬Õû¸ö10ÄêµÄ³É½»½ð¶îÊý¾Ý°´ÕÕÿ·ÖÖÓÈ¡ÑùÒ²×î¶à²»¹ý120ÍòÌõÊý¾Ý£¬ÕâµãÊý¾ÝÄܹ»ÇáÒ׵ر£´æÔÚRedisÖС£µ«Èç¹ûҪͨ¹ýRedisÖеÄLua½Å±¾¶ÔÊý¾ÝÖ´ÐÐÈκθ´Ôӵĺ¯Êý£¬ÔòÐèÒª¶ÔÏÖÓеÄÓÅ»¯¿â½øÐÐÒÆÖ²»òÊǵ÷ÊÔ£¬ÈÃËûÃÇÔÚRedisÖÐҲʵÏÖÏàͬµÄ¹¦ÄÜ¡£¶øÈç¹ûʹÓÃRedis½øÐÐÊý¾Ý´æ´¢£¬Äã¾Í¿ÉÒÔ»ñȡʱ¼ä·¶Î§ÄÚµÄÊý¾Ý£¬½«ËûÃDZ£´æÔÚÒÑÓеľ¹ýÓÅ»¯µÄÄÚºËÖУ¬ÒÔ¼ÆËã²»¶Ï±ä»¯µÄƽ¾ù¼Û¸ñ¡¢¼Û¸ñ²¨¶¯µÈµÈ¡£
ÄÇôΪʲô²»Ñ¡ÓÃÒ»ÖÖ¹ØÏµÐÍÊý¾Ý¿â×÷ÎªÌæ´úÄØ£¿ÔÒò¾ÍÔÚÓÚËÙ¶È¡£Redis½«ËùÓÐÊý¾Ý¶¼±£´æÔÚRAMÖУ¬²¢ÇÒ¶ÔÊý¾Ý½á¹¹½øÐÐÁËÓÅ»¯£¨ÕýÈçÎÒÃÇËù¾ÙµÄÓÐÐò¼¯ºÏµÄÀý×ÓÒ»Ñù£©¡£ÔÚÄÚ´æÖб£´æÊý¾Ý¼°¾¹ýÓÅ»¯µÄÊý¾Ý½á¹¹µÄ½áºÏÔÚËÙ¶ÈÉϲ»½ö±ÈÆðÒÔSSDΪ´æ´¢½éÖʵÄÊý¾Ý¿â¿ìÁË3¸öÊýÁ¿¼¶£¬²¢ÇÒ¶ÔÓÚÒ»°ãµÄÄÚ´æ¼üÖµ´æ´¢ÏµÍ³¡¢»òÊÇÔÚÄÚ´æÖб£´æÐòÁл¯Êý¾ÝµÄϵͳҲ¿ìÁË1ÖÁ2¸öÊýÁ¿¼¶¡£
½áÂÛ¼°ºóÐø
µ±Ê¹ÓÃRedis½øÐÐʱ¼äÐòÁзÖÎö£¬ÄËÖÁÈκÎÀàÐ͵ķÖÎöʱ£¬Ò»ÖÖºÏÀíµÄ·½Ê½ÊǼǼ²»Í¬Ê¼þµÄijЩͨÓÃÊôÐÔÓëÊýÖµ£¬±£´æÔÚÒ»¸öͨÓõĵØÖ·£¬ÒÔ±ãÓÚËÑË÷°üº¬ÕâЩͨÓÃÊôÐÔÓëÊýÖµµÄʼþ¡£ÎÒÃÇͨ¹ýΪÿ¸öʼþÀàÐÍʵÏÖ¶ÔÓ¦µÄÓÐÐò¼¯ºÏʵÏÖÁËÕâÒ»µã£¬²¢ÇÒÒ²Ìáµ½Á˼¯ºÏµÄʹÓá£ËäÈ»ÕâÆªÎÄÕÂÖ÷ÒªÌÖÂÛµÄÊÇÓÐÐò¼¯ºÏµÄÓ¦Ó㬵«RedisÖл¹´æÔÚןü¶àµÄ½á¹¹£¬ÔÚ·ÖÎö¹¤×÷ÖÐʹÓÃRedis»¹´æÔÚÆäËûÐí¶à²»Í¬µÄÑ¡Ôñ¡£³ýÁËÓÐÐò¼¯ºÏÓë¹þÏ£Ö®Í⣬ÔÚ·ÖÎö¹¤×÷Öл¹ÓÐһЩ³£ÓõĽṹ£¬°üÀ¨£¨µ«²»ÏÞÓÚ£©£ºÎ»Í¼¡¢Êý×éË÷ÒýµÄ×Ö½Ú×Ö·û´®¡¢HyperLogLogs¡¢ÁÐ±í£¨List£©¡¢¼¯ºÏ£¬ÒÔ¼°ºÜ¿ì½«·¢²¼µÄ»ùÓÚµØÀíλÖÃË÷ÒýµÄÓÐÐò¼¯ºÏÃüÁî6¡£
ÔÚʹÓÃRedisʱ£¬Äã»á²»Ê±µØÖØÐÂ˼Ë÷ÈçºÎΪ¸üÌØ¶¨µÄÊý¾Ý·ÃÎÊģʽÌí¼ÓÏà¹ØµÄÊý¾Ý½á¹¹¡£ÄãËùÑ¡ÔñµÄÊý¾Ý±£´æÐÎʽ¼ÈΪÄãÌṩÁ˱£´æÄÜÁ¦£¬Ò²ÏÞ¶¨ÁËÄãÄܹ»Ö´ÐеIJéѯµÄÀàÐÍ£¬ÕâÒ»µã¼¸ºõ×ÜÊDz»±äµÄ¡£Àí½âÕâÒ»µãºÜÖØÒª£¬ÒòΪÓ봫ͳµÄ¡¢¸üΪÈËÊìϤµÄ¹ØÏµÐÍÊý¾Ý¿â²»Í¬£¬ÔÚRedisÖпÉÓõIJéѯÓë²Ù×÷ÊÜÏÞÓÚÊý¾Ý±£´æµÄÀàÐÍ¡£
ÔÚ¿´¹ýÁË·ÖÎöʱ¼äÐòÁÐÊý¾ÝµÄÕâЩʾÀýÖ®ºó£¬Äã¿ÉÒÔ½øÒ»²½ÔĶÁ¡¶Redis in Action¡·Õâ±¾ÊéµÚ7ÕÂÖйØÓÚͨ¹ý´´½¨Ë÷Òý²éÕÒÏà¹ØÊý¾ÝµÄ¸÷ÖÖ·½·¨£¬¿ÉÒÔÔÚRedisLabs.comµÄeBooksÀ¸Ä¿ÖÐÕÒµ½Ëü¡£¶øÔÚ¡¶Redis in Action¡·Ò»ÊéµÄµÚ8ÕÂÖÐÌṩÁËÒ»¸ö½üºõÍêÕûµÄ¡¢ÀàËÆÓÚTwitterµÄÉç½»ÍøÂçµÄʵÏÖ£¬°üÀ¨¹Ø×¢Õß¡¢ÁÐ±í¡¢Ê±¼äÏß¡¢ÒÔ¼°Ò»¸öÁ÷·þÎñÆ÷£¬ÕâЩÄÚÈݶÔÓÚÀí½âÈçºÎʹÓÃRedis±£´æÊ±¼äÐòÁÐÖеÄʱ¼äÏß¼°Ê¼þÒÔ¼°¶Ô²éѯµÄÏìÓ¦ÊÇÒ»¸öºÜºÃµÄÆðµã¡£
1 Èç¹ûÄãÆô¶¯ÁËlua-time-limitÕâÒ»ÅäÖÃÑ¡Ï²¢Çҽű¾µÄÖ´ÐÐʱ¼ä³¬¹ýÁËÅäÖõÄÉÏÏÞ£¬ÄÇôֻ¶ÁµÄ½Å±¾Ò²¿ÉÄܻᱻ´ò¶Ï¡£
2 µ±·ÖÊýÏàͬʱ£¬½«°´ÕÕ³ÉÔ±±¾ÉíµÄ×Öĸ˳Ðò¶ÔÓÚÏîÄ¿½øÐÐÅÅÐò¡£
3 ÔÚ±¾ÎÄÖУ¬ÎÒÃÇͨ³£Ê¹ÓÃðºÅ×÷Ϊ²Ù×÷RedisÊý¾Ýʱ¶ÔÃû³Æ¡¢ÃüÃû¿Õ¼äÒÔ¼°Êý¾ÝµÄ·Ö¸î·û£¬µ«ÄãÒ²¿ÉÒÔËæÒâÑ¡ÔñÈκÎÒ»ÖÖ·ûºÅ¡£ÆäËûRedisÓû§¿ÉÄÜ»áÑ¡Ôñ¾äºÅ¡°.¡±»ò·ÖºÅ¡°;¡±µÈ×÷Ϊ·Ö¸î·û¡£Ö»ÒªÑ¡ÔñÒ»ÖÖÔÚ¼ü»òÊý¾ÝÖÐͨ³£²»»á³öÏÖµÄ×Ö·û£¬¾ÍÊÇÒ»ÖֱȽϺõÄ×ö·¨¡£
4 ZRANGE¼°ZREVRANGEÌṩÁË»ùÓÚÅÅÐòλÖôÓÓÐÐò¼¯ºÏÖлñÈ¡ÔªËØµÄ¹¦ÄÜ£¬ZRANGEµÄ×îС·ÖÊýË÷ÒýΪ0£¬¶øZREVRANGEµÄ×î´ó·ÖÊýË÷ÒýΪ0¡£
5 ZCOUNTÃüÁ¶ÔÓÐÐò¼¯ºÏÖÐij¸ö·¶Î§ÄÚµÄÊý¾Ý¼ÆËãÖµµÄ×ܺͣ¬µ«ËüµÄ×ö·¨ÊÇ´Óij¸ö¶Ëµã¿ªÊ¼ÔöÁ¿Ê½µÄ±éÀúÕû¸ö·¶Î§¡£¶ÔÓÚ°üº¬´óÁ¿ÏîÄ¿µÄ·¶Î§À´Ëµ£¬ÕâÒ»ÃüÁîµÄ¿ªÏú¿ÉÄÜ»áºÜ´ó¡£×÷ΪÁíÒ»ÖÖÑ¡Ôñ£¬Äã¿ÉÒÔʹÓÃZRANGEBYSCOREºÍZREVRANGEBYSCOREÃüÁîÒÔ²éÕÒ·¶Î§ÄÚ³ÉÔ±µÄÆðʼÓëÖÕ½áµã¡£¶øÍ¨¹ýÔÚ³ÉÔ±ÁбíµÄÁ½¶ËʹÓÃZRANK£¬Äã¿ÉÒÔ²éÕÒÕâЩ³ÉÔ±ÔÚÓÐÐò¼¯ºÏÖеÄÁ½¸öË÷Òý£¬Í¨¹ýʹÓÃÕâÁ½¸öË÷Òý£¬Äã¿ÉÒÔ½«Á½ÕßÏà¼õ£¨ÔÙ¼ÓÉÏ1£©ÒԵõ½ÏàͬµÄ½á¹û£¬¶øÆä¼ÆË㿪ÏúÔò´ó´ó¼õÉÙÁË£¬¼´Ê¹ÕâÖÖ·½Ê½ÐèÒª¶ÔRedis½øÐиü¶àµÄµ÷Óá£
6 ÔÚRedis 2.8.9ÖÐÒýÈëµÄZ*LEXÃüÁî»áʹÓÃÓÐÐò¼¯ºÏÒÔÌṩ¶ÔÓÐÐò¼¯ºÏÓÐÏÞµÄǰ׺ËÑË÷¹¦ÄÜ£¬ÓëÖ®ÀàËÆ£¬×îÐµĻ¹Î´·¢²¼µÄRedis 3.2Öн«Í¨¹ýGEO*ÃüÁîÌṩÓÐÏ޵ĵØÀíλÖÃËÑË÷ÓëË÷Òý¹¦ÄÜ¡£
¹ØÓÚ×÷Õß
Josiah Carlson²©Ê¿ÊÇһλ¾Ñé·á¸»µÄÊý¾Ý¿âר¼Ò£¬Ò²ÊÇRedisÉçÇøµÄ»îÔ¾¹±Ï×Õß¡£×÷Ϊ³õ´´¹«Ë¾·½ÃæµÄÀÏÊÖ£¬×Ô´ÓÁ˽âÁËSalvatore SanfilippoÔÚ2010ÄêµÄ¹¤×÷ºó£¬Josiah¾Í²é¾õÁËRedisµÄ¼ÛÖµÓëÄ¿µÄ¡£¾¹ý´óÁ¿µÄʹÓá¢ÎóÓÃÒÔ¼°°ïÖúËûÈËÀí½âRedisµÄ¸÷ÖÖÎĵµ»¯»òδÎĵµ»¯µÄÌØÐÔÖ®ºó£¬Ëû×îÖÕÔÚΪËûµÄǰһ¼Ò³õ´´¹«Ë¾½øÐм¼Êõ¿ªÍØÊ±±àдÁË¡¶Redis in Action¡·Ò»Êé¡£ËûµÄ²¿·Ö¹¤×÷³É¹ûת»¯ÎªÁËʹÓÃRedisµÄ¹¦ÄܵÄÏà¹Ø¿ªÔ´¿â£¬²¢ÇÒ³ÖÐøµØÔÚÓʼþÁбíÖлشð¸÷ÖÖÎÊÌ⣬ͬʱҲ²»Ê±µØ±àдRedisÓëÆäËûÖ÷ÌâµÄ²©¿ÍÎÄÕ¡£Josiah Carlson²©Ê¿Ä¿Ç°ÔÚOpenmailµ£Èμ¼Êõ²¿µÄVP£¬ÕâÊÇÒ»¼ÒλÓÚÂåÉ¼í¶µÄÉд¦ÓÚÔçÆÚµÄ³õ´´¹«Ë¾¡£Ëû·Ç³£ÀÖÓÚΪÄã½²½âÈçºÎͨ¹ýRedis°ïÖúÄã½â¾ö¹«Ë¾Öеĸ÷ÖÖÎÊÌâ¡£
|