在OpenStack中除了使用数据库对云平台所产生的数据进行持久化外,还需要对一些常用的数据或状态进行缓存。而oslo.cache便通过dogpile.cache库实现了一个缓存机制为OpenStack其他组件提供缓存。目前,oslo.cache支持多种缓存机制,包括Memcache、etcd 3.x、MongoDB、dictionary等。本文将详细介绍oslo.cache提供的缓存机制与常用的使用方法。
1 dogpile.cache库
dogpile.cache是一个缓存API,它为各种类型的缓存后端提供了一个通用的接口;另外,它还提供了API钩子,可以将这些不同的缓存后端与dogpile库提供的锁机制结合使用。由于本文重点介绍oslo.cache,所以不对dogpile.cache库做深入展开,有兴趣的同学可以参考dogpile.cache文档。本文只对dogpile.cache中提供的通用接口进行介绍。
首先,dogpile.cache封装了CacheValue类用来保存一个缓存数据,该类中包含两个属性:payload属性,载荷,即缓存保存的数据;metadata属性,即dogpile.cache的元数据。所有通过dogpile.cache库进行缓存的数据都会被封装成CacheValue类的实例化对象。
CacheBackend类是dogpile.cache为不同缓存后端提供的一个通用的缓存接口,该接口为不同类型的缓存后端,如Memcache等提供了统一的接口,程序员在使用时只需要为该类添加实现即可实现读写缓存等操作。该接口主要提供了一下几个属性和方法:
- key_mangler属性:表示一个key的压缩函数,可能是空,也可能声明为一个普通的实例方法。
- set(key, value):缓存一个值,key表示这个值的关键字,value代表一个具体的CacheValue对象。
- set_multi(mapping):缓存多个值,mapping是一个字典类型的值。
- get(key):从缓存中获取一个值,返回一个CacheValue对象,如果指定的key找不到对应的值,则返回一个NoValue类型的对象,表示空。
- get_multi(keys):从缓存中获取多个值。
- get_mutex(key):为给定的键返回一个可选的互斥锁对象,该对象需要提供两个方法:加锁acquire()和释放锁release()。
- delete(key):从缓存中删除一个值。
- delete_multi(keys):从缓存中删除多个值。
2 oslo.cache支持的后端缓存机制
- oslo.cache.backend.memcache_pool:该模块提供了Memcache缓存池支持,首先实现了Memcache缓存连接池ConnectionPool,然后实现了PooledMemcachedBackend类对Memcache缓存连接池进行读写等操作。
- oslo_cache.backend.etcd3gw:该模块提供了etcd 3.x版本的缓存操作,实现了Etcd3gwCacheBackend类。
- oslo_cache.backend.mongo:该模块通过MongoCacheBackend类实现了使用MongoDB进行缓存的