2011-02-25 3 views
9

웹 캐시로 redis를 사용하고 있는데 이러한 activerecord 객체를 직접 redis에 저장하려고하지만 redis-rb을 사용하면 오류가 발생합니다.레일의 activerecord 객체를 재 다이얼로 저장하는 방법

나는 그것을 직렬화 할 수없는 것처럼 보인다. 나를 위해 이것을 할 수있는 lib가 있습니까? json 형식으로 serialize해야합니까?

어떤 직렬화 형식이 가장 효율적입니까?

답변

14

Redis는 문자열 (및 문자열의 몇 가지 다른 데이터 구조)을 저장합니다. 그래서 Redis 값으로 직렬화 할 수 있지만, 문자열로 끝나는 한 당신은 좋아합니다.

JSON은 너무 가볍지 만 과도하지 않고 라이브 업 그레 이드 패턴과 잘 작동하며 원래 위치에서 읽을 수 있기 때문에 아마도 가장 좋은 곳입니다. 나중에 필요에 따라 더 많은 복잡성 (예 : 압축)을 추가 할 수 있습니다. #to_json 및 #from_json은 ActiveRecord에 있습니다 (JSON을 사용하려는 경우 (상대적으로 느린 속도로 지나치게 느려서는 안되는 YAJL 또는 ilk 포함).에있는 경우 #to_xml도 있습니다.

원시 마샬링 (객체를 JSON에서 몇 K했다 LZO 압축 후 2MB의 초과 내가 마샬링 했어.)도 작동하지만 가끔 엄청 시리 잘못 할 수

정말 병목 있다면 당신을 위해, 당신은거야 자신의 목표 및 데이터 패턴으로 목표 속도 (예 : 쓰기 속도, 읽기 속도 또는 저장 공간 크기)에 대한 효율성 테스트를 실행하고 싶습니다.

+0

감사합니다. 유리, 내가 정말로 알고 싶은 걸 말 했잖아. json이 내 최선의 선택 인 것 같습니다 ... 다시 한번 감사드립니다! –

+0

지금이 작업을 시도하면 협회를 포함하는 경우 보안관이 올바른 선택입니다. 그것은 올바른 유형의 것을 복원 할 것입니다. JSON을 사용하면 연관은 단순히 해시로 저장되므로 from_json을 사용하여 복원하려고하면 오류가 발생합니다. – mahemoff

+0

http://msgpack.org/도 좋은 선택입니다. JSON보다 작고 효율적입니다. –

1
def self.set(friend_list, player_id) 
redis.set("friend_list_#{player_id}", Marshal.dump(friend_list)) == 'OK' ? friend_list : nil 
end 

def self.get(player_id) 
    friend_list = redis.get("friend_list_#{player_id}") 
    Marshal.load(friend_list) if friend_list 
end 
+0

이 JSON 나를 위해 더 편리한 것 같다,하지만 난 원수 방법에 대한 성능 시험을 할 것입니다 수 있습니다. 어쨌든 고마워. –

0

당신은 속성의 방법을 사용하여 해시 모델을 변환 한 후 mapped_hmset으로 저장

def redis_set() 
    redis.mapped_hmset("namespace:modelName:#{self.id}", self.attributes) 
end 

def redis_get(id) 
    redis.hgetall("namespace:modelName:#{id}") 
end