Rediska News http://rediska.geometria-lab.net Rediska - PHP client for advanced key-value database Redis Added Rediska instance manager and refactored a lot <p>Last week I pushed Rediska instance manager and a lot of other changes to <a href="http://github.com/Shumkov/Rediska">github</a>.</p> <h3>Instance manager</h3> <p>There can be different components (cache, sessions and etc) in you application, which may need their own Rediska instance with specific options (namespace, servers and etc).</p> <p>Manager class is designed to store these Rediska instances. Manager can also store an array of Rediska options and Rediska instance will be created on a first request (lazy-loaded).</p> <p>There are two new options in Rediska:</p> <ul> <li><span class="pre">name</span> - instance name. It will be <span class="pre">default</span> if other is not specified</li> <li><span class="pre">addToManager</span> - whether or not to add Rediska instance to manager when it's created. Defaults to true</li> </ul> <pre class="active4d">&lt;?php <span class="LineComment"><span class="LineComment">//</span> Create 'default' instance</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(); <span class="LineComment"><span class="LineComment">//</span> Get 'default' instance from manager</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="LibraryClassType">Rediska_Manager</span><span class="Operator">::</span>get(); <span class="CommandMethod">print</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>getName(); <span class="LineComment"><span class="LineComment">#</span>=&gt; default</span> <span class="LineComment"><span class="LineComment">//</span> Create 'cache' instance</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(<span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">name</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">cache</span><span class="String">'</span></span>, <span class="String"><span class="String">'</span><span class="String">namespace</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">Cache_</span><span class="String">'</span></span>)); <span class="LineComment"><span class="LineComment">//</span> Get 'cache' instance from manager</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="LibraryClassType">Rediska_Manager</span><span class="Operator">::</span>get(<span class="String"><span class="String">'</span><span class="String">cache</span><span class="String">'</span></span>); <span class="CommandMethod">print</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>getName(); <span class="LineComment"><span class="LineComment">#</span>=&gt; cache</span> <span class="LineComment"><span class="LineComment">//</span> Add 'sessions' instance though options</span> <span class="LibraryClassType">Rediska_Manager</span><span class="Operator">::</span>add(<span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">name</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">sessions</span><span class="String">'</span></span>, <span class="String"><span class="String">'</span><span class="String">namespace</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">Sessions_</span><span class="String">'</span></span>)); <span class="LineComment"><span class="LineComment">//</span> Object created when it needed</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="LibraryClassType">Rediska_Manager</span><span class="Operator">::</span>get(<span class="String"><span class="String">'</span><span class="String">sessions</span><span class="String">'</span></span>); <span class="CommandMethod">print</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>getName(); <span class="LineComment"><span class="LineComment">#</span>=&gt; sessions</span> ?&gt; </pre> <h3>Key objects</h3> <p>I sligtly changed constructors of <span class="pre">Rediska_Key</span>, <span class="pre">Rediska_Key_List</span>, <span class="pre">Rediska_Key_Set</span>, <span class="pre">Rediska_Key_SortedSet</span>, <span class="pre">Rediska_Key_Hash</span>. Second argument became an array of options:</p> <ul> <li><span class="pre">expire</span> - Expire time</li> <li><span class="pre">expireIsTimestamp</span> - Expire time is timestamp (in seconds). For default false</li> <li><span class="pre">serverAlias</span> - Server alias or connection object</li> <li><span class="pre">rediska - Rediska instance name, Rediska object or Rediska options for new instance. <span class="pre">default</span> if not specified</li> </ul> <pre class="active4d">&lt;?php <span class="LineComment"><span class="LineComment">//</span> Create 'cache' instance</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(<span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">name</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">cache</span><span class="String">'</span></span>)); <span class="LineComment"><span class="LineComment">//</span> Create key with rediska 'cache' instance</span> <span class="Variable"><span class="Variable">$</span>cache</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska_Key_Hash</span>(<span class="String"><span class="String">'</span><span class="String">cacheKeyName</span><span class="String">'</span></span>, <span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">rediska</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">cache</span><span class="String">'</span></span>)); <span class="LineComment"><span class="LineComment">//</span> Or pass Rediska object to 'rediska' option</span> <span class="Variable"><span class="Variable">$</span>cache</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska_Key_Hash</span>(<span class="String"><span class="String">'</span><span class="String">cacheKeyName</span><span class="String">'</span></span>, <span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">rediska</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="Variable"><span class="Variable">$</span>rediska</span>)); <span class="LineComment"><span class="LineComment">//</span> Or pass Rediska option to create new instance</span> <span class="Variable"><span class="Variable">$</span>cache</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska_Key_Hash</span>(<span class="String"><span class="String">'</span><span class="String">cacheKeyName</span><span class="String">'</span></span>, <span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">rediska</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">namespace</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">Cache_</span><span class="String">'</span></span>))); ?&gt; </pre> <h3>Zend Framework integration</h3> <p>Now you can specify a few Rediska instances in a <span class="pre">application.ini</span> and you can reference their names in other resources configuration.</p> <div class="pre" style="padding: 10px;overflow-x: auto;white-space:pre">; Initialize Rediska cache instance resources.rediska.instances.cache.namespace = 'Cache_' resources.rediska.instances.cache.servers.0.host = 127.0.0.1 resources.rediska.instances.cache.servers.0.port = 6379 resources.rediska.instances.cache.servers.1.host = 127.0.0.2 resources.rediska.instances.cache.servers.1.port = 6379 ; Initialize Rediska sessions instance resources.rediska.instances.sessions.namespace = 'Sessions_' ; Initialize cache resources.cachemanager.redis.frontend.name = Core resources.cachemanager.redis.backend.name = Rediska_Zend_Cache_Backend_Redis ; Reference to Rediska 'cache' instance resources.cachemanager.redis.backend.options.rediska = cache resources.cachemanager.redis.backend.customBackendNaming = true resources.cachemanager.redis.frontendBackendAutoload = true ; Initialize sessions resources.session.saveHandler.class = "Rediska_Zend_Session_SaveHandler_Redis" ; Reference to Rediska 'sessions' instance resources.session.saveHandler.options.rediska = sessions </div> <h3>Rediska_Autoloader и Rediska_Commands</h3> <p>Autoload and command manager are in separate classes.</p> <h3>All Rediska commands in your IDE autocomplete</h3> <p>There is a script <span class="pre">scripts/add_command_methods.php</span> which generates Rediska command methods in following classes <span class="pre">Rediska</span>, <span class="pre">Rediska_Pipeline</span>, <span class="pre">Rediska_Connection_Specified</span>, <span class="pre">Rediska_Transaction</span>. This way IDE autocomplete and phpDocumentator will work properly.</p> Wed, 25 Aug 2010 10:53:38 +0000 /news/2010-08-25-added-rediska-instance-manager-and-refactored-a-lot /news/2010-08-25-added-rediska-instance-manager-and-refactored-a-lot Rediska config and monitor on github! <p>Yesterday I pushed implementation of <a href="http://code.google.com/p/redis/wiki/ConfigCommand">CONFIG</a> and <a href="http://code.google.com/p/redis/wiki/MonitorCommand">MONITOR</a> Redis commands to <a href="http://github.com/shumkov/rediska">github</a>.</p> <h3>Config</h3> <pre class="active4d">&lt;?php <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(); <span class="Variable"><span class="Variable">$</span>config</span> <span class="Operator">=</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>config(); <span class="LineComment"><span class="LineComment">//</span> Iterate all redis parameters</span> <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>config</span> <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>name</span> <span class="Operator">=&gt;</span> <span class="Variable"><span class="Variable">$</span>value</span>) { <span class="CommandMethod">print</span> <span class="String"><span class="String">&quot;</span><span class="String"><span class="Variable"><span class="Variable">$</span>name</span> =&gt; <span class="Variable"><span class="Variable">$</span>value</span><span class="UserDefinedConstant">\n</span></span><span class="String">&quot;</span></span>; } <span class="LineComment"><span class="LineComment">//</span> Get parameter</span> <span class="CommandMethod">print</span> <span class="Variable"><span class="Variable">$</span>config</span><span class="Operator">-&gt;</span><span class="Variable">maxmemory</span>; <span class="LineComment"><span class="LineComment">//</span> or as array</span> <span class="CommandMethod">print</span> <span class="Variable"><span class="Variable">$</span>config</span>[<span class="String"><span class="String">'</span><span class="String">maxmemory</span><span class="String">'</span></span>]; <span class="LineComment"><span class="LineComment">//</span> Get parameters by pattern</span> <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>config</span>[<span class="String"><span class="String">'</span><span class="String">max*</span><span class="String">'</span></span>] <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>name</span> <span class="Operator">=&gt;</span> <span class="Variable"><span class="Variable">$</span>value</span>) { <span class="CommandMethod">print</span> <span class="String"><span class="String">&quot;</span><span class="String"><span class="Variable"><span class="Variable">$</span>name</span> =&gt; <span class="Variable"><span class="Variable">$</span>value</span><span class="UserDefinedConstant">\n</span></span><span class="String">&quot;</span></span>; } <span class="LineComment"><span class="LineComment">//</span> Set parameter</span> <span class="Variable"><span class="Variable">$</span>config</span><span class="Operator">-&gt;</span><span class="Variable">maxmemory</span> <span class="Operator">=</span> <span class="Number">10000</span>; <span class="LineComment"><span class="LineComment">//</span> or as array</span> <span class="Variable"><span class="Variable">$</span>config</span>[<span class="String"><span class="String">'</span><span class="String">maxmemory</span><span class="String">'</span></span>] <span class="Operator">=</span> <span class="Number">10000</span>; ?&gt; </pre> <h3>Monitor</h3> <pre class="active4d">&lt;?php <span class="LineComment"><span class="LineComment">//</span> Get monitor</span> <span class="Variable"><span class="Variable">$</span>monitor</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska_Monitor</span>(); <span class="LineComment"><span class="LineComment">//</span> or from Rediska</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(); <span class="Variable"><span class="Variable">$</span>monitor</span> <span class="Operator">=</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>monitor(); <span class="LineComment"><span class="LineComment">//</span> Get commands</span> <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>monitor</span> <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>timestamp</span> <span class="Operator">=&gt;</span> <span class="Variable"><span class="Variable">$</span>command</span>) { <span class="CommandMethod">print</span> <span class="String"><span class="String">&quot;</span><span class="String"><span class="Variable"><span class="Variable">$</span>timestamp</span> =&gt; <span class="Variable"><span class="Variable">$</span>command</span></span><span class="String">&quot;</span></span>; } ?&gt; </pre> Wed, 11 Aug 2010 10:13:12 +0000 /news/2010-08-11-rediska-config-and-monitor-on-github /news/2010-08-11-rediska-config-and-monitor-on-github Append, Substring and SetAndExpire already on github! <p>New Redis 2.0 commands implementation on <a href="http://github.com/shumkov/rediska">github</a>:</p> <ul> <li><span class="pre">Rediska#Append($name, $value)</span> - Append value to a string key</li> <li><span class="pre">Rediska#Substring($name, $start, $end = -1)</span> - Return substring of string key</li> <li><span class="pre">Rediska#SetAndExpire($name, $value, $time)</span> - Set + Expire atomic combo.</li> </ul> Mon, 09 Aug 2010 17:58:23 +0000 /news/2010-08-09-append-substring-and-setandexpire-already-on-github /news/2010-08-09-append-substring-and-setandexpire-already-on-github Hashes implemented! <p>Let me introduce you Hashes implemented in Rediska:</p> <pre class="active4d">&lt;?php <span class="Variable"><span class="Variable">$</span>user</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska_Key_Hash</span>(<span class="String"><span class="String">'</span><span class="String">users:1</span><span class="String">'</span></span>); <span class="LineComment"><span class="LineComment">//</span> Fields accessible as object properties</span> <span class="Variable"><span class="Variable">$</span>user</span><span class="Operator">-&gt;</span><span class="Variable">firstName</span> <span class="Operator">=</span> <span class="String"><span class="String">'</span><span class="String">John</span><span class="String">'</span></span>; <span class="LineComment"><span class="LineComment">//</span> Fields accessible as array keys</span> <span class="Variable"><span class="Variable">$</span>user</span>[<span class="String"><span class="String">'</span><span class="String">lastName</span><span class="String">'</span></span>] <span class="Operator">=</span> <span class="String"><span class="String">'</span><span class="String">Silver</span><span class="String">'</span></span>; <span class="LineComment"><span class="LineComment">//</span> You can check if field is set</span> <span class="Keyword">if</span> (<span class="Operator">!</span><span class="CommandMethod">isset</span>(<span class="Variable"><span class="Variable">$</span>user</span><span class="Operator">-&gt;</span><span class="Variable">nick</span>)) { <span class="LineComment"><span class="LineComment">//</span> You can set several fields at a time</span> <span class="Variable"><span class="Variable">$</span>user</span><span class="Operator">-&gt;</span>set(<span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">nick</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="String"><span class="String">'</span><span class="String">Josi</span><span class="String">'</span></span>, <span class="String"><span class="String">'</span><span class="String">confirmed</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="Number">1</span>, <span class="String"><span class="String">'</span><span class="String">viewed</span><span class="String">'</span></span> <span class="Operator">=&gt;</span> <span class="Number">3</span>)); } <span class="LineComment"><span class="LineComment">//</span> You can remove fields</span> <span class="CommandMethod">unset</span>(<span class="Variable"><span class="Variable">$</span>user</span><span class="Operator">-&gt;</span><span class="Variable">confirmed</span>); <span class="LineComment"><span class="LineComment">//</span> You can get fields count</span> <span class="CommandMethod">count</span>(<span class="Variable"><span class="Variable">$</span>user</span>); <span class="LineComment"><span class="LineComment">//</span> You can increment field's value</span> <span class="Variable"><span class="Variable">$</span>user</span><span class="Operator">-&gt;</span>increment(<span class="String"><span class="String">'</span><span class="String">viewed</span><span class="String">'</span></span>); <span class="LineComment"><span class="LineComment">//</span> You can iterate fields</span> <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>user</span> <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>field</span> <span class="Operator">=&gt;</span> <span class="Variable"><span class="Variable">$</span>value</span>) { <span class="CommandMethod">print</span> <span class="String"><span class="String">&quot;</span><span class="String"><span class="Variable"><span class="Variable">$</span>field</span> =&gt; <span class="Variable"><span class="Variable">$</span>value</span></span><span class="String">&quot;</span></span>; } <span class="LineComment"><span class="LineComment">//</span> You can create models extending Rediska_Key_Hash</span> <span class="Storage">class</span> <span class="TypeName">User</span> <span class="Storage">extends</span> <span class="InheritedClass">Rediska_Key_Hash</span> { <span class="Storage">public </span><span class="Storage">function</span> <span class="CommandMethod">__construct</span>(<span class="Variable"><span class="Variable">$</span>id</span>) { <span class="Storage">parent</span><span class="Operator">::</span>__construct(<span class="String"><span class="String">&quot;</span><span class="String">users:<span class="Variable"><span class="Variable">$</span>id</span></span><span class="String">&quot;</span></span>); } <span class="Storage">public </span><span class="Storage">function</span> <span class="FunctionName">isAdmin</span>() { <span class="Keyword">return</span> <span class="Variable"><span class="Variable">$</span>this</span><span class="Operator">-&gt;</span><span class="Variable">role</span> <span class="Operator">==</span> <span class="String"><span class="String">'</span><span class="String">admin</span><span class="String">'</span></span>; } } <span class="Variable"><span class="Variable">$</span>user</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">User</span>(<span class="Number">1</span>); <span class="Keyword">if</span> (<span class="Variable"><span class="Variable">$</span>user</span><span class="Operator">-&gt;</span>isAdmin()) { <span class="CommandMethod">print</span> <span class="String"><span class="String">'</span><span class="String">Welcome </span><span class="String">'</span></span> <span class="Operator">.</span> <span class="Variable"><span class="Variable">$</span>user</span><span class="Operator">-&gt;</span><span class="Variable">login</span>; } ?&gt; </pre> <p>Rediska Hash commands:</p> <ul> <li><span class="pre">Rediska#setToHash($name, $fieldOrData, $value = null, $overwrite = true)</span></li> <li><span class="pre">Rediska#getFromHash($name, $fieldOrFields)</span></li> <li><span class="pre">Rediska#incrementInHash($name, $field, $amount = 1)</span></li> <li><span class="pre">Rediska#existsInHash($name, $field)</span></li> <li><span class="pre">Rediska#deleteFromHash($name, $field)</span></li> <li><span class="pre">Rediska#getHashLength($name)</span></li> <li><span class="pre">Rediska#getHash($name)</span></li> <li><span class="pre">Rediska#getHashFields()</span></li> <li><span class="pre">Rediska#getHashValues()</span></li> </ul> Mon, 02 Aug 2010 15:27:33 +0000 /news/2010-08-02-hashes-implemented /news/2010-08-02-hashes-implemented Publish/Subscribe implemented! <p>Today with Yuri Bogdanov I pushed to <a href="http://github.com/Shumkov/Rediska">github</a> <a href="http://code.google.com/p/redis/wiki/PublishSubscribe">Publish/Subscribe</a> implementation.</p> <p>Some usage examples:</p> <pre class="active4d">&lt;?php <span class="LineComment"><span class="LineComment">//</span> Subscribe to channel</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(); <span class="Variable"><span class="Variable">$</span>channel</span> <span class="Operator">=</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>subscribe(<span class="String"><span class="String">'</span><span class="String">channel</span><span class="String">'</span></span>); <span class="LineComment"><span class="LineComment">//</span> Gets messages in an endless loop</span> <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>channel</span> <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>message</span>) { <span class="CommandMethod">print</span> <span class="Variable"><span class="Variable">$</span>message</span>; <span class="LineComment"><span class="LineComment">//</span> Exit from loop if needed</span> <span class="Keyword">if</span> (<span class="Variable"><span class="Variable">$</span>message</span> <span class="Operator">==</span> <span class="String"><span class="String">'</span><span class="String">exit</span><span class="String">'</span></span>) { <span class="Keyword">break</span>; } } <span class="LineComment"><span class="LineComment">//</span> Subscribe to few channels with timeout</span> <span class="Variable"><span class="Variable">$</span>channels</span> <span class="Operator">=</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>subscribe(<span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">channel</span><span class="String">'</span></span>, <span class="String"><span class="String">'</span><span class="String">channel2</span><span class="String">'</span></span>), <span class="Number">60</span>); <span class="LineComment"><span class="LineComment">//</span> Gets messages for 1 minute and leaves the loop</span> <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>channels</span> <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>channel</span> <span class="Operator">=&gt;</span> <span class="Variable"><span class="Variable">$</span>message</span>) { <span class="CommandMethod">print</span> <span class="String"><span class="String">&quot;</span><span class="String"><span class="Variable"><span class="Variable">$</span>channel</span>: <span class="Variable"><span class="Variable">$</span>message</span></span><span class="String">&quot;</span></span>; <span class="LineComment"><span class="LineComment">//</span> Unsubscribe from channels if needed</span> <span class="Keyword">if</span> (<span class="Variable"><span class="Variable">$</span>message</span> <span class="Operator">==</span> <span class="String"><span class="String">'</span><span class="String">unsubscribe</span><span class="String">'</span></span>) { <span class="Variable"><span class="Variable">$</span>channels</span><span class="Operator">-&gt;</span>unsubscribe(<span class="String"><span class="String">'</span><span class="String">channel2</span><span class="String">'</span></span>); } <span class="LineComment"><span class="LineComment">//</span> Subscribe to channel if needed</span> <span class="Keyword">if</span> (<span class="Variable"><span class="Variable">$</span>message</span> <span class="Operator">==</span> <span class="String"><span class="String">'</span><span class="String">subscribe</span><span class="String">'</span></span>) { <span class="Variable"><span class="Variable">$</span>channels</span><span class="Operator">-&gt;</span>subscribe(<span class="String"><span class="String">'</span><span class="String">channel3</span><span class="String">'</span></span>); } } <span class="LineComment"><span class="LineComment">//</span> Another way to subscribe to channel</span> <span class="Variable"><span class="Variable">$</span>channel</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska_PubSub_Channel</span>(<span class="String"><span class="String">'</span><span class="String">channel</span><span class="String">'</span></span>); <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>channel</span> <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>message</span>) { <span class="CommandMethod">print</span> <span class="Variable"><span class="Variable">$</span>message</span>; } <span class="LineComment"><span class="LineComment">//</span> Publish to channel</span> <span class="Variable"><span class="Variable">$</span>channel</span>[] <span class="Operator">=</span> <span class="String"><span class="String">'</span><span class="String">message</span><span class="String">'</span></span>; <span class="LineComment"><span class="LineComment">//</span> Other way to publish</span> <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(); <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>publish(<span class="String"><span class="String">'</span><span class="String">channel</span><span class="String">'</span></span>, <span class="String"><span class="String">'</span><span class="String">message</span><span class="String">'</span></span>); <span class="LineComment"><span class="LineComment">//</span> Or publish to few channels</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>publish(<span class="CommandMethod">array</span>(<span class="String"><span class="String">'</span><span class="String">channel</span><span class="String">'</span></span>, <span class="String"><span class="String">'</span><span class="String">channel2</span><span class="String">'</span></span>), <span class="String"><span class="String">'</span><span class="String">message</span><span class="String">'</span></span>); <span class="LineComment"><span class="LineComment">//</span> Extend channel for you own model</span> <span class="Storage">class</span> <span class="TypeName">Chat</span> <span class="Storage">extends</span> <span class="InheritedClass">Rediska_PubSub_Channel</span> { <span class="Storage">public </span><span class="Storage">function</span> <span class="CommandMethod">__construct</span>() { <span class="Storage">parent</span><span class="Operator">::</span>__construct(<span class="String"><span class="String">'</span><span class="String">chat</span><span class="String">'</span></span>); } <span class="Storage">public </span><span class="Storage">function</span> <span class="FunctionName">say</span>(<span class="Variable"><span class="Variable">$</span>nick</span>, <span class="Variable"><span class="Variable">$</span>message</span>) { <span class="Variable"><span class="Variable">$</span>this</span><span class="Operator">-&gt;</span>publish(<span class="CommandMethod">array</span>(<span class="Variable"><span class="Variable">$</span>nick</span>, <span class="Variable"><span class="Variable">$</span>message</span>)); } } <span class="LineComment"><span class="LineComment">//</span> Read messages</span> <span class="Variable"><span class="Variable">$</span>chat</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Chat</span>(); <span class="Keyword">foreach</span>(<span class="Variable"><span class="Variable">$</span>chat</span> <span class="Operator">as</span> <span class="Variable"><span class="Variable">$</span>nickAndMessage</span>) { <span class="CommandMethod">list</span>(<span class="Variable"><span class="Variable">$</span>nick</span>, <span class="Variable"><span class="Variable">$</span>message</span>) <span class="Operator">=</span> <span class="Variable"><span class="Variable">$</span>nickAndMessage</span>; <span class="CommandMethod">print</span> <span class="String"><span class="String">&quot;</span><span class="String"><span class="Variable"><span class="Variable">$</span>nick</span> say: <span class="Variable"><span class="Variable">$</span>message</span></span><span class="String">&quot;</span></span>; } <span class="LineComment"><span class="LineComment">//</span> Write messages</span> <span class="Variable"><span class="Variable">$</span>chat</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Chat</span>(); <span class="Variable"><span class="Variable">$</span>chat</span><span class="Operator">-&gt;</span>say(<span class="String"><span class="String">'</span><span class="String">John</span><span class="String">'</span></span>, <span class="String"><span class="String">'</span><span class="String">Hello!</span><span class="String">'</span></span>); ?&gt; </pre> Tue, 27 Jul 2010 15:25:45 +0000 /news/2010-07-27-publish-subscribe-implemented /news/2010-07-27-publish-subscribe-implemented Blocking list pop and shift commands <p>I've just pushed two new Rediska commands to <a href="http://github.com/Shumkov/Rediska/">github</a>: <span class="pre">popFromListBlocking($timeout = 0)</span> and <span class="pre">shiftFromListBlocking($timeout = 0)</span> implementing <span class="pre"><a href="http://code.google.com/p/redis/wiki/BlpopCommand">BLPOP</a></span> and <span class="pre"><a href="http://code.google.com/p/redis/wiki/BlpopCommand">BRPOP</a></span> Redis commands.</p> Wed, 21 Jul 2010 10:26:59 +0000 /news/2010-07-21-blocking-list-pop-and-shift-commands /news/2010-07-21-blocking-list-pop-and-shift-commands Refactoring Rediska commands <p>Dear friends, I refactored Rediska commands and pushed to <a href="http://github.com/shumkov/rediska">github</a>, namely <span class="pre">Rediska_Command_Abstarct</span> class. If you inherit your own commands from it, please pay attention.</p> Mon, 19 Jul 2010 15:42:35 +0000 /news/2010-07-19-refactoring-rediska-commands /news/2010-07-19-refactoring-rediska-commands Rediska transactions <p>Few minutes ago i'm pushed to <a href="http://github.com/Shumkov/Rediska">github</a> new feature - transactions.</p> <p>It's very useful implementaton of <span class="pre"><a href="http://code.google.com/p/redis/wiki/MultiExecCommand">MULTI/EXEC</a></span> Redis command:</p> <pre class="active4d">&lt;?php <span class="Variable"><span class="Variable">$</span>rediska</span> <span class="Operator">=</span> <span class="Keyword">new</span> <span class="LibraryClassType">Rediska</span>(); <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>transaction()<span class="Operator">-&gt;</span>set(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>) <span class="Operator">-&gt;</span>get(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>) <span class="Operator">-&gt;</span>delete(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>) <span class="Operator">-&gt;</span>execute(); <span class="LineComment"><span class="LineComment">//</span> or</span> <span class="Variable"><span class="Variable">$</span>transaction</span> <span class="Operator">=</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>transaction(); <span class="Variable"><span class="Variable">$</span>transaction</span><span class="Operator">-&gt;</span>set(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>); <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>get(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>) <span class="LineComment"><span class="LineComment">//</span> #=&gt; null</span> <span class="Variable"><span class="Variable">$</span>transaction</span><span class="Operator">-&gt;</span>get(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>); <span class="Variable"><span class="Variable">$</span>transaction</span><span class="Operator">-&gt;</span>delete(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>); <span class="Variable"><span class="Variable">$</span>transaction</span><span class="Operator">-&gt;</span>set(<span class="String"><span class="String">'</span><span class="String">b</span><span class="String">'</span></span>, <span class="Number">2</span>); <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>get(<span class="String"><span class="String">'</span><span class="String">b</span><span class="String">'</span></span>) <span class="LineComment"><span class="LineComment">//</span> #=&gt; null</span> <span class="Variable"><span class="Variable">$</span>transaction</span><span class="Operator">-&gt;</span>execute(); <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>get(<span class="String"><span class="String">'</span><span class="String">b</span><span class="String">'</span></span>) <span class="LineComment"><span class="LineComment">//</span> #=&gt; 2</span> <span class="LineComment"><span class="LineComment">//</span> You may discard transaction</span> <span class="Variable"><span class="Variable">$</span>transaction</span> <span class="Operator">=</span> <span class="Variable"><span class="Variable">$</span>rediska</span><span class="Operator">-&gt;</span>transaction(); <span class="Variable"><span class="Variable">$</span>transaction</span><span class="Operator">-&gt;</span>set(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>) <span class="Operator">-&gt;</span>get(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>); <span class="Operator">-&gt;</span>delete(<span class="String"><span class="String">'</span><span class="String">a</span><span class="String">'</span></span>, <span class="Number">1</span>); <span class="Keyword">if</span> (<span class="BlockComment"><span class="BlockComment">/*</span> something wrong <span class="BlockComment">*/</span></span>) { <span class="Variable"><span class="Variable">$</span>transaction</span><span class="Operator">-&gt;</span>discard(); } ?&gt; </pre> <p>Oh! Important feature of transactions - all commands executed as one atomic operation!</p> Thu, 15 Jul 2010 22:47:23 +0000 /news/2010-07-15-rediska-transactions /news/2010-07-15-rediska-transactions New serializer and autoloader <p>We have some changes on <a href="http://github.com/shumkov/rediska">github</a> for you:</p> <ul> <li>Rediska now serialized only objects and arrays. Strings stored as is.</li> <li>Serializer now works with adapters. For define adapter use <span class="pre">serializerAdapter</span> option. In a box we have three adapters: <ul> <li><span class="pre">phpSerializer</span></li> <li><span class="pre">json</span></li> <li><span class="pre">toString</span></li> </ul> Or you personal adapter class which implements <span class="pre">Rediska_Serializer_Adapter_Interface</span>). </li> <li>Rediska now use autoloader and can't required <span class="pre">include_path</span></li> </ul> Tue, 13 Jul 2010 16:50:22 +0000 /news/2010-07-13-new-serializer-and-autoloader /news/2010-07-13-new-serializer-and-autoloader Release Rediska 0.4.2 <p>We felt uncomfortable about Rediska not supporting commands of unstable Redis versions. This release is devoted exactly to such commands.</p> <p>Here's what's new so far:</p> <ul> <li><a href="/documentation/configuration/redis-version">Added Redis server version specification</a></li> <li>Implemented <span class="pre">ZRANK</span> and <span class="pre">ZREVRANK</span> <li>Implemented <span class="pre">WITHSCORES</span> argument for <span class="pre">ZRANGEBYSCORE</span></li> <li>Implemented <span class="pre">ZREMRANGEBYRANK</span></li> <li>Implemented <span class="pre">ZUNION</span> and <span class="pre">ZINTER</span> <li>Implemented <span class="pre">SORT</span> command as standalone</li> <li>Deprecated sorting attributes in <span class="pre">GetList</span> and <span class="pre">GetSet</span></li> <li>Refactored configuration of test suite (now requires Zend Framework)</li> <li>Limit and offset broke negative range selects (arguments changed for <span class="pre">getList</span>, <span class="pre">getSortedSet</span>, <span class="pre">truncateList</span>, <span class="pre">getFromSortedSetByScore</span>)</li> <li>If sessions set is empty trown exception</li> <li>Null lifetime not supported in cache backend</li> </ul> <p>Coming soon:</p> <ul> <li>Hash commands and <span class="pre">Rediska_Key_Hash</span> wrapper</li> <li>Implementation <span class="pre">MULTI</span>, <span class="pre">EXEC</span> and <span class="pre">DISCARD</span> commands</li> <li>Implement <span class="pre">SUBSCRIBE</span>, <span class="pre">UNSUBSCRIBE</span>, <span class="pre">PUBLISH</span>, <span class="pre">PUNSUBSCRIBE</span> and <span class="pre">PSUBSCRIBE</span></li> <li><a href="http://codeigniter.com/">CodeIgniter</a> framework integration</li> </ul> Wed, 21 Apr 2010 15:14:00 +0000 /news/2010-04-21-release-rediska-0-4-2 /news/2010-04-21-release-rediska-0-4-2 Release Rediska 0.4.0 <p>Good news every one! We worked hard and made this world better!</p> <p>Long story short, heres what we have done:</p> <ul> <li><a href="http://rediska.geometria-lab.net/documentation/examples/retwitter">ReTwitter</a> (demo application) - small twitter clone based on Zend Framework and Rediska</li> <li><a href="http://rediska.geometria-lab.net/documentation/get-started">Rediska PEAR package</a></li> <li><a href="http://rediska.geometria-lab.net/documentation/integration-with-frameworks/symfony">Symfony integration</a></li> <li>Optimized consistent hashing performance (more then 10 times faster!). Thanks to Kijin Sung.</li> <li>Implemented commands: <span class="pre">BGREWRITEAOF</span>, <span class="pre">ZINCRBY</span>, <span class="pre">ZREMRANGEBYSCORE</span>, <span class="pre">SLAVEOF</span>, <span class="pre">EXPIREAT</span></li> <li>Added <span class="pre">WITHSCORES</span> argument supprt to <span class="pre">ZRANGE</span></li> <li>Added timeout for connections</li> <li>Optimized <span class="pre">fromArray</span> method for <span class="pre">Rediska_Key_List</span>, <span class="pre">Rediska_Key_Set</span>, <span class="pre">Rediska_Key_SortedSet</span></li> <li>New test suite</li> <li>Throw exceptions if empty arguments</li> <li>Throw exception if connection not found</li> <li><span class="pre">on</span> method now recieve <span class="pre">Rediska_Connection</span></li> <li>Specify connection alias for key objects, so you can explicitly set where this key should be saved</li> <li>Added <span class="pre">getScoreFromSortedSet</span> method to <span class="pre">Rediska_Key_SortedSet</span></li> <li>Refactored <span class="pre">Rediska_Connection</span></li> <li>Fixed <span class="pre">QUIT</span> bug.</li> <li>Zend Session save handler thrown exception on Rediska options</li> <li>Add README and CHANGELOG</li> </ul> <p>Well that's what we've got for this release so far, the weekend is here and we're moving to the bar :)</p> Fri, 02 Apr 2010 15:19:50 +0000 /news/2010-04-02-release-rediska-0-4-0 /news/2010-04-02-release-rediska-0-4-0 &quot;Redis PHP Introduction&quot; by Kevin van Zonneveld Kevin wrote a <a href="http://kevin.vanzonneveld.net/techblog/article/redis_in_php/">nice article</a> about Redis and Rediska friendship. Fri, 02 Apr 2010 07:19:03 +0000 /news/2010-04-02-redis-php-introduction-by-kevin-van-zonneveld /news/2010-04-02-redis-php-introduction-by-kevin-van-zonneveld Moved to GitHub Rediska moved to <a href="http://github.com/shumkov/rediska">github</a>. Tue, 09 Mar 2010 15:38:33 +0000 /news/2010-03-09-moved-to-github /news/2010-03-09-moved-to-github Rediska overview on highload.com.ua <p>Rediska <a href="http://highload.com.ua/index.php/2010/01/26/rediska-php-client-for-redis/">overview</a> on russian at <a href="http://highload.com.ua/">highload.com.ua</a>.</p> Fri, 29 Jan 2010 15:24:33 +0000 /news/2010-01-29-rediska-overview-on-highload-com-ua /news/2010-01-29-rediska-overview-on-highload-com-ua Great Rediska 0.3.0 release <p>Congratulations! Rediska 0.3.0 is out:</p> <ul> <li>Full support Redis 1.2.0 API</li> <li><a href="/documentation/usage/pipelining">Pipelining</li> <li><a href="/documentation/usage/specify-server-for-command">Operate</a> with keys on specified (by alias) server</li> <li>Specify DB index in server config</li> <li>Easy <a href="/documentation/usage/extending-rediska">extending</a> Rediska by adding you own or overwrite standart commands</li> <li>Lazy loading</li> <li>Full <a href="/documentation">documentation</a></li> <li>Bug fixes and more</li> </ul> <p>Soon:</p> <ul> <li><a href="http://www.symfony-project.org/">Symfony</a> framework integration</li> <li><a href="http://www.audioscrobbler.net/development/ketama/">Ketama</a> support</li> <li>Benchmarks and performance optimization</li> <li>Example application</li> </ul> <p><strong><a href="/download/Rediska-0-3-0.zip">Download Now!</a></strong></p> Fri, 22 Jan 2010 19:11:03 +0000 /news/2010-01-22-great-rediska-0-3-0-release /news/2010-01-22-great-rediska-0-3-0-release Release Rediska 0.2.2 <p>Good news! Rediska is now under <a href="http://www.opensource.org/licenses/bsd-license.php">New BSD</a> license!</p> Fri, 27 Nov 2009 15:46:46 +0000 /news/2009-11-27-release-rediska-0-2-2 /news/2009-11-27-release-rediska-0-2-2 Release Rediska 0.2.1 <p>First public beta release of Rediska (radish on russian) - open source PHP client for key-value database <a href="http://code.google.com/p/redis/">Redis</a>.</p> <h3>Main features</h3> <ul> <li>Multiple servers support</li> <li>Consistent hashing, crc32 or you personal algorythm for key distribution</li> <li>Working with keys as objects</li> <li>Use Lists and Sets as native PHP arrays</li> <li>Full <a href="http://framework.zend.com/">Zend Framework</a> integration</li> </ul> <h3>Coming soon</h3> <ul> <li>Integration with others frameworks</li> <li>Expire keys by tags</li> <li>Server aliases and working with keys on servers specified by alias</li> <li><a href="http://www.audioscrobbler.net/development/ketama/">Ketama</a> (fast C library for key distribution) support </li> <li>More documentation</li> </ul> <p><strong><a href="http://rediska.geometria-lab.net/documentation/get-started">Get started!</a></strong></p> Wed, 25 Nov 2009 15:46:46 +0000 /news/2009-11-25-release-rediska-0-2-1 /news/2009-11-25-release-rediska-0-2-1