首页 后端开发 php教程 Redis常见的使用场景分享

Redis常见的使用场景分享

May 31, 2018 am 09:31 AM
redis 分享 场景

本文主要和大家分享Redis常见的使用场景,简单字符串缓存实战,希望能帮助到大家。

$redis->connect('127.0.0.1', 6379);
$strCacheKey  = 'Test_bihu';//SET 应用$arrCacheData = [    'name' => 'job',    'sex'  => '男',    'age'  => '30'];
$redis->set($strCacheKey, json_encode($arrCacheData));
$redis->expire($strCacheKey, 30);  # 设置30秒后过期$json_data = $redis->get($strCacheKey);
$data = json_decode($json_data);
print_r($data->age); //输出数据//HSET 应用$arrWebSite = [    'google' => [        'google.com',        'google.com.hk'
    ],
];
$redis->hSet($strCacheKey, 'google', json_encode($arrWebSite['google']));
$json_data = $redis->hGet($strCacheKey, 'google');
$data = json_decode($json_data);
print_r($data); //输出数据

简单队列实战

$redis->connect('127.0.0.1', 6379);
$strQueueName  = 'Test_bihu_queue';//进队列$redis->rpush($strQueueName, json_encode(['uid' => 1,'name' => 'Job']));
$redis->rpush($strQueueName, json_encode(['uid' => 2,'name' => 'Tom']));
$redis->rpush($strQueueName, json_encode([&#39;uid&#39; => 3,&#39;name&#39; => &#39;John&#39;]));echo "---- 进队列成功 ---- <br /><br />";//查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为: <br />";
print_r($strCount);//出队列$redis->lpop($strQueueName);echo "<br /><br /> ---- 出队列成功 ---- <br /><br />";//查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为: <br />";
print_r($strCount);

简单发布订阅实战

//以下是 pub.php 文件的内容 cli下运行ini_set(&#39;default_socket_timeout&#39;, -1);
$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strChannel = &#39;Test_bihu_channel&#39;;//发布$redis->publish($strChannel, "来自{$strChannel}频道的推送");echo "---- {$strChannel} ---- 频道消息推送成功~ <br/>";
$redis->close();

简单计数器实战

//以下是 sub.php 文件内容 cli下运行ini_set(&#39;default_socket_timeout&#39;, -1);
$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strChannel = &#39;Test_bihu_channel&#39;;//订阅echo "---- 订阅{$strChannel}这个频道,等待消息推送...----  <br/><br/>";
$redis->subscribe([$strChannel], &#39;callBackFun&#39;);function callBackFun($redis, $channel, $msg){
    print_r([        &#39;redis&#39;   => $redis,        &#39;channel&#39; => $channel,        &#39;msg&#39;     => $msg
    ]);
}

排行榜实战

$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strKey = &#39;Test_bihu_comments&#39;;//设置初始值$redis->set($strKey, 0);

$redis->INCR($strKey);  //+1$redis->INCR($strKey);  //+1$redis->INCR($strKey);  //+1$strNowCount = $redis->get($strKey);echo "---- 当前数量为{$strNowCount}。 ---- ";
$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strKey = &#39;Test_bihu_score&#39;;//存储数据$redis->zadd($strKey, &#39;50&#39;, json_encode([&#39;name&#39; => &#39;Tom&#39;]));
$redis->zadd($strKey, &#39;70&#39;, json_encode([&#39;name&#39; => &#39;John&#39;]));
$redis->zadd($strKey, &#39;90&#39;, json_encode([&#39;name&#39; => &#39;Jerry&#39;]));
$redis->zadd($strKey, &#39;30&#39;, json_encode([&#39;name&#39; => &#39;Job&#39;]));
$redis->zadd($strKey, &#39;100&#39;, json_encode([&#39;name&#39; => &#39;LiMing&#39;]));

$dataOne = $redis->ZREVRANGE($strKey, 0, -1, true);echo "---- {$strKey}由大到小的排序 ---- <br /><br />";
print_r($dataOne);

$dataTwo = $redis->ZRANGE($strKey, 0, -1, true);echo "<br /><br />---- {$strKey}由小到大的排序 ---- <br /><br />";
print_r($dataTwo);

解释:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观。

每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。

场景:如果项目中使用了缓存且对缓存设置了超时时间。

当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,

大量并发请求会穿透缓存直接查询数据库,造成雪崩效应。

/**
 * 获取锁
 * @param  String  $key    锁标识
 * @param  Int     $expire 锁过期时间
 * @return Boolean
 */public function lock($key = &#39;&#39;, $expire = 5) {
    $is_lock = $this->_redis->setnx($key, time()+$expire);    //不能获取锁
    if(!$is_lock){        //判断锁是否过期
        $lock_time = $this->_redis->get($key);        //锁已过期,删除锁,重新获取
        if (time() > $lock_time) {
            unlock($key);
            $is_lock = $this->_redis->setnx($key, time() + $expire);
        }
    }    return $is_lock? true : false;
}/**
 * 释放锁
 * @param  String  $key 锁标识
 * @return Boolean
 */public function unlock($key = &#39;&#39;){    return $this->_redis->del($key);
}// 定义锁标识$key = &#39;Test_bihu_lock&#39;;// 获取锁$is_lock = lock($key, 10);if ($is_lock) {    echo &#39;get lock success<br>&#39;;    echo &#39;do sth..<br>&#39;;
    sleep(5);    echo &#39;success<br>&#39;;
    unlock($key);
} else { //获取锁失败
    echo &#39;request too frequently<br>&#39;;
}

简单事务的乐观锁实战

解释:乐观锁(Optimistic Lock), 顾名思义,就是很乐观。

每次去拿数据的时候都认为别人不会修改,所以不会上锁。

watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。

也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。

注意watch的key是对整个连接有效的,事务也一样。

如果连接断开,监视和事务都会被自动清除。

当然了exec,discard,unwatch命令都会清除连接中的所有监视。

$strKey = &#39;Test_bihu_age&#39;;

$redis->set($strKey,10);

$age = $redis->get($strKey);echo "---- Current Age:{$age} ---- <br/><br/>";

$redis->watch($strKey);// 开启事务$redis->multi();//在这个时候新开了一个新会话执行$redis->set($strKey,30);  //新会话echo "---- Current Age:{$age} ---- <br/><br/>"; //30$redis->set($strKey,20);

$redis->exec();

$age = $redis->get($strKey);echo "---- Current Age:{$age} ---- <br/><br/>"; //30//当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败

相关推荐:

PHP链接redis的方法代码
一个php+redis的简单实例分享

Redis在PHP的一些使用方法

以上是Redis常见的使用场景分享的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

Rimworld Odyssey温度指南和Gravtech
1 个月前 By Jack chen
Rimworld Odyssey如何钓鱼
1 个月前 By Jack chen
我可以有两个支付帐户吗?
1 个月前 By 下次还敢
初学者的Rimworld指南:奥德赛
1 个月前 By Jack chen
PHP变量范围解释了
3 周前 By 百草

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1603
29
PHP教程
1506
276
REDIS:与传统数据库服务器的比较 REDIS:与传统数据库服务器的比较 May 07, 2025 am 12:09 AM

Redis在高并发和低延迟场景下优于传统数据库,但不适合复杂查询和事务处理。1.Redis使用内存存储,读写速度快,适合高并发和低延迟需求。2.传统数据库基于磁盘,支持复杂查询和事务处理,数据一致性和持久性强。3.Redis适用于作为传统数据库的补充或替代,但需根据具体业务需求选择。

linux如何限制用户资源?ulimit怎么配置? linux如何限制用户资源?ulimit怎么配置? May 29, 2025 pm 11:09 PM

Linux系统通过ulimit命令限制用户资源,防止资源过度占用。1.ulimit是shell内置命令,可限制文件描述符数(-n)、内存大小(-v)、线程数(-u)等,分为软限制(当前生效值)和硬限制(最高上限)。2.临时修改直接使用ulimit命令,如ulimit-n2048,但仅对当前会话有效。3.永久生效需修改/etc/security/limits.conf及PAM配置文件,并添加sessionrequiredpam_limits.so。4.systemd服务需在unit文件中设置Lim

Redis主要是数据库吗? Redis主要是数据库吗? May 05, 2025 am 12:07 AM

Redis主要是一个数据库,但它不仅仅是数据库。1.作为数据库,Redis支持持久化,适合高性能需求。2.作为缓存,Redis提升应用响应速度。3.作为消息代理,Redis支持发布-订阅模式,适用于实时通信。

用PhpStudy搭建动态PHP网站的步骤与示例 用PhpStudy搭建动态PHP网站的步骤与示例 May 16, 2025 pm 07:54 PM

使用PhpStudy搭建动态PHP网站的步骤包括:1.安装PhpStudy并启动服务;2.配置网站根目录和数据库连接;3.编写PHP脚本生成动态内容;4.调试和优化网站性能。通过这些步骤,你可以从零开始搭建一个功能完整的动态PHP网站。

REDIS:超越SQL- NOSQL的观点 REDIS:超越SQL- NOSQL的观点 May 08, 2025 am 12:25 AM

Redis超越SQL数据库的原因在于其高性能和灵活性。1)Redis通过内存存储实现极快的读写速度。2)它支持多种数据结构,如列表和集合,适用于复杂数据处理。3)单线程模型简化开发,但高并发时可能成瓶颈。

REDIS:揭示其目的和关键应用程序 REDIS:揭示其目的和关键应用程序 May 03, 2025 am 12:11 AM

Redisisanopen-Source,内存内部的库雷斯塔氏菌,卡赫和梅斯吉级,excellingInsPeedAndVersatory.itiswidelysusedforcaching,Real-Timeanalytics,Session Management,Session Managements,and sessighterboarderboarderboardobboardotoitsssupportfortfortfortfortfortfortfortfortorvortfortfortfortfortfortforvortfortforvortforvortforvortfortforvortforvortforvortforvortdatastherctuct anddatataCcessandcessanddataaCces

Laravel页面缓存(Page Cache)策略 Laravel页面缓存(Page Cache)策略 May 29, 2025 pm 09:15 PM

Laravel的页面缓存策略可以显着提升网站性能。 1)使用cache辅助函数实现页面缓存,如Cache::remember方法。 2)选择合适的缓存后端,如Redis。 3)注意数据一致性问题,可使用细粒度缓存或事件监听器清除缓存。 4)结合路由缓存、视图缓存和缓存标签进一步优化。通过合理应用这些策略,可以有效提升网站性能。

我什么时候应该使用redis代替传统数据库? 我什么时候应该使用redis代替传统数据库? May 13, 2025 pm 04:01 PM

用户edisinsteadofatraditionaldatabasewhenyourapplicationrequirespeedandreal-timedataprocorsing,sueAsAsforCaching,sessionmanagement,orrereal-timeanalytics.redisexcelsin:1)caching,缓存,减少载荷载量

See all articles