概述
数据库缓存是一种性能增强技术,它将频繁访问的数据存储在Shard服务器内存中,减少对磁盘存储的依赖,从而大大提升查询响应速度。
缓存类型
嬴图支持以下的缓存类型:
服务器的缓存配置
图缓存、点缓存和边缓存的默认启用状态、占用内存大小以及达到最大内存时的逐出策略等可在每台Shard服务器配置文件的ComputeEngine
部分进行配置,相关配置项有:
engine_type
(default
或speed
)enable_graph_cache
graph_cache_size
graph_cache_bucket_number
graph_cache_max_memory_policy
enable_node_cache
enable_edge_cache
node_cache_size
edge_cache_size
缓存预热
上述Shard服务器配置中的ComputeEngine > engine_type
设置为speed
时,支持缓存预热,就是在使用数据库进行查询前,将数据预先加载至缓存中。如何预热
如果没有进行预热,相关数据只有在首次被查询访问时,才会加载到缓存中,因此第一次的查询无法使用缓存。
清除缓存
缓存数据存储在内存中,在服务器重启或手动清除时会被清除。
查看缓存状态
使用语句cache.<cacheType>.status()
可以查看所有shard服务器上某类缓存的状态。
// 查看图缓存状态
cache.graph.status()
// 查看点缓存状态
cache.node.status()
// 查看边缓存状态
cache.edge.status()
语句返回_cache_shard_1
,_cache_shard_2
等表格。每个_cache_shard_<N>
表包含ID为<N>
的分片下指定缓存类型的信息,包含以下字段:
字段 |
描述 |
---|---|
status |
某类缓存的当前状态,包括On 和Off |
cache_size |
某类缓存的分配大小(单位:MB),即服务器配置中的graph_cache_size 、node_cache_size 或edge_cache_size |
开启缓存
使用语句cache.<cacheType>.turnOn()
可以为所有shard服务器开启指定类型缓存。该操作以作业形式进行,稍后可使用show().job(<id?>)
确认是否开启成功。
请注意,服务器重启后,缓存状态会恢复成服务器配置中enable_graph_cache
、enable_node_cache
和enable_edge_cache
的设置。
// 为所有图集的所有主副本开启图缓存
cache.graph.turnOn()
// 为所有图集的所有主副本和从副本开启图缓存
cache.graph.turnOn({followers: true})
// 为所有图集的所有主副本开启点缓存
cache.node.turnOn()
// 为所有图集的所有主副本和从副本开启点缓存
cache.node.turnOn({followers: true})
// 为所有图集的所有主副本开启边缓存
cache.edge.turnOn()
// 为所有图集的所有主副本和从副本开启边缓存
cache.edge.turnOn({followers: true})
关闭缓存
使用语句cache.<cacheType>.turnOff()
可以为所有shard服务器关闭指定类型缓存。
请注意,服务器重启后,缓存状态会恢复成服务器配置中enable_graph_cache
、enable_node_cache
和enable_edge_cache
的设置。
// 关闭所有图集的所有主副本的图缓存
cache.graph.turnOff()
// 关闭所有图集的所有主副本和从副本的图缓存
cache.graph.turnOff({followers: true})
// 关闭所有图集的所有主副本的点缓存
cache.node.turnOff()
// 关闭所有图集的所有主副本和从副本的点缓存
cache.node.turnOff({followers: true})
// 关闭所有图集的所有主副本的边缓存
cache.edge.turnOff()
// 关闭所有图集的所有主副本和从副本的边缓存
cache.edge.turnOff({followers: true})
预热
如果支持预热,使用语句cache.<cacheType>.warmup()
可将数据从当前图集加载到缓存中。预热操作以作业形式执行,稍后可使用show().job(<id?>)
确认预热是否完成。该操作会消耗内存,且只能在相应类型缓存开启时执行。
// 将图拓朴加载到主副本的缓存中
cache.graph.warmup()
// 将图拓朴加载到主副本和从副本的缓存中
cache.graph.warmup({followers: true})
// 将完成LTE操作的点属性加载到主副本的缓存中
cache.node.warmup()
// 将完成LTE操作的点属性加载到主副本和从副本的缓存中
cache.node.warmup({followers: true})
// 将完成LTE操作的边属性加载到主副本的缓存中
cache.edge.warmup()
// 将完成LTE操作的边属性加载到主副本和从副本的缓存中
cache.edge.warmup({followers: true})
清除缓存
使用语句cache.<cacheType>.clear()
可以清除当前图集的缓存。该操作可以释放内存。
// 清除主副本缓存中的图拓朴 Clears graph topology from cache for the leader replica
cache.graph.clear()
// 清除主副本和从副本缓存中的图拓朴
cache.graph.clear({followers: true})
// 清除主副本缓存中所有完成LTE操作的点属性
cache.node.clear()
// 清除主副本和从副本缓存中所有完成LTE操作的点属性
cache.node.clear({followers: true})
// 清除主副本缓存中所有完成LTE操作的边属性
cache.edge.clear()
// 清除主副本和从副本缓存中所有完成LTE操作的边属性
cache.edge.clear({followers: true})
LTE
LTE(Load to Engine)操作标记要缓存的点或边属性。当一个属性不再需要缓存时,可以执行UFE(Unload from Engine)操作将其卸载。卸载后的属性可能临时保留在缓存中,随后才被清除或逐出,但不会被查询访问。
使用LTE()
语句对属性执行LTE。LTE操作以作业形式进行,稍后可使用show().job(<id?>)
确认操作是否成功。
LTE().node_property(@member._id)
LTE().edge_property(@transfer.amount)
使用UFE()
语句对属性执行UFE。
UFE().node_property(@member._id)
UFE().edge_property(@transfer.amount)