IndexedDB는 로컬 저장소와 같은 방식으로 키-값 저장소가 아닙니다. 로컬 스토리지는 문자열 만 저장하므로 로컬 스토리지에 객체를 넣는 일반적인 접근 방식은 JSON.stringify 하는 것입니다.
myObject = {a: 1, b: 2, c: 3};
localStorage.setItem("uniq", JSON.stringify(myObject));
이것은 key로 객체를 찾는 uniq
데는 좋지만 로컬 스토리지에서 myObject의 속성을 다시 가져 오는 유일한 방법은 객체를 JSON.parse하고 검사하는 것입니다.
var myStorageObject = JSON.parse(localStorage.getItem("uniq"));
window.alert(myStorageObject.b);
로컬 저장소에 하나 또는 몇 개의 개체 만 있으면 괜찮습니다. 하지만 천 개의 객체가 있고 모두 속성 b
이 있고 b==2
. 로컬 저장소를 사용하면 전체 저장소를 반복 b
하고 각 항목을 확인해야 하므로 많은 낭비가 발생합니다.
IndexedDB를 사용하면 값에 문자열 이외의 항목을 저장할 수 있습니다 . "여기에는 DOMString 및 Date와 같은 간단한 유형과 Object 및 Array 인스턴스가 포함됩니다." 뿐만 아니라 값에 저장 한 개체의 속성에 대한 인덱스 를 만들 수 있습니다 . 따라서 IndexedDb를 사용하면 동일한 천 개의 개체를 그 안에 넣을 수 있지만 b
속성에 인덱스를 만들고이를 사용 b==2
하여 저장소의 모든 개체를 검색하는 오버 헤드없이 개체를 검색 할 수 있습니다.
적어도 그 아이디어입니다. IndexedDB API는 그다지 직관적이지 않습니다.
비동기 호출이 수행 된 것과 동일한 스레드에서 실행되는 것으로 보입니다. 이것이 UI를 차단하지 않는 방법은 무엇입니까?
비동기식은 다중 스레드와 동일하지 않으며, JavaScript는 일반적으로 다중 스레드가 아닙니다 . JS에서 수행하는 과도한 처리는 UI 차단을 최소화하려면 Web Workers를 사용해보십시오 .
indexedDB는 더 큰 저장소를 허용합니다. HTML5 스토어의 크기를 늘리는 것은 어떻습니까?
적절한 인덱싱이 없으면 크기가 커질수록 점점 느려질 것입니다.