奇德圣 發表於 2020-7-30 17:34:00

PHP操作Redis

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>基本指令<ul><li>获取所有的key(keys)</li><li>判断键对应值的类型(type)</li><li>删除缓存项(del)</li><li>设置有效期(expire,expireAt)</li><li>获取有效期(ttl)</li><li>检测缓存项是否存在(exists)</li><li>查看当前数据库key的数量(dbSize)</li><li>清空当前数据库(flushDB)</li><li>清空所有数据库(flushAll)</li></ul></li><li>字符串(string)类型<ul><li>设置(set)</li><li>设置并指定过期时间(setex)</li><li>获取(get)</li><li>增加(incr, incrBy)</li><li>减少(decr, decrBy)</li><li>追加(append)</li><li>获取长度(strLen)</li><li>字符串截取(getRange)</li></ul></li><li>列表(list)类型<ul><li>将元素压入链表(lPush)</li><li>在某个位置插入新元素(lInsert)</li><li>设置某个元素的值(lSet)</li><li>获取列表元素个数(lLen)</li><li>获取下标对应的元素(lIndex)</li><li>获取某个选定范围元素集(lRange)</li><li>从列表左侧弹出数据(lPop)</li><li>根据值移除元素(lRem)</li></ul></li><li>集合(set)类型<ul><li>添加元素到集合(sAdd)</li><li>随机获取一个元素(sPop)</li><li>删除集合里指定的值(sRem)</li><li>遍历集合(sScan)</li><li>获取所有成员(sMembers)</li><li>获取集合元素个数(sCard)</li><li>并集(sUnion),差集(sDiff),交集(sInter)</li></ul></li><li>有序集合(zset)类型<ul><li>添加元素(zAdd)</li><li>元素分值增减(zIncrBy)</li><li>获取根据score排序后的数据段(zRange,zRevRange)</li><li>获取score过滤后排序的数据段(zRangeByScore,zRevRangeByScore)</li><li>获取元素个数(zCard)</li><li>获取区间内的元素个数(zCount)</li><li>获取元素的score(zScore)</li><li>获取某个元素在集合中的排名(zRank)</li><li>删除元素(zRem)</li><li>根据排名来删除(zRemRangeByRank)</li><li>根据区间来删除(zRemRangeByScore)</li></ul></li><li>哈希(hash)类型<ul><li>设置(hSet)</li><li>批量设置(hMset)</li><li>获取(hGet)</li><li>获取全部元素(hGetAll)</li><li>删除某个元素(hDle)</li><li>判断元素是否存在(hExists)</li><li>获取长度(hLen)</li></ul></li></ul></div><p></p>
<h3 id="基本指令">基本指令</h3>
<p>redis里有一些通用的操作,不管它是什么类型操作都是通用的,不过不管是做什么操作,都得先连接redis服务器,实例化redis对象</p>
<pre><code class="language-php">$redis = new Redis();
if (!$redis-&gt;connect('127.0.0.1', 6379)) {
    trigger_error('Redis连接出错!!!', E_USER_ERROR);
} else {
    echo '连接正常&lt;br&gt;';
}
</code></pre>
<h4 id="获取所有的keykeys">获取所有的key(keys)</h4>
<pre><code class="language-php">$data = $redis-&gt;keys('*');
dump($data);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730172911143-1779179321.png" alt="" loading="lazy"></p>
<h4 id="判断键对应值的类型type">判断键对应值的类型(type)</h4>
<p><code>type()</code>方法用户获取一个key对应值的类型,返回值(1:string, 2:set, 3:list, 4:zset, 5:hash 6:未知)</p>
<pre><code class="language-php">$type = $redis-&gt;type('user');
dump($type);
</code></pre>
<h4 id="删除缓存项del">删除缓存项(del)</h4>
<pre><code class="language-php">$redis-&gt;del('待删除的key')
</code></pre>
<h4 id="设置有效期expireexpireat">设置有效期(expire,expireAt)</h4>
<p>需要在设置好了缓存项后,在设置有效期</p>
<p><code>expire()</code>方法是设置某个时间段后过期,`expireAt()方法是在某个时间点(时间戳)过期失效</p>
<pre><code class="language-php">//expire用法示例
//expire()方法第二个参数的单位是秒(s),表示多少秒之后过期
$redis-&gt;expire('user', 3600);

//expire用法示例
$redis-&gt;expireAt('user', strtotime('2020-08-15 00:00:00'));
</code></pre>
<p>如果想精确到毫秒的话,redis还提供了<code>pExpire()</code>、<code>pExpireAt()</code>方法可供使用</p>
<h4 id="获取有效期ttl">获取有效期(ttl)</h4>
<p><code>ttl()</code>方法可以获取某个键的剩余有效期</p>
<pre><code class="language-php">$redis-&gt;ttl('key');//获取剩余有效期,单位:秒(s)
$redis-&gt;pttl('key'); //获取剩余有效期,单位:毫秒(ms)   
</code></pre>
<h4 id="检测缓存项是否存在exists">检测缓存项是否存在(exists)</h4>
<p><code>exists()</code>方法用于检测某个key是否存在</p>
<pre><code class="language-php">$redis-&gt;set('age', 25);
if ($redis-&gt;exists('age')) {
    echo '存在';
} else {
    echo '不存在';
}
</code></pre>
<h4 id="查看当前数据库key的数量dbsize">查看当前数据库key的数量(dbSize)</h4>
<pre><code class="language-php">$dbSize = $redis-&gt;dbSize();
echo $dbSize;
</code></pre>
<h4 id="清空当前数据库flushdb">清空当前数据库(flushDB)</h4>
<pre><code class="language-php">$isFlushed = $redis-&gt;flushDB();
var_dump($isFlushed);
</code></pre>
<h4 id="清空所有数据库flushall">清空所有数据库(flushAll)</h4>
<p>会清空所有库的数据,默认是0~15这16个数据库</p>
<pre><code class="language-php">$isFlushed = $redis-&gt;flushAll();
var_dump($isFlushed);
</code></pre>
<h3 id="字符串string类型">字符串(string)类型</h3>
<p>string是Redis最基本的类型,你可以理解成Memcached一模一样的类型,一个key对应一个value。</p>
<p>string类型是二进制安全的。这意味着Redis的string可以包含任何数据。比如JPG图片或者序列化的对象。</p>
<p>一个Redis中字符串value最多可以是512M</p>
<h4 id="设置set">设置(set)</h4>
<p>仅仅支持字符串操作,不支持内置数据编码功能。如果需要存储PHP的非字符串类型,需要提前手动序列化,获取时再反序列化。</p>
<pre><code class="language-php">$user = [
    'name' =&gt; 'bashlog',
    'age'=&gt; 26,
    'email' =&gt; 'xxxx@gmail.com'
];
//将$user数组序列化成json字符串
$user = json_encode($user);
$redis-&gt;set('user', $user);
$data = $redis-&gt;get('user');
//拿到序列化后的字符串,再反序列化成PHP数组
$data = json_decode($data, true);
var_dump($data);
</code></pre>
<p><code>setnx()</code>方法是只有在key不存在时设置key的值,</p>
<h4 id="设置并指定过期时间setex">设置并指定过期时间(setex)</h4>
<p>设置键的同时,设置过期时间(时间单位是秒)</p>
<pre><code class="language-php">$redis-&gt;setex('hobby', 60, 'fishing');
</code></pre>
<h4 id="获取get">获取(get)</h4>
<pre><code class="language-php">$redis-&gt;set('name', 'bashlog'); //设置
$name = $redis-&gt;get('name');    //获取
var_dump($name);
</code></pre>
<h4 id="增加incr-incrby">增加(incr, incrBy)</h4>
<p><code>incr()</code>、<code>incrBy()</code>都是操作数字,对数字进行增加的操作,incr是执行<strong>原子</strong>加1操作,incrBy是增加指定的数</p>
<pre><code class="language-php">$redis-&gt;set('age', 10);
$redis-&gt;incr('age'); //等于$age++
$redis-&gt;incrBy('age', 5); // 等于$age = $age + 5
</code></pre>
<p><strong>原子性</strong></p>
<p>所谓原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中阿金不会有任何context witch(切换到另一个线程).</p>
<p>(1)在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只能发生于指令之间。</p>
<p>(2)在多线程中,不能被其它进程(线程)打算的操作叫原子操作。</p>
<p>Redis单命令的原子性主要得益于Redis的单线程</p>
<h4 id="减少decr-decrby">减少(decr, decrBy)</h4>
<p><code>decr()</code>和<code>decrBy()</code>方法是对数字进行减的操作,和incr正好相反</p>
<pre><code class="language-php">$redis-&gt;set('age', 10);
$redis-&gt;decr('age'); //等于$age--
$redis-&gt;decrBy('age', 5); // 等于$age = $age - 5
</code></pre>
<h4 id="追加append">追加(append)</h4>
<p><code>append()</code>表示往字符串后面追加元素,返回值是字符串的总长度</p>
<p>示例:在'hello'后面追加' world'</p>
<pre><code class="language-php">$redis-&gt;set('respect', 'hello');
$length = $redis-&gt;append('respect', ' world');
var_dump($length);
</code></pre>
<h4 id="获取长度strlen">获取长度(strLen)</h4>
<p><code>strLen()</code>方法可以获取字符串的长度</p>
<pre><code class="language-php">$redis-&gt;set('respect', 'hello');
$length = $redis-&gt;strlen('respect');
var_dump($length);
</code></pre>
<h4 id="字符串截取getrange">字符串截取(getRange)</h4>
<p><code>getRange()</code>方法可以用来截取字符串的部分内容,第二个参数是下标索引的开始位置,第三个参数是下标索引的结束位置(不是要截取的长度),</p>
<pre><code class="language-php">$redis-&gt;set('ID', '411521199809151234');
$subStr = $redis-&gt;getRange('ID', 0, 5);
var_dump($subStr);
</code></pre>
<p>此外,字符串(string)类型还有<code>mget()</code>、<code>mset()</code>、<code>msetnx()</code>、<code>getSet()</code>等方法.....</p>
<h3 id="列表list类型">列表(list)类型</h3>
<p>Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)</p>
<p>一个列表最多可以包含2<sup>32</sup> - 1 个元素 (4294967295, 每个列表超过40亿个元素)。</p>
<h4 id="将元素压入链表lpush">将元素压入链表(lPush)</h4>
<p>可以使用<code>lPush()</code>方法将数据从<strong>左侧</strong>压入列表</p>
<pre><code class="language-php">$redis-&gt;lPush('list', 'v1');
$redis-&gt;lPush('list', 'v2');
$redis-&gt;lPush('list', 'v2', 'v3');
</code></pre>
<p>可以通过Redis Desktop Manager查看插入情况</p>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173008367-1810448463.png" alt="" loading="lazy"></p>
<p>也可以从<strong>右侧</strong>压入列表,对应的方式是<code>rPush()</code></p>
<h4 id="在某个位置插入新元素linsert">在某个位置插入新元素(lInsert)</h4>
<p>位置的判断,是根据相对的参考元素判断</p>
<p>我们在之前的list链表往里插入数据</p>
<pre><code class="language-php">$redis-&gt;lInsert('list', Redis::BEFORE, 'v2', 'newInsert');
</code></pre>
<p>插入结果如下, 虽然有两个'v2',但是也只会在第一个'v2'前插入数据</p>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173017535-477617611.png" alt="" loading="lazy"></p>
<p>也可以在一个元素后面插入,使用<code>Redis::AFTER</code></p>
<pre><code class="language-php">$redis-&gt;lInsert('list', Redis::AFTER, 'v2', 'newAfterInsert');
</code></pre>
<h4 id="设置某个元素的值lset">设置某个元素的值(lSet)</h4>
<p><code>lSet()</code>方法可以通过下标修改链表元素的值,下标是从0开始。</p>
<pre><code class="language-php"># 将list链表中的第一个元素v3改为newV3
$redis-&gt;lSet('list', 0, 'newV3');
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173025683-2118669333.png" alt="" loading="lazy"></p>
<h4 id="获取列表元素个数llen">获取列表元素个数(lLen)</h4>
<p><code>llen()</code>方法可以获取元素个数</p>
<pre><code class="language-php">$length = $redis-&gt;lLen('list');
echo $length;
</code></pre>
<h4 id="获取下标对应的元素lindex">获取下标对应的元素(lIndex)</h4>
<pre><code class="language-php">$val = $redis-&gt;lIndex('list', 1);
echo $val;
</code></pre>
<h4 id="获取某个选定范围元素集lrange">获取某个选定范围元素集(lRange)</h4>
<p><code>lRange()</code>方法支持通过起止下标来获取列表某个范围内的元素集</p>
<pre><code class="language-php">$arr = $redis-&gt;lRange('list', 0, 1); //前两个元素
$arr = $redis-&gt;lRange('list', 0, -1); //全部元素
$arr = $redis-&gt;lRange('list', -2, -1); //后两个元素
var_dump($arr);
</code></pre>
<h4 id="从列表左侧弹出数据lpop">从列表左侧弹出数据(lPop)</h4>
<p><code>lPop()</code>方法将数据从列表<strong>左侧</strong>弹出,返回弹出的元素,数据元素在list中消失。</p>
<pre><code class="language-php">$val = $redis-&gt;lPop('list');
echo $val;
</code></pre>
<p>查看list列表可以发现,原本第一个元素'newVe3'已经不在list中了</p>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173036517-705516118.png" alt="" loading="lazy"></p>
<p>如果想从<strong>右侧</strong>弹出数据,可以使用<code>rPop()</code>方法</p>
<h4 id="根据值移除元素lrem">根据值移除元素(lRem)</h4>
<p>可以使用<code>lRem()</code>方法根据值来移除元素,并且可以指定要移除的元素个数,因为list中可能出现重复的元素</p>
<pre><code class="language-php">$res = $redis-&gt;lRem('list', 'v2', 2);
echo $res;
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173045254-1338682028.png" alt="" loading="lazy"></p>
<h3 id="集合set类型">集合(set)类型</h3>
<p>Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的接口,这是也是list所不能提供了。</p>
<p>Redis的Set是string类型的无需集合。它底层其实是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)。</p>
<p>集合数据的特征:</p>
<ol>
<li>元素不能重复,保持唯一性</li>
<li>元素无序,不能使用索引(下标)操作</li>
</ol>
<h4 id="添加元素到集合sadd">添加元素到集合(sAdd)</h4>
<pre><code class="language-php">$redis-&gt;sAdd('team', 'kobe');
$redis-&gt;sAdd('team', 'jordan');
$redis-&gt;sAdd('team', 'curry');
$redis-&gt;sAdd('team', 'kobe');//由于kobe已经被添加到team集合中,所以重复添加是无效的
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173054022-1693628592.png" alt="" loading="lazy"></p>
<h4 id="随机获取一个元素spop">随机获取一个元素(sPop)</h4>
<p>无序性,是随机的</p>
<p><code>sPop()</code>方法是从集合中随机取出元素的,它有两个参数,第二个参数表示要取出多少个数据,默认是1</p>
<pre><code class="language-php">$redis-&gt;sPop('team');
</code></pre>
<h4 id="删除集合里指定的值srem">删除集合里指定的值(sRem)</h4>
<pre><code class="language-php">$redis-&gt;sAdd('k', 'v1', 'v2', 'v3');
$redis-&gt;sRem('k', 'v2', 'v3');
$leftData = $redis-&gt;sMembers('k');
dump($leftData);
</code></pre>
<h4 id="遍历集合sscan">遍历集合(sScan)</h4>
<pre><code class="language-php">//不使用迭代器,匹配所有的元素,进行遍历
$iterator = null;
$elements = $redis-&gt;sScan('team', $iterator, '*');
foreach ($elements as $element) {
    echo $element, '&lt;br&gt;';
}
</code></pre>
<h4 id="获取所有成员smembers">获取所有成员(sMembers)</h4>
<pre><code class="language-php">$members = $redis-&gt;sMembers('team');
var_dump($members);
</code></pre>
<h4 id="获取集合元素个数scard">获取集合元素个数(sCard)</h4>
<p>获取集合中元素个数</p>
<pre><code class="language-php">$count = $redis-&gt;sCard('team');
echo $count;
</code></pre>
<h4 id="并集sunion差集sdiff交集sinter">并集(sUnion),差集(sDiff),交集(sInter)</h4>
<p>PHPRedis提供了一些对集合的相互操作</p>
<pre><code class="language-php">$redis-&gt;sAdd('setA', 'a', 'b', 'c', 'd');
$redis-&gt;sAdd('setB', 'a', 'd', 'e', 'f');

$union = $redis-&gt;sUnion('setA', 'setB');
$diff= $redis-&gt;sDiff('setA', 'setB');
$inter = $redis-&gt;sInter('setA', 'setB');
dump($union);
dump($diff);
dump($inter);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173125769-1990157504.png" alt="" loading="lazy"></p>
<h3 id="有序集合zset类型">有序集合(zset)类型</h3>
<p>Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。</p>
<p>不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。</p>
<p>有序集合的成员是唯一的,但<strong>分数(score)</strong>却可以重复。</p>
<p>集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2<sup>32</sup> - 1 (4294967295, 每个集合可存储40多亿个成员)。</p>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173133001-1105838220.png" alt="" loading="lazy"></p>
<p>处理元素时,也要加上score的处理</p>
<h4 id="添加元素zadd">添加元素(zAdd)</h4>
<p>添加6个元素(1~6),分值都是0</p>
<pre><code class="language-php">$redis-&gt;zAdd('zSet', 0, 1);
$redis-&gt;zAdd('zSet', 0, 2);
$redis-&gt;zAdd('zSet', 0, 3);
$redis-&gt;zAdd('zSet', 0, 4);
$redis-&gt;zAdd('zSet', 0, 5);
$redis-&gt;zAdd('zSet', 0, 6);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173140538-1671070762.png" alt="" loading="lazy"></p>
<h4 id="元素分值增减zincrby">元素分值增减(zIncrBy)</h4>
<p>分值可以为负数,表示递减</p>
<pre><code class="language-php">$redis-&gt;zIncrBy('zSet', mt_rand(0, 100), 1);
$redis-&gt;zIncrBy('zSet', mt_rand(0, 100), 2);
$redis-&gt;zIncrBy('zSet', mt_rand(0, 100), 3);
$redis-&gt;zIncrBy('zSet', mt_rand(0, 100), 4);
$redis-&gt;zIncrBy('zSet', mt_rand(0, 100), 5);
$redis-&gt;zIncrBy('zSet', mt_rand(0, 100), 6);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173149171-2128436010.png" alt="" loading="lazy"></p>
<h4 id="获取根据score排序后的数据段zrangezrevrange">获取根据score排序后的数据段(zRange,zRevRange)</h4>
<p>根据分值排序后的,升序和降序的列表获取</p>
<pre><code class="language-php">//获取排行榜
//获取分值(点击率)前三的文章ID列表
$lists = $redis-&gt;zRevRange('zSet', 0, 2, true);
dump($lists);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173158349-307591441.png" alt="" loading="lazy"></p>
<h4 id="获取score过滤后排序的数据段zrangebyscorezrevrangebyscore">获取score过滤后排序的数据段(zRangeByScore,zRevRangeByScore)</h4>
<p>根据分值过滤之后的列表</p>
<p>需要提供分值区间</p>
<pre><code class="language-php">$lists = $redis-&gt;zRangeByScore('zSet', 40, 90, ['withscores' =&gt; true]);
dump($lists);
</code></pre>
<p>原始数据如下图</p>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173207235-596742286.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173212349-1086411830.png" alt="" loading="lazy"></p>
<h4 id="获取元素个数zcard">获取元素个数(zCard)</h4>
<pre><code class="language-php">$count = $redis-&gt;zCard('zSet');
echo $count;
</code></pre>
<h4 id="获取区间内的元素个数zcount">获取区间内的元素个数(zCount)</h4>
<p>获取分值在的元素的数量</p>
<pre><code class="language-php">$count = $redis-&gt;zCount('zSet', 50, 90);
echo $count;
</code></pre>
<h4 id="获取元素的scorezscore">获取元素的score(zScore)</h4>
<p>获取元素分值</p>
<pre><code class="language-php">$score = $redis-&gt;zScore('zSet', 6);
echo $score;
</code></pre>
<h4 id="获取某个元素在集合中的排名zrank">获取某个元素在集合中的排名(zRank)</h4>
<p><code>zRank()</code>方法是返回元素在集合中的排名情况,从0开始。</p>
<pre><code class="language-php">$order = $redis-&gt;zRank('zSet', 56);
</code></pre>
<h4 id="删除元素zrem">删除元素(zRem)</h4>
<p><code>zRem()</code>方法支持通过元素的值来删除元素</p>
<pre><code class="language-php">//通过元素值来删除元素
$redis-&gt;zRem('zSet', 6);
</code></pre>
<h4 id="根据排名来删除zremrangebyrank">根据排名来删除(zRemRangeByRank)</h4>
<pre><code class="language-php">//按照升序排序删除第一个和第二个元素
$redis-&gt;zRemRangeByRank('zSet', 0, 1);
</code></pre>
<h4 id="根据区间来删除zremrangebyscore">根据区间来删除(zRemRangeByScore)</h4>
<pre><code class="language-php">//删除score在之间的元素
$redis-&gt;zRemRangeByScore('zSet', 40, 70);
</code></pre>
<h3 id="哈希hash类型">哈希(hash)类型</h3>
<p>Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。</p>
<p>Redis 中每个 hash 可以存储 2<sup>32</sup> - 1 键值对(40多亿)。</p>
<p>当前服务器一般都是将用户登录信息保存到Redis中,这里存储用户登录信息就比较适合用hash表。hash表比string更合适,如果我们选择使用string类型来存储用户的信息的时候,我们每次存储的时候就得先序列化(json_encode()、serialize())成字符串才能存储redis,</p>
<p>从redis拿到用户信息后又得反序列化(json_decode()、unserialize())成数组或对象,这样开销比较大。如果使用hash的话我们通过key(用户ID)+field(属性标签)就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。</p>
<h4 id="设置hset">设置(hSet)</h4>
<pre><code class="language-php">$redis-&gt;hSet('user', 'name', 'bashlog');
$redis-&gt;hSet('user', 'age', 10);
$redis-&gt;hSet('user', 'address', '浙江杭州滨江区');
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173225442-294415434.png" alt="" loading="lazy"></p>
<p>上面的操作等价于PHP中的</p>
<pre><code class="language-php">$user['name'] = 'bashlog';
$user['age']= 10;
$user['address'] = '浙江杭州滨江'
</code></pre>
<h4 id="批量设置hmset">批量设置(hMset)</h4>
<p>上面使用hSet设置的方式需要多次设置,不太方便,Redis提供了批量设置的方法<code>hMset()</code>,我们可以用这个方法将用户登录信息一次性保存到redis中</p>
<pre><code class="language-php">$u1 = [
    'id'=&gt; 1,
    'name' =&gt; 'itbsl',
    'age'=&gt; 25,
    'email' =&gt; 'itbsl@gmail.com',
    'address' =&gt; '北京朝阳区大望路'
];
$redis-&gt;hMSet('user:'.$u1['id'], $u1);

$u2 = [
    'id' =&gt; 2,
    'name' =&gt; 'bashlog',
    'age'=&gt; 26,
    'email' =&gt; 'bash@gmail.com',
    'address' =&gt; '北京市海淀区西二旗'
];
$redis-&gt;hMSet('user:'.$u2['id'], $u2);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173242108-446638522.png" alt="" loading="lazy"></p>
<p>为什么要给存储的数据加一个前缀呢,比如说上面示例的<code>user</code>前缀?</p>
<p>因为我们在redis一般需要存储很多业务类型的数据,比如用户登录信息、验证码信息,我们都是以用户唯一标识信息(如id,手机号)作为key,如果不加前缀就会导致多个业务类型的数据就存到一起了,这是不合理也不应该的。所以我们可以以业务名称作为前缀然后配合上用户唯一标识即<code>前缀:唯一标识</code>作为key,中间是用冒号<code>:</code>分隔,这样就可以把数据按照业务类型分开,这也是业界通用的做法,比如我们php的session存储默认也是一PHPREDIS_SESSION作为前缀,官方都是这么做了,我们还有什么理由不这样做呢。</p>
<h4 id="获取hget">获取(hGet)</h4>
<p>下面的操作等价于PHP中的<code>$name = $user['name'];</code></p>
<pre><code class="language-php">$name = $redis-&gt;hGet('user', 'name');
echo $name;
</code></pre>
<h4 id="获取全部元素hgetall">获取全部元素(hGetAll)</h4>
<pre><code class="language-php">$user = $redis-&gt;hGetAll('user');
dump($user);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173301242-1862708000.png" alt="" loading="lazy"></p>
<h4 id="删除某个元素hdle">删除某个元素(hDle)</h4>
<pre><code class="language-php">$res = $redis-&gt;hDel('user', 'address');
var_dump($res);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/720430/202007/720430-20200730173307185-1921767553.png" alt="" loading="lazy"></p>
<h4 id="判断元素是否存在hexists">判断元素是否存在(hExists)</h4>
<pre><code class="language-php">$isExistent = $redis-&gt;hExists('user', 'address');
var_dump($isExistent);
</code></pre>
<h4 id="获取长度hlen">获取长度(hLen)</h4>
<pre><code class="language-php">$hLen = $redis-&gt;hLen('user');
var_dump($hLen);
</code></pre>
<blockquote>
<p>如果该文章对您有帮助,请您点个<strong>推荐</strong>,感谢。</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/itbsl/p/13405238.html
頁: [1]
查看完整版本: PHP操作Redis