首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs Brotli压缩返回零点

Nodejs Brotli压缩返回零点
EN

Stack Overflow用户
提问于 2020-05-24 13:29:46
回答 1查看 396关注 0票数 2

我试图将大型数据库查询结果存储在memcached服务器中,以便更快地检索,并在使用布罗蒂在memcache中输入数据之前对数据进行压缩。

我一直试图用这样的示例对象进行测试:

代码语言:javascript
复制
//cacheserver already defined and connected
let brotli_config = {
    mode: 1, //0=regular, 1=text
    quality: 8 //1=fast .. 11=small
}

let test_key = 'paths_100'
let test_value = [
    {
        text: 'this is text',
        outlines: 'this is an outline',
        inlines: 'this is an inline'
    }
]

let compressed_in = require('brotli/compress')(JSON.stringify(test_value), brotli_config)
console.log(compressed_in) //LOG 1
cacheserver.set(test_key, compressed_in, {
        expires: 3600
    },
    function(err) {
        cacheserver.get(test_key, function(err, compressed_out) {
            console.log(compressed_out) //LOG 2

            let string_out = require('brotli/decompress')(compressed_out)
            console.log(string_out) //LOG 3
        })
    }
)

这是输出:

代码语言:javascript
复制
//LOG 1
Uint8Array(10) [
  27, 86,   0,  0, 36,
   0,  2, 177, 64, 32
]

//LOG 2
<Buffer 1b 56 00 00 24 00 02 b1 40 20>

//LOG 3
Uint8Array(87) [
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0
]

我正在将对象转换为字符串(对于性能来说可能不是一个好主意,但使用brotli模式0而不是string是不起作用的;返回null.),压缩它,将10条目uint8array存储在缓存服务器中,检索一个10字节的缓冲区,并对其进行解压缩。然而,解压缩的结果只是一个零数组。这里发生了什么事?我第一次使用这个压缩库和memcached客户端(memjs),所以我们希望了解有关如何正确使用它们的任何信息。

EN

回答 1

Stack Overflow用户

发布于 2020-05-24 17:42:48

我想出了一个解决办法(如果能加快速度,请告诉我)。非常感谢这篇博客文章澄清了nodejs对象、字符串和缓冲区之间的关系。

在将对象数据传递给brotli之前,我丢失了从字符串到缓冲区的转换。整个过程现在看起来是这样的:

代码语言:javascript
复制
let data = {/* stuff */}
let test_key = 'paths_100'
let compressed_in = require('brotli/compress')(Buffer.from(JSON.stringify(test_value),'utf-8'), brotli_config)
cacheserver.set(test_key, compressed_in, {
        expires: 3600
    },
    function(err) {
        cacheserver.get(test_key, function(err, compressed_out) {
            let data_out = JSON.parse(Buffer.from(require('brotli/decompress')(compressed_out)).toString('utf-8'))
        })
    }
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61986671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档