2017-04-06 44 views
0

簡稱:Redis的設定時間=獲取時間(怪)Redis:設置時間=獲取時間。爲什麼?

我做了一些測試,只需插入30000條記錄,並比他們收到30000次(Redis的)。

 def redis_set(data): 
     for k, v in data.iteritems(): 
      redis_conn.set(k, v) 

    def redis_get(data): 
     for k in data.iterkeys(): 
     val = redis_conn.get(k) 

    def do_tests(num, tests): 
     # setup dict with key/values to retrieve 
     data = {'key' + str(i): 'val' + str(i)*100 for i in range(num)} 
     # run tests 
    for test in tests: 
     start = time.time() 
     print "Starting test .. %s" % (test.__name__) 
     test(data) 
     elapsed = time.time() - start 
     print "%s: %d ops in %.2f seconds : %.1f ops/sec" % (test.__name__, num, elapsed, num/elapsed) 

    tests = [redis_set, redis_get] 
    do_tests(30000, tests) 

結果

Redis的

redis_set:30000個OPS中106.21秒:282.4操作/秒

redis_get:30000個OPS中94.94秒:316.0 ops/sec

可以嗎?

回答

1

沒有任何問題。

由於Redis是單線程的,讀寫操作沒有鎖定懲罰。 GETSET都是幾個內存操作,並且都非常快。

根據您的基準,SETGET稍慢。這也是合理的,因爲SET操作需要爲新添加的項目分配內存,並且內存分配的成本高於其他內存操作。

另一方面,Mongodb的讀操作比寫操作快得多。因爲它爲讀操作做了很多優化,比如緩存。 Mongodb使用的意向鎖對讀取操作更友好,即多個讀取器可以同時從單個插槽讀取數據,而作者是獨佔的。

+0

謝謝,我期待從Redis快速讀取... – gmlvsv

+0

MongoDb非常快,因爲find()只返回遊標,而不是數據 - 對不起。我改變了這個問題 - 刪除了MongoDB測試。 – gmlvsv