public function put($key, $value, $ttl = null)
    {
        $k = $this->hash($key);
        if (isset($this->cache[$k])) {
            $item = $this->cache[$k];
            $item->setValue($value);
            if ($ttl !== null) {
                $item->expire = microtime(true) + $ttl;
            }
            return $item;
        }
        $item = new Item($value);
        if ($ttl !== null) {
            $item->expire = microtime(true) + $ttl;
        }
        $this->cache[$k] = $item;
        $s = sizeof($this->cache);
        if ($s > $this->maxCacheSize + $this->capWindow) {
            uasort($this->cache, $this->sorter);
            for (; $s > $this->maxCacheSize; --$s) {
                array_pop($this->cache);
            }
        }
        return $item;
    }