热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP实战之Redis常见7种使用场景

Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、【Key-Value】数据库,并提供多种语言的API。本篇文章,主要介绍利用PHP使用Redis,主要的应用场景。

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

本篇文章,主要介绍利用PHP使用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(['uid' => 3,'name' => 'John']));echo "---- 进队列成功 ---- 

"; //查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为:
"; print_r($strCount); //出队列$redis->lpop($strQueueName);echo "

---- 出队列成功 ----

"; //查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为:
"; print_r($strCount);

简单发布订阅实战

//以下是 pub.php 文件的内容 cli下运行
ini_set('default_socket_timeout', -1);$redis->connect('127.0.0.1', 6379);$strChannel = 'Test_bihu_channel';

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

//订阅echo "---- 订阅{$strChannel}这个频道,等待消息推送...----  

";$redis->subscribe([$strChannel], 'callBackFun');function callBackFun($redis, $channel, $msg) { print_r([ 'redis' => $redis, 'channel' => $channel, 'msg' => $msg ]); }

简单计数器实战

$redis->connect('127.0.0.1', 6379);$strKey = 'Test_bihu_comments';

//设置初始值$redis->set($strKey, 0);$redis->INCR($strKey);  //+1$redis->INCR($strKey);  //+1$redis->INCR($strKey);  //+1$strNowCount = $redis->get($strKey);echo "---- 当前数量为{$strNowCount}。 ---- "; 

排行榜实战

$redis->connect('127.0.0.1', 6379);$strKey = 'Test_bihu_score';

//存储数据$redis->zadd($strKey, '50', json_encode(['name' => 'Tom']));$redis->zadd($strKey, '70', json_encode(['name' => 'John']));$redis->zadd($strKey, '90', json_encode(['name' => 'Jerry']));$redis->zadd($strKey, '30', json_encode(['name' => 'Job']));$redis->zadd($strKey, '100', json_encode(['name' => 'LiMing']));$dataOne= $redis->ZREVRANGE($strKey, 0, -1, true);echo "---- {$strKey}由大到小的排序 ---- 

"; print_r($dataOne);$dataTwo = $redis->ZRANGE($strKey, 0, -1, true);echo "

---- {$strKey}由小到大的排序 ----

"; print_r($dataTwo);

简单字符串悲观锁实战

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

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

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

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

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

/**
 * 获取锁
 * @param  String  $key    锁标识
 * @param  Int     $expire 锁过期时间
 * @return Boolean
 */
public function lock($key = '', $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 = ''){	return $this->_redis->del($key);
}

// 定义锁标识$key = 'Test_bihu_lock';

// 获取锁$is_lock = lock($key, 10);if ($is_lock) {	echo 'get lock success
'; echo 'do sth..
'; sleep(5); echo 'success
'; unlock($key); } else { //获取锁失败 echo 'request too frequently
'; }

简单事务的乐观锁实战

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

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

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

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

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

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

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

$strKey = 'Test_bihu_age';$redis->set($strKey,10);$age = $redis->get($strKey);echo "---- Current Age:{$age} ---- 

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

"; //30$redis->set($strKey,20);$redis->exec();$age = $redis->get($strKey);echo "---- Current Age:{$age} ----

"; //30 //当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败

Thanks ~


推荐教程:《php教程》

以上就是PHP实战之Redis常见7种使用场景的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文探讨了高质量C/C++编程的最佳实践,并详细分析了常见的内存错误及其解决方案。通过深入理解内存管理和故障排除技巧,开发者可以编写更健壮的程序。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
author-avatar
莫忠健
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有