Implement cache key prefixing (as suggested in #1197) and update the Cache docs
diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php
index 4395cf4..ce71445 100644
--- a/system/libraries/Cache/Cache.php
+++ b/system/libraries/Cache/Cache.php
@@ -41,7 +41,7 @@
 	 *
 	 * @var array
 	 */
-	protected $valid_drivers 	= array(
+	protected $valid_drivers = array(
 		'cache_apc',
 		'cache_dummy',
 		'cache_file',
@@ -67,16 +67,23 @@
 	/**
 	 * Fallback driver
 	 *
-	 * @param string
+	 * @var string
 	 */
 	protected $_backup_driver = 'dummy';
 
 	/**
+	 * Cache key prefix
+	 *
+	 * @var	string
+	 */
+	public $key_prefix = '';
+
+	/**
 	 * Constructor
 	 *
 	 * Initialize class properties based on the configuration array.
 	 *
-	 * @param	array
+	 * @param	array	$config = array()
 	 * @return	void
 	 */
 	public function __construct($config = array())
@@ -96,12 +103,11 @@
 			}
 		}
 
-		if (isset($config['backup']))
+		isset($config['key_prefix']) AND $this->key_prefix = $config['key_prefix'];
+
+		if (isset($config['backup']) && in_array('cache_'.$config['backup'], $this->valid_drivers))
 		{
-			if (in_array('cache_'.$config['backup'], $this->valid_drivers))
-			{
-				$this->_backup_driver = $config['backup'];
-			}
+			$this->_backup_driver = $config['backup'];
 		}
 
 		// If the specified adapter isn't available, check the backup.
@@ -129,12 +135,12 @@
 	 * Look for a value in the cache. If it exists, return the data
 	 * if not, return FALSE
 	 *
-	 * @param	string
-	 * @return	mixed	value that is stored/FALSE on failure
+	 * @param	string	$id
+	 * @return	mixed	value matching $id or FALSE on failure
 	 */
 	public function get($id)
 	{
-		return $this->{$this->_adapter}->get($id);
+		return $this->{$this->_adapter}->get($this->key_prefix.$id);
 	}
 
 	// ------------------------------------------------------------------------
@@ -142,14 +148,14 @@
 	/**
 	 * Cache Save
 	 *
-	 * @param	string	Unique Key
-	 * @param	mixed	Data to store
-	 * @param	int	Length of time (in seconds) to cache the data
-	 * @return	bool	true on success/false on failure
+	 * @param	string	$id		Cache ID
+	 * @param	mixed	$data		Data to store
+	 * @param	int	$ttl = 60	Cache TTL (in seconds)
+	 * @return	bool	TRUE on success, FALSE on failure
 	 */
 	public function save($id, $data, $ttl = 60)
 	{
-		return $this->{$this->_adapter}->save($id, $data, $ttl);
+		return $this->{$this->_adapter}->save($this->key_prefix.$id, $data, $ttl);
 	}
 
 	// ------------------------------------------------------------------------
@@ -157,12 +163,12 @@
 	/**
 	 * Delete from Cache
 	 *
-	 * @param	mixed	unique identifier of the item in the cache
-	 * @return	bool	true on success/false on failure
+	 * @param	string	$id	Cache ID
+	 * @return	bool	TRUE on success, FALSE on failure
 	 */
 	public function delete($id)
 	{
-		return $this->{$this->_adapter}->delete($id);
+		return $this->{$this->_adapter}->delete($this->key_prefix.$id);
 	}
 
 	// ------------------------------------------------------------------------
@@ -170,7 +176,7 @@
 	/**
 	 * Clean the cache
 	 *
-	 * @return	bool	false on failure/true on success
+	 * @return	bool	TRUE on success, FALSE on failure
 	 */
 	public function clean()
 	{
@@ -182,8 +188,8 @@
 	/**
 	 * Cache Info
 	 *
-	 * @param	string	user/filehits
-	 * @return	mixed	array on success, false on failure
+	 * @param	string	$type = 'user'	user/filehits
+	 * @return	mixed	array containing cache info on success OR FALSE on failure
 	 */
 	public function cache_info($type = 'user')
 	{
@@ -195,12 +201,12 @@
 	/**
 	 * Get Cache Metadata
 	 *
-	 * @param	mixed	key to get cache metadata on
-	 * @return	mixed	return value from child method
+	 * @param	string	$id	key to get cache metadata on
+	 * @return	mixed	cache item metadata
 	 */
 	public function get_metadata($id)
 	{
-		return $this->{$this->_adapter}->get_metadata($id);
+		return $this->{$this->_adapter}->get_metadata($this->key_prefix.$id);
 	}
 
 	// ------------------------------------------------------------------------
@@ -208,7 +214,7 @@
 	/**
 	 * Is the requested driver supported in this environment?
 	 *
-	 * @param	string	The driver to test.
+	 * @param	string	$driver	The driver to test
 	 * @return	array
 	 */
 	public function is_supported($driver)
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index 8308cd6..3d6538e 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -196,8 +196,10 @@
 	 -  Fields that have empty rules set no longer run through validation (and therefore are not considered erroneous).
 	 -  Added rule *differs* to check if the value of a field differs from the value of another field.
    -  Added support for setting :doc:`Table <libraries/table>` class defaults in a config file.
-   -  Added a Wincache driver to the :doc:`Caching Library <libraries/caching>`.
-   -  Added a Redis driver to the :doc:`Caching Library <libraries/caching>`.
+   -  :doc:`Caching Library <libraries/caching>` changes include:
+	 -  Added Wincache driver.
+	 -  Added Redis driver.
+	 -  Added a *key_prefix* option for cache IDs.
    -  :doc:`Email library <libraries/email>` changes include:
 	 -  Added custom filename to ``Email::attach()`` as ``$this->email->attach($filename, $disposition, $newname)``.
 	 -  Added possibility to send attachment as buffer string in ``Email::attach()`` as ``$this->email->attach($buffer, $disposition, $newname, $mime)``.
diff --git a/user_guide_src/source/libraries/caching.rst b/user_guide_src/source/libraries/caching.rst
index 2f06d29..8d7b4c4 100644
--- a/user_guide_src/source/libraries/caching.rst
+++ b/user_guide_src/source/libraries/caching.rst
@@ -32,6 +32,17 @@
 	
 	echo $foo;
 
+You can also prefix cache item names via the **key_prefix** setting, which is useful
+to avoid collisions when you're running multiple applications on the same environment.
+
+::
+
+	$this->load->driver('cache',
+		array('adapter' => 'apc', 'backup' => 'file', 'key_prefix' => 'my_')
+	);
+
+	$this->cache->get('foo'); // Will get the cache entry named 'my_foo'
+
 ******************
 Function Reference
 ******************
@@ -39,7 +50,7 @@
 .. php:class:: CI_Cache
 
 is_supported()
-===============
+==============
 
 	.. php:method:: is_supported ( $driver )
 
@@ -130,7 +141,7 @@
 			$this->cache->clean();
 
 cache_info()
-=============
+============
 
 	.. php:method:: cache_info ( )
 
@@ -148,7 +159,7 @@
 	
 
 get_metadata()
-===============
+==============
 
 	.. php:method:: get_metadata ( $id )
 	
@@ -166,7 +177,6 @@
 		.. note:: The information returned and the structure of the data is dependent
 			on which adapter is being used.
 
-			
 *******
 Drivers
 *******
@@ -181,7 +191,7 @@
 	$this->cache->apc->save('foo', 'bar', 10);
 
 For more information on APC, please see
-`http://php.net/apc <http://php.net/apc>`_
+`http://php.net/apc <http://php.net/apc>`_.
 
 File-based Caching
 ==================
@@ -201,20 +211,49 @@
 =================
 
 Multiple Memcached servers can be specified in the memcached.php
-configuration file, located in the application/config/ directory.
+configuration file, located in the _application/config/* directory.
 
-All of the functions listed above can be accessed without passing a
+All of the methods listed above can be accessed without passing a
 specific adapter to the driver loader as follows::
 
 	$this->load->driver('cache');
 	$this->cache->memcached->save('foo', 'bar', 10);
 
 For more information on Memcached, please see
-`http://php.net/memcached <http://php.net/memcached>`_
+`http://php.net/memcached <http://php.net/memcached>`_.
+
+WinCache Caching
+================
+
+Under Windows, you can also utilize the WinCache driver.
+
+All of the functions listed above can be accessed without passing a
+specific adapter to the driver loader as follows::
+
+	$this->load->driver('cache');
+	$this->cache->wincache->save('foo', 'bar', 10);
+
+For more information on WinCache, please see
+`http://php.net/wincache <http://php.net/wincache>`_.
+
+Redis Caching
+=============
+
+All of the methods listed above can be accessed without passing a
+specific adapter to the driver loader as follows::
+
+	$this->load->driver('cache');
+	$this->cache->redis->save('foo', 'bar', 10);
+
+.. important:: Redis may require one or more of the following options:
+	**host**, **post**, **timeout**, **password**.
+
+The Redis PHP extension repository is located at
+`https://github.com/nicolasff/phpredis <https://github.com/nicolasff/phpredis>`_.
 
 Dummy Cache
 ===========
 
 This is a caching backend that will always 'miss.' It stores no data,
 but lets you keep your caching code in place in environments that don't
-support your chosen cache.
+support your chosen cache.
\ No newline at end of file