public function testGetTtlInSecondsException()
 {
     $now = Carbon::now();
     $this->setExpectedException(Exception::class);
     TimeTools::getTtlInSeconds($now->subMinute(2));
     $this->setExpectedException(Exception::class);
 }
 public function serialize($prefix, array $data, $minutes, array $tags)
 {
     $seconds = TimeTools::getTtlInSeconds($minutes);
     $tags = $this->tagVersions->getActualVersionsFor($tags);
     $data = ArrayTools::addPrefixToArrayKeys($prefix, $data);
     $data = array_map(function ($value) use($seconds, $tags) {
         return (string) CacheItem::encode($this->isSimpleType($value) ? $value : $this->coderManager->encode($value), $seconds, $tags);
     }, $data);
     return $data;
 }
 /**
  * @param array $values
  * @param int   $minutes
  * @param bool  $nxOnly Only set non-existent keys
  *
  * @throws \Predis\Response\ServerException
  * @throws \Predis\Transaction\AbortedMultiExecException
  */
 public function mset(array $values, $minutes, $nxOnly = false)
 {
     $values = $this->serializer->serialize($this->prefix, $values, $minutes, $this->tags);
     // Executing MULTI only if we transfer more than one item
     $redis = count($values) > 1 ? $this->connection()->transaction() : $this->connection();
     //Building MSET command with arguments we need
     $arguments = ['key' => '', 'value' => ''];
     if (0 !== $minutes) {
         $arguments['ex'] = 'EX';
         // Arg #3
         $arguments['seconds'] = TimeTools::getTtlInSeconds($minutes);
         // Arg #4
     }
     if ($nxOnly) {
         $arguments['nx'] = 'NX';
         // Arg #5
     }
     foreach ($values as $key => $value) {
         $arguments['key'] = $key;
         $arguments['value'] = $value;
         call_user_func_array([$redis, 'set'], $arguments);
     }
     // Executing Redis EXEC if needed
     if (count($values) > 1) {
         $redis->execute();
     }
 }