宏哥为什么不用 memcached 这些烂玩意做一般缓存

宏哥 发布于 2013/12/10 09:35
阅读 209
收藏 1

算法如下

做两级目录 24*24/24*24/ 正好可以支持 331776 个目录, 每个目录下1级目录不会超过576个子目录。

对于要缓存信息, 就以文件放此 目录

如果需要放内存, 可以手工创建一个内存文件, 把目录放此即可。

代码如下:

/**
	 * Return 2 Tiers Dir from Cache Dir 
	 * Could be overwrite by child
	 *
	 * @param String $cache_dir, Base dir of Cache
	 * @param String $file, The cache filename
	 *
	 * @return String , Full path of file
	 */
	protected static function getCachePath($cache_dir,$file){
		return $cache_dir.DIRECTORY_SEPARATOR.$file[0].$file[1].DIRECTORY_SEPARATOR.
			$file[2].$file[3].DIRECTORY_SEPARATOR;
	}



 
public static function cache($name, $data = NULL, $lifetime = NULL,$cache_dir = NULL)
	{
		// Cache file is a hash of the name
		$file = sha1($name).'.txt';

		if($cache_dir == NULL)
		{
			$cache_dir = Pexcel::$cache_dir;
		}

		// Cache directories are split by keys to prevent filesystem overload
		//$dir = Pexcel::$cache_dir.DIRECTORY_SEPARATOR.$file[0].$file[1].DIRECTORY_SEPARATOR.
		//	$file[2].$file[3].DIRECTORY_SEPARATOR;
		$dir = self::getCachePath(Pexcel::$cache_dir,$file);

		if ($lifetime === NULL)
		{
			// Use the default lifetime
			$lifetime = Pexcel::$cache_life;
		}

		if ($data === NULL)
		{
			if (is_file($dir.$file))
			{
				if ((time() - filemtime($dir.$file)) < $lifetime)
				{
					// Return the cache
					try
					{
						return unserialize(file_get_contents($dir.$file));
					}
					catch (Exception $e)
					{
						// Cache is corrupt, let return happen normally.
					}
				}
				else
				{
					try
					{
						// Cache has expired
						unlink($dir.$file);
					}
					catch (Exception $e)
					{
						// Cache has mostly likely already been deleted,
						// let return happen normally.
					}
				}
			}

			// Cache not found
			return NULL;
		}

		if ( ! is_dir($dir))
		{
			// Create the cache directory
			mkdir($dir, 0777, TRUE);

			// Set permissions (must be manually set to fix umask issues)
			chmod($dir, 0777);
		}

		// Force the data to be a string
		$data = serialize($data);

		try
		{
			// Write the cache
			return (bool) file_put_contents($dir.$file, $data, LOCK_EX);
		}
		catch (Exception $e)
		{
			// Failed to write cache
			return FALSE;
		}
	}



加载中
0
sniperBlank
sniperBlank
 你这个仅仅是文件缓存而已。
0
乌龟壳
乌龟壳
问:多台web服务器如何共享缓存。
0
宏哥
宏哥

引用来自“郭煜”的答案

问:多台web服务器如何共享缓存。

SAN, 这是集中式

不共享 -- 这是分布式

不共享的情况下, 需要将 key 值增加前缀 , 作为机器 标识。

对cache 的资源,或者请求, 按照hash值分开处理

乌龟壳
乌龟壳
对SAN不熟悉,不过对于NFS,这样也不错,NFS也是用libevent开发的,学到东西了。看来很多东西确实没必要提前考虑那么多,不一定所有的都要专项的解决方案。
返回顶部
顶部