PHP Classes

CacheOne: Store and retrieve data in groups using Redis

Recommend this page to a friend!
     
  Info   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2025-07-28 (Less than 1 hour ago) RSS 2.0 feedNot yet rated by the usersTotal: 104 All time: 9,753 This week: 455Up
Version License PHP version Categories
cacheone 1.0.2GNU Lesser Genera...5Networking, PHP 5, Cache
Description 

Author

This package can store and retrieve data in groups using Redis.

It can connect to a Redis instance and store data associated to given values within a given group specified by name.

The package can also invalidate data stored with given keys or even invalidate all data in a given group of keys.

Innovation Award
PHP Programming Innovation award nominee
December 2018
Number 10
Caching frequently accessed data is an important measure to get more performance from a software system.

Redis is a fast storage system that can be used to cache data.

This package not only can store and retrieve data to cache using Redis, but it can also clean up whole groups of cached data at once thus making it easy to cleanup specific sets of cached data after it is no longer needed.

Manuel Lemos
Picture of Jorge Castro
  Performance   Level  
Name: Jorge Castro <contact>
Classes: 34 packages by
Country: Chile Chile
Age: 49
All time rank: 12323 in Chile Chile
Week rank: 13 Up1 in Chile Chile Up
Innovation award
Innovation award
Nominee: 14x

Winner: 2x

Details

CacheOne

CacheOne is a cache class of service for php. It supports Redis, Memcache, PDO and/or APCU.

Unlikely other cache libraries, this library is based in group (optional). So it's suitable to invalidate a single key or an entire group of elements.

Packagist Total Downloads [Maintenance]() [composer]() [php]() [php]() [CocoaPods]()

Example

use eftec\CacheOne;
include "vendor/autoload.php"; // composer's autoload
$cache=new CacheOne("redis","127.0.0.1","",6379);

$cacheValue=$cache->get('','countries'); // read the cache (if any) otherwise false
if($cacheValue===false) {
    echo "generating a new list of countries..<br>";
    $countries=['USA','Canada','Japan','Chile'];
    $cache->set('','countries',$countries,500); // store into the cache for 500 seconds.
} else {
    echo "read from cache<br>";
    $countries=$cacheValue;
}
var_dump($countries);

Table of Contents

<!-- TOC --> * CacheOne * Example * Table of Contents * Definitions * Creating a new instance of CacheOne * Storing a value * Getting a value * setDefaultTTL * Pushing and Popping values form an array

* push
* unshift
* pop
* shift

* invalidate a key * invalidate a group * invalidate all * setSerializer($serializer) * getSerializer(); * Select a database (Redis/PdoOne) * CLI

* Example REDIS

Definitions

Creating a new instance of CacheOne

Creates a new connection using Redis (Redis is an on memory cache library)

use eftec\CacheOne;
include "../vendor/autoload.php";
$cache=new CacheOne("redis","127.0.0.1","",6379);

Creates a new connection using apcu (APCU is an extension for PHP to cache content)

use eftec\CacheOne;
include "../vendor/autoload.php";
$cache=new CacheOne("apcu");

Creates a new connection using PdoOne (PdoOne is a library to connect to the database using PDO)

use eftec\PdoOne;
use eftec\CacheOne;
include "../vendor/autoload.php";

$pdo=new PdoOne('mysql','127.0.0.1','root','abc.123','travisdb',false,null,1,'KVTABLE');
$pdo->logLevel=3; // optional, if you want to debug the errors. 
$pdo->open();
// $pdo->createTableKV();  // you should create the key-value table if it doesn't exist.
$cache=new CacheOne("pdoone"); // the instance $pdo is injected automatically into CacheOne.

or you could use to create a PdoOne instance:

$cache=new CacheOne(
  "pdoone",
  ['mysql','127.0.0.1','root','abc.123','travisdb',false,null,1,'KVTABLA']
  ); 

Creates a new connection using memcache (Memcache is an old, but it is still a functional memory cache server)

use eftec\CacheOne;
include "../vendor/autoload.php";
$cache=new CacheOne("memcache","127.0.0.1"); // minimum configuration
$cache=new CacheOne("memcache","127.0.0.1",11211,'schema'); // complete configuration

Creates a new connection using the class DocumentOne (file system)

This example requires the library eftec/documentstoreone

use eftec\CacheOne;
include "../vendor/autoload.php";
$cache=new CacheOne("documentone",__DIR__."/base","schema"); // folder /base/schema must exists

The library DocumentStoreOne works with concurrency.

or creating a new connection, using redis, memcache, apcu or documentone (it takes the first available)

use eftec\CacheOne;
include "../vendor/autoload.php";
$cache=new CacheOne("auto");

Storing a value

> function set($group, $key, $value, $duration = 1440): bool

It stores a value inside a group and a key. It returns false if the operation failed.

> Note: The duration is ignored by "documentone"

$cache->set("group","key1","hello world",500);
$cache->set("group","key2","hola mundo",500);

Group is optional, and it could be used if we need to invalidate (delete) an entire group.

Getting a value

> function get($group, $key, $defaultValue = false)

It gets a value stored in a group (optional) and key. If the value is not found then it returns false. Note: a false value could be a valid value.

$result=$cache->get("group","key1");
$result=$cache->get("","key2");
$result=$cache->get("","key2","not found"); // if not key2 (groupless) then it returns not found 

setDefaultTTL

$result=$cache->setDefaultTTL(50); // it sets the default time to live. "documentone" one uses it.
$result=$cache->getDefaultTTL();   // it gets the time to live

Pushing and Popping values form an array

push

It pushes (adds) a new value at the end of the array. If the array does not exist, then it is created a new array. This command allows to limit the numbers of elements of the array.

Syntax: > push($groups, $key, $value, $duration = null, $limit = 0, $limitStrategy = 'shiftold') : bool

  • $Limit is used to limit the number maximum of elements of the array, if zero, then it does not limit the elements.
  • $LimitStrategy is used to determine what to do when we are adding a new element and the limit has been reached, shiftold removes the first element of the array, nonew does not allow to add a new element, popold removes the latest element of the array (if the limit has been reached).
// cart could be [1,2,3]
$cache->push('','cart',4,2000); // it adds a new element into the cart unlimitely cart is [1,2,3,4]
$cache->push('','cart',5,2000,4,'shiftold'); // it limits the cart to 20 elements, pop old item if req. cart is [2,3,4,5]
$cache->push('','cart',6,2000,4,'nonew'); // if the cart has 20 elements, then it doesn't add $item. cart now is [2,3,4,5]

unshift

It unshift (add) a new value at the beginner of the array. If the array does not exist, then it is created a new array. This command allows to limit the numbers of elements of the array.

Syntax:

> unshift($groups, $key, $value, $duration = null, $limit = 0, $limitStrategy = 'popold') : bool

  • $Limit is used to limit the number maximum of elements of the array, if zero, then it does not limit the elements.
  • $LimitStrategy is used to determine what to do when we are adding a new element and the limit has been reached, shiftold removes the first element of the array, nonew does not allow to add a new element, popold removes the latest element of the array (if the limit has been reached).
// cart could be [1,2,3]
$cache->unshift('','cart',4,2000); // it adds a new element into the cart unlimitely cart is [4,1,2,3]
$cache->unshift('','cart',5,2000,4,'shiftold'); // it limits the cart to 20 elements, pop old item if req. cart is [2,3,4,5]
$cache->unshift('','cart',6,2000,4,'nonew'); // if the cart has 20 elements, then it doesn't add $item. cart now is [2,3,4,5]

pop

It pops (extract) a value at the end of the array. If the value does not exist then it returns $defaultValue The original array is modified removing the last element of the array.

Syntax:

> pop($group, $key, $defaultValue = false, $duration = null) : mixed

// cart could be [1,2,3,4];
$element=$this->pop('','cart'); // now cart is [1,2,3] and $element is 4

shift

It shifts (extract) a value at the beginner of the array. If the value does not exist then it returns $defaultValue The original array is modified removing the last element of the array.

Syntax:

> pop($group, $key, $defaultValue = false, $duration = null) : mixed

// cart could be [1,2,3,4];
$element=$this->shift('','cart'); // now cart is [2,3,4] and $element is 1

invalidate a key

> function invalidate($group = '', $key = ''): bool

It invalidates a specific key. If the operation fails, then it returns false

$cache->invalidate("group","key1"); // invalidate a key inside a group
$cache->invalidate("","key1"); // invalidate a key without a group.

invalidate a group

> invalidateGroup($group): bool

It invalidates every key(s) inside a group of groups. It also cleans the catalog of the group and sets it to an empty array.

$cache->invalidateGroup("group"); // invalidate all keys inside group
$cache->invalidateGroup(["group1","group2"]); // invalidate all key inside group1 and group2

invalidate all

> invalidateAll()

It invalidates all cache.

In redis, it deletes the current schema. If not schema, then it deletes all Redis

In memcached and <b>apcu</b>, it deletes all cache

In <b>documentone</b> it deletes the content of the database-folder

$cache->invalidateAll(); 

setSerializer($serializer)

It sets how the values are serialized. By default, it's PHP.

$cache->setSerializer('php'); // set the serializer to php (default value). It is fastest but it uses more space.
$cache->setSerializer('json-array'); // set the serializer to json-array. It uses fewer space than PHP however it is a bit slower.
$cache->setSerializer('json-object'); // set the serializer to json-object.
$cache->setSerializer('none'); // set the serializer to none (the value must be serialized)
 

getSerializer();

Get then how the values are serialized.

$type=$cache->getSerializer(); // get php,json-array,json-object or none

Select a database (Redis/PdoOne)

> select($dbindex)

It selects a different database. By default, the database is 0.

$cache->select(1);
$cache->select('table'); // PdoOne

CLI

This library also has an interactive CLI.In this CLI, you can create the configuration, test it, load and save. example/cli1.jpg

To open it, you must run the next script:

php vendor/bin/cacheonecli
# or (windows)
vendor/bin/cacheonecli.bat

Example REDIS

  • Open the CLI
  • go to menu cache
  • select redis
  • select yes
  • and select the default information
  • Once it is done, select test to test the connection

example/cliredis.jpg

  • and finally, save the configuration (select save)
  • select yes
  • select the filename (c1 in this example)

example/cliredis2.jpg

The configuration will be saved as: c1.config.php. It is a configuration file that you can include or copy and paste in your code

<?php // eftec/CliOne(1.28) PHP configuration file (date gen: 2023-04-08 10:19). DO NOT EDIT THIS FILE 
/
 * It is a configuration file
 */
$cacheOneConfig=[
    'type' => 'redis',
    'cacheserver' => '127.0.0.1',
    'schema' => '',
    'port' => '6379',
    'user' => NULL,
    'password' => NULL,
];

example

include "c1.config.php";
$cache=CacheOne::factory($cacheOneConfig); 

Version

  • 2.20 (2024-12-30) * now compatible with php 8.4 without warnings.
  • 2.19 (2024-12-08) * [apcu] solved a problem with get() and the value is not found. It returned false instead of the default value.
  • 2.18 (2024-03-02) * Updating dependency to PHP 7.4. The extended support of PHP 7.2 ended 3 years ago. * Added more type hinting in the code.
  • 2.17 * [composer.json] updated dependency * [CacheOneCli] now loads a PdoOneCli instance if avaible
  • 2.16.1 2023-04-08 * [composer.json] added cacheonecli to the /bin * [CacheOne] added method factory() * [CacheOneCli] configuration now uses the variable $cacheOneConfig
  • 2.16 2023-04-08 * CacheOneCli This version breaks dependency with PdoOne. Now, it is optional.
  • 2.15 2023-04-07 * [CacheOneCli] Updated to 1.2 * [CacheOne] updated the constructor, so it allows to pass the configuration of PdoOne as an array
  • 2.14 * updated dependencies.
  • 2.13 [redis]* fixed a problem with redis and get()
  • 2.12.4 [fixed]* solved a problem when the cache is not found.
  • 2.12.3 [fixed]* solved a problem with invalidateCache()
  • 2.12 2022-06-12 [fixed]* CacheOne now it could be injected correctly in any case. [new][redis]* In Redis, the $schema is used to set the database (if numeric), or to prefix the values.
  • 2.11 2022-03-20 [fixed]* added more type "hinting" (type validation) [new]* It allows to obtain an instance (if any) of CacheOne using the static method CacheOne::instance() [new]* It allows to obtain an instance of the provider (PdoOne, DocumentStoreOne, Redis, Memcache) $this->getInstanceProvider()
  • 2.10 2022-03-15 [new]* method getRenew() that get a value and renews its duration. [update]* Provider DocumentOne now works with TTL.
  • 2.9 2022-03-12 * Cleared some references and added type hinting to the code. * In Redis: invalidateAll() does not delete all the server if there is a schema. * in PdoOne: set() does not crash in PHP 8.1 if the catalog is null.
  • 2.8 2022-02-10 * Added a new provider PdoOne (Pdo / Database). * Dropped support for PHP 7.1 and lower. If you want to use an old version of this library then you can stay with the version 2.7.
  • 2.7 2021-06-13 * method get() used by provider, never needed the family/group, so it is removed. It is the last version for 2.7
  • 2.6.1 2021-06-12 * changed dependencies in composer.json
  • 2.6 2021-06-12 - added the methods push(), pop(), shift() and unshift()
  • 2.5 2020-09-20 Separated provider in different classes. Now it also allows to use the file system (DocumentOne*).
  • 2.4 2020-09-13 * The code was refactored.
  • 2.3.1 * fix: The catalog is always stored as an array, even if the serializer is json-object
  • 2.3 * Added method setSerializer() and getSerializer(). By default, CacheOne uses PHP for serialization. With this feature, it is possible to serialize using json or none
  • 2.2.2 2020-03-13 * Now the duration of the catalog is always laster than the duration of the key * Tested the duration and expiration of the cache. * phpunit now is part of "require-dev" instead of "require"
  • 2.2.1 2020-03-12 * Internal: key names are not store inside the group. The group is store inside the schema * Internal: The catalog has a duration defined by $cache->catDuration (seconds)
  • 2.2 2020-03-12 * wrappers getCache(),setCache(),invalidateCache()
  • 2.1 2020-03-12 * Unit test * get() has a default value $defaultValue * new method invalidateAll()
  • 2.0 2020-03-12 Updated the whole class. Now it works as a single class.
  • 1.4.2 2019-07-30 Added select() to select a different database index. It also adds timeout for the constructor
  • 1.4.1 2018-08-15 Added an internal function that obtains the id.
  • 1.4 2018-09-05 Fixed the groups
  • 1.3.1 2018-06-09 First published version

License

Dual license, Commercial and MIT License. Copyright Jorge Castro Castillo


  Files folder image Files (16)  
File Role Description
Files folder imagelib (3 files, 1 directory)
Files folder imagetest (2 files, 1 directory)
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file LICENSE Lic. License text
Accessible without login Plain text file phpunit.xml Data Auxiliary data
Accessible without login Plain text file README.md Doc. Documentation

  Files folder image Files (16)  /  lib  
File Role Description
Files folder imageprovider (6 files)
  Plain text file CacheOne.php Class Class source
  Accessible without login Plain text file cacheonecli Example Example script
  Plain text file CacheOneCLi.php Class Class source

  Files folder image Files (16)  /  lib  /  provider  
File Role Description
  Plain text file CacheOneProviderAPCU.php Class Class source
  Plain text file CacheOneProviderDocumentOne.php Class Class source
  Plain text file CacheOneProviderMemcache.php Class Class source
  Plain text file CacheOneProviderPdoOne.php Class Class source
  Plain text file CacheOneProviderRedis.php Class Class source
  Plain text file ICacheOneProvider.php Class Class source

  Files folder image Files (16)  /  test  
File Role Description
Files folder imagemem (1 directory)
  Accessible without login Plain text file bootstrap.php Aux. Auxiliary script
  Plain text file CacheOneTest.php Class Class source

  Files folder image Files (16)  /  test  /  mem  
File Role Description
Files folder imageunittest (1 file)

  Files folder image Files (16)  /  test  /  mem  /  unittest  
File Role Description
  Accessible without login Plain text file dummy.txt Doc. Documentation

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads Download Rankings  
 100%
Total:104
This week:0
All time:9,753
This week:455Up