Skip to content

获取数据空间

存储空间隔离

当游戏服务器尝试连接指定名称的空间时:

  • 不同地图的服务器,连接到的空间不同
  • 同一地图不同服务器,连接到的空间相同
  • 编辑模式与游戏服务器连接的空间不同

方法

getDataStorage()

连接指定数据存储空间,如果不存在则创建一个新的空间。

只能在本地图使用此空间,其他地图(如副图)无法访问此空间,从而避免全局污染。

输入参数

参数必填默认值类型说明
keystring自定义的空间名称,建议全英文命名,长度不超过50个字符

返回值

类型说明
GameDataStorage数据存储空间对象

定义于 #L13420


getGroupStorage()

连接指定数据存储空间,如果不存在则创建一个新的空间。

此方法为主图和副图共同维护的数据存储空间。

输入参数

参数必填默认值类型说明
keystring自定义的空间名称,建议全英文命名,长度不超过50个字符

返回值

类型说明
GameDataStorage数据存储空间对象

定义于 #L13421

服务器维度

对每一个游戏服务器独立生效,与服务器在线玩家数正相关,同一队列中的所有API共享限制。

队列API限制
写入set
update
remove
(60 + 玩家数 * 10 )次操作 / 分钟
读取get
update
(120 + 玩家数*20)次操作/分钟

注;当前版本下,此处玩家数取固定值70。

吞吐量维度

对每一个 Key 的任意操作有吞吐量的限制。

队列API限制
写入set
update
remove
4M/min
读取get
update
25M/min

错误码

CodeStatusError Message描述
400DB_NAME_INVALIDInvalid data storage name.存储空间名为空,或不满足限制要求。
400KEY_INVALIDInvalid data key.数据键为空。
400VALUE_INVALIDInvalid data value.数据值为空。
400PARAMS_INVALIDInvalid parameters.参数不合法。
429REQUEST_THROTTLEDToo Many Requests超出操作频率限制
500SERVER_FETCH_ERRORServer network error.服务由于网络原因请求失败。
500UNKNOWNUnknown server error.未知的服务器错误。

示例代码

javascript
console.clear()

const testStorage = storage.getDataStorage('test')

async function storageExample() {
    await testStorage.set('keyNumber', 1)
    await testStorage.set('keyStr', '字符串')
    await testStorage.set('keyBoolean', false)
    await testStorage.set('keyJson', { describe: 'json内容' })

    let numberValue = await testStorage.get('keyNumber')
    let strValue = await testStorage.get('keyStr')
    let boolValue = await testStorage.get('keyBoolean')
    let jsonValue = await testStorage.get('keyJson')

    console.log(`keyNumber 的 value: ${numberValue.value}`)
    console.log(`keyStr 的 value: ${strValue.value}`)
    console.log(`keyBoolean 的 value: ${boolValue.value}`)
    console.log(`keyJson 的 value: ${JSON.stringify(jsonValue.value)}`)
    await sleep(1000)

    numberValue = await testStorage.remove('keyNumber')
    strValue = await testStorage.remove('keyStr')
    boolValue = await testStorage.remove('keyBoolean')
    jsonValue = await testStorage.remove('keyJson')

    console.log('\n==========================\n\n')
    console.log(`keyNumber 的 value: ${numberValue}`)
    console.log(`keyStr 的 value: ${strValue}`)
    console.log(`keyBoolean 的 value: ${boolValue}`)
    console.log(`keyJson 的 value: ${JSON.stringify(jsonValue)}`)
    await sleep(1000)

    await testStorage.update('keyNumber', (preData) => { return 2 })
    await testStorage.update('keyStr', (preData) => { return '被更改的字符串' })
    await testStorage.update('keyBoolean', (preData) => { return true })
    await testStorage.update('keyJson', (preData) => { return { describe: 'json内容被更改' } })

    numberValue = await testStorage.get('keyNumber')
    strValue = await testStorage.get('keyStr')
    boolValue = await testStorage.get('keyBoolean')
    jsonValue = await testStorage.get('keyJson')

    console.log('\n==========================\n\n')
    console.log(`keyNumber 的 value: ${numberValue.value}`)
    console.log(`keyStr 的 value: ${strValue.value}`)
    console.log(`keyBoolean 的 value: ${boolValue.value}`)
    console.log(`keyJson 的 value: ${JSON.stringify(jsonValue.value)}`)
    await sleep(1000)

    console.log('\n==========================\n\n')

    const queryList = await testStorage.list({
        // 分页指针,用于指定本次获取的分页起点。
        cursor: 0,
        // 分页大小,一页内的数据量,默认100。
        pageSize: 100
    })
    while (true) {
        for (let value of queryList.getCurrentPage()) {
            console.log(`${value.key} 的 value:${JSON.stringify(value.value)}`)
        }
        // 假如为最后一页,退出循环
        if (queryList.isLastPage) break
        // 翻到下一页
        await queryList.nextPage()
    }
}

storageExample()