+ /**
+ * Delete objects expiring before a certain date.
+ *
+ * Succeed if any of the child caches succeed.
+ * @param string $date
+ * @param bool|callable $progressCallback
+ * @return bool
+ */
+ public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
+ $ret = false;
+ foreach ( $this->caches as $cache ) {
+ if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
+ $ret = true;
+ }
+ }
+
+ return $ret;
+ }
+
+ public function getMulti( array $keys, $flags = 0 ) {
+ // Just iterate over each key in order to handle all the backfill logic
+ $res = [];
+ foreach ( $keys as $key ) {
+ $val = $this->get( $key, $flags );
+ if ( $val !== false ) {
+ $res[$key] = $val;
+ }
+ }
+
+ return $res;
+ }
+
+ public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
+ return $this->doWrite(
+ $this->cacheIndexes,
+ $this->usesAsyncWritesGivenFlags( $flags ),
+ __FUNCTION__,
+ func_get_args()
+ );
+ }
+
+ public function deleteMulti( array $data, $flags = 0 ) {
+ return $this->doWrite(
+ $this->cacheIndexes,
+ $this->usesAsyncWritesGivenFlags( $flags ),
+ __FUNCTION__,
+ func_get_args()
+ );
+ }
+
+ public function incr( $key, $value = 1 ) {
+ return $this->doWrite(
+ $this->cacheIndexes,
+ $this->asyncWrites,
+ __FUNCTION__,
+ func_get_args()
+ );
+ }
+
+ public function decr( $key, $value = 1 ) {
+ return $this->doWrite(
+ $this->cacheIndexes,
+ $this->asyncWrites,
+ __FUNCTION__,
+ func_get_args()
+ );
+ }
+
+ public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) {
+ return $this->doWrite(
+ $this->cacheIndexes,
+ $this->asyncWrites,
+ __FUNCTION__,
+ func_get_args()
+ );
+ }