Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓÃRedis×÷Ϊʱ¼äÐòÁÐÊý¾Ý¿â£ºÔ­Òò¼°·½·¨
 
  À´Ô´:CSDN   ·¢²¼ÓÚ 2016-2-3
  3258  次浏览      27
 

×Ô´Ó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°ïÖúÄã½â¾ö¹«Ë¾Öеĸ÷ÖÖÎÊÌâ¡£

 

   
3258 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

MySQLË÷Òý±³ºóµÄÊý¾Ý½á¹¹
MySQLÐÔÄܵ÷ÓÅÓë¼Ü¹¹Éè¼Æ
SQL ServerÊý¾Ý¿â±¸·ÝÓë»Ö¸´
ÈÃÊý¾Ý¿â·ÉÆðÀ´ 10´óDB2ÓÅ»¯
oracleµÄÁÙʱ±í¿Õ¼äдÂú´ÅÅÌ
Êý¾Ý¿âµÄ¿çƽ̨Éè¼Æ


²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿â
¸ß¼¶Êý¾Ý¿â¼Ü¹¹Éè¼ÆÊ¦
HadoopÔ­ÀíÓëʵ¼ù
Oracle Êý¾Ý²Ö¿â
Êý¾Ý²Ö¿âºÍÊý¾ÝÍÚ¾ò
OracleÊý¾Ý¿â¿ª·¢Óë¹ÜÀí


GE Çø¿éÁ´¼¼ÊõÓëʵÏÖÅàѵ
º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Nodejs¸ß¼¶Ó¦Óÿª·¢
ÖÐÊ¢Òæ»ª ׿Խ¹ÜÀíÕß±ØÐë¾ß±¸µÄÎåÏîÄÜÁ¦
ijÐÅÏ¢¼¼Êõ¹«Ë¾ PythonÅàѵ
ij²©²ÊITϵͳ³§ÉÌ Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À
ÖйúÓÊ´¢ÒøÐÐ ²âÊÔ³ÉÊì¶ÈÄ£Ðͼ¯³É(TMMI)
ÖÐÎïÔº ²úÆ·¾­ÀíÓë²úÆ·¹ÜÀí
 
 
 
 
/**