이제 GET 테스트를 위한 프로그램을 만들 차례다. 이 프로그램은 랜덤하게 100,000개의 key를 읽어서 걸린 시간을 표준출력한다.
require 'redis'
require 'time'
class Test
@redis = nil
def initialize
@redis = Redis.new(:host=>"192.168.56.5")
end
def run num
r = Random.new
for i in (0..num)
id = r.rand(0..1000000)
s = Time.now
@redis.get "key:#{id}"
e = Time.now
puts "%8s\t%.6f " % [id, (e.to_f - s.to_f)]
end
end
end
test = Test.new
test.run 100000
100,000개의 레코드를 가진 결과 파일이 만들어졌다. 랜덤이다 보니 중복되는 key들도 있었을 텐데, 무시하기로 했다.
왼쪽은 100만, 오른쪽이 1000만이다. key의 크기에 상관없이 성능은 일정함을 알 수 있다. 1억개에 대해서도 테스트해보고 싶었는데.. 메모리가 부족해서, 포기했다.
성능 최적화
REDIS는 separate chaining hash table에 데이터를 저장한다. 따라서 시간 복잡도는 O(1 + n/k)가 된다. N은 key의 갯수, k는 버킷의 갯수다. key가 늘어나면 시간 복잡도도 커지는데, 버킷을 늘리는 것으로 성능을 최적화 할 수 있다. k를 잘 관리하면 거의 O(1)로 성능을 유지할 수 있을 것이다. 물론 공짜는 없다. 버킷을 늘린다는 것은 그 만큼 메모리를 쓰겠다는 이야기다. 공간을 희생해서 성능을 올리겠다는 이야기.
목적
테스트 환경
테스트
성능 최적화
Recent Posts
Archive Posts
Tags