请在Clojure 2024状态调查中分享您的想法!

欢迎!请查看关于页面了解这个服务的更多信息。

+2
ClojureScript
编辑

我正在用cljs开发一个react native应用,并将产品目录作为transit json存储在数据库中。到目前为止一切顺利,但随着圣诞节产品的上线,数据量已接近Android的6MB限制。

我曾想过使用键缓存可能会有所帮助,但我担心这会降低响应速度。

目前,为了保持UI的响应性,我将数据存储为每个产品的单个transit映射(由于js是单线程的,我需要保持反序列化和序列化的块很小,以免在用户按下按钮时处理大量数据结构)。

我认为这意味着我不能使用transit键缓存,因为重复的键直到下一个产品才会出现。

有没有什么方法可以共享键缓存 - 或者有更好的方法来减小transit json的尺寸?

1 个答案

+1
by
编辑了 by

一种方法可能是定义一个自定义产品语义类型,它由公共键+额外键组成。
https://github.com/cognitect/transit-format#extensibility

您将节省一些空间,但可能需要付出一些维护努力和额外的CPU时间(这可能是可以接受的,因为您将一次反序列化几个)。

这是使用Product只来封装产品映射的一个示例,这样您可以不必在代码库的其余部分使用记录

(ns foo
  (:require 
   [cognitect.transit :as tr])
  (:import
   [com.cognitect.transit WriteHandler]
   [java.io ByteArrayOutputStream]))

(defrecord Product [m])
(def product-tag "pro")
(def common-keys [:product/foo :product/bar :product/baz])
(def custom-writers
  {Product (reify WriteHandler
             (getVerboseHandler [_] nil)
             (stringRep [_ kw] nil)
             (tag [_ _] product-tag)
             (rep [_ p] (let [common (mapv (:m p) common-keys)
                              custom (reduce dissoc (:m p) common-keys)]
                          (into [custom] common))))})

(def custom-readers
  {product-tag (fn [rep]
                 (let [[m & common-vals] rep]
                   (merge m (zipmap common-keys common-vals))))})

(defn write [writers product]
  (let [out (ByteArrayOutputStream. 4096)
        wr  (tr/writer out :json writers)]
    (tr/write wr product)
    (.toString out)))

(write {:handlers custom-writers}
  (Product. {:product/foo 1 :product/bar 2 :product/baz 3 :custom/foo 4}))
;; "[\"~#pro\",[[\"^ \",\"~:custom/foo\",4],1,2,3]]"

(write {}
  (Product. {:product/foo 1 :product/bar 2 :product/baz 3 :custom/foo 4}))
;; "[\"^ \",\"~:m\",[\"^ \",\"~:product/foo\",1,\"~:product/bar\",2,\"~:product/baz\",3,\"~:custom/foo\",4]]"

(write {}
  {:product/foo 1 :product/bar 2 :product/baz 3 :custom/foo 4})
;; "[\"^ \",\"~:product/foo\",1,\"~:product/bar\",2,\"~:product/baz\",3,\"~:custom/foo\",4]"
...