PHP操作Redis数据库(php rediscluster)
mhr18 2024-10-21 05:46 22 浏览 0 评论
首先通过以下命令开发6379端口号
firewall-cmd --permanent --zone=public --add-port=6379/tcp
systemctl restart firewalld 重启防火墙
firewall-cmd --list-ports 查看开放的端口
做一个简单小测试
<?php
$redis=new Redis();
$redis->connect("192.168.1.104",6379);
$redis->set("name","wangfan");
echo $redis->get("name");
String操作总结
<?php
$redis = new Redis();
$res = $redis->connect("192.168.1.104",6379);
//设置键值:成功返回true,否则返回false
$ret_set = $redis->set('mystr', 'Welcome!');
var_dump($ret_set);//bool(true)
//获取键值:成功返回String类型键值,若key不存在或不是String类型则返回false
$ret_get = $redis->get('mystr');
var_dump($ret_get);//string(8) "Welcome!"
//从某个key所存储的字符串的指定偏移量开始,替换为另一指定字符串,成功返回替换后新字符串的长度。
$ret_setRange = $redis->setRange('mystr', 7, ' to Beijing!');
var_dump($ret_setRange);//int(19)
$ret_get = $redis->get('mystr');
var_dump($ret_get);//string(19) "Welcome to Beijing!"
//获取存储在指定key中字符串的子字符串。
$ret_getRange = $redis->getRange('mystr', 0, 6);
var_dump($ret_getRange);//string(7) "Welcome"
//设置新值,返回旧值:若key不存在则设置值,返回false
$ret_getSet = $redis->getSet('mystr', 'hi man');
var_dump($ret_getSet);//string(19) "Welcome to Beijing!"
$ret_getSet1 = $redis->getSet('mystr1', 'hi man');
var_dump($ret_getSet1);//bool(false)
$ret_get = $redis->get('mystr');
var_dump($ret_get);//string(6) "hi man"
$ret_get = $redis->get('mystr1');
var_dump($ret_get);//string(6) "hi man"
//一次设置多个键值对:成功返回true。
$ret_mset = $redis->mset(['name' => 'jet', 'age' => 18]);
var_dump($ret_mset);//bool(true)
//一次获取多个key的值:返回一个键值对数组,其中不存在的key值为false。
$ret_mget = $redis->mget(['name', 'age', 'sex']);
var_dump($ret_mget);//array(3){[0]=> string(3)"jet"[1]=>string(2)"18"[2]=>bool(false)}
/*
//设置指定key的值及其过期时间,单位:秒。
//参数:键名,过期时间,键值。成功返回true。
$ret_setex = $redis->setex('name1', 10, 'jetwu');
var_dump($ret_setex);//bool(true)
//以毫秒为单位设置指定key的值和过期时间。成功返回true。
$ret_psetex = $redis->psetex('name2', 10, 'jetwu');
var_dump($ret_psetex);//bool(true)
var_dump($redis->get('name1'));//string(5) "jetwu"
var_dump($redis->get('name2'));//string(5) "jetwu"
sleep(5);
var_dump($redis->get('name1'));//string(5) "jetwu"
var_dump($redis->get('name2'));//bool(false)
sleep(10);
var_dump($redis->get('name1'));//bool(false)
var_dump($redis->get('name2'));//bool(false)
*/
//key的值不存在时,才为其设置值。key不存在且设置成功返回true,否则返回false。
//name3有 name无
$ret_setnx = $redis->setnx('name3', 'boby');
var_dump($ret_setnx);//bool(false)
var_dump($redis->get('name3'));//string(3) "abc" 原来的值
$ret_setnx = $redis->setnx('name4', 'boby');
var_dump($ret_setnx);//bool(true)
var_dump($redis->get('name4'));//string(4) "boby"
//setnx命令的批量操作。只有在给定所有key都不存在的时候才能设置成功,只要其中一个key存在,所有key都无法设置成功。
$ret_msetnx = $redis->msetnx(['country' => 'China', 'city' => 'Shenzhen']);
var_dump($ret_msetnx);//bool(true)
var_dump($redis->mget(['country','city']));//array(2){[0]=>string(5)"China"[1]=>string(8)"Shenzhen"}
//获取指定key存储的字符串的长度,key不存在返回0,不为字符串返回false。
$ret_strlen = $redis->strlen('name');
var_dump($ret_strlen);//int(3)
var_dump($redis->strlen('name6'));//int(0)
//将指定key存储的数字值增加1。若key不存在会先初始化为0再增加1,若key存储的不是整数值则返回false。成功返回key新值。
var_dump($redis->get('age'));//string(2) "18"
var_dump($redis->get('name'));//string(3) "jet"
$ret_incr = $redis->incr('age');
var_dump($ret_incr);//int(19)
var_dump($redis->incr('name'));//bool(false)
//给指定key存储的数字值增加指定增量值。
$ret_incrBy = $redis->incrBy('age', 10);
var_dump($ret_incrBy);//int(29)
var_dump($redis->incrBy('name',10));//bool(false)
//给指定key存储的数字值增加指定浮点数增量。
$ret_incrByFloat = $redis->incrByFloat('age', 1.5);
var_dump($ret_incrByFloat);//float(30.5)
var_dump($redis->incrByFloat('name',5.5));//bool(false)
//将指定key存储的数字值减一。
//$ret = $redis->decr('age');
//将指定key存储的数字值减去指定减量值。
//$ret = $redis->decrBy('age', 10);
var_dump($redis->get('mystr'));//string(6) "hi man"
//为指定key追加值到原值末尾,若key不存在则相对于set()函数。
$ret_append = $redis->append('mystr', 'haha');
var_dump($ret_append);//int(10)
实现发布订阅功能
<?php
//发布03-pub.php
$redis = new Redis();
$res = $redis->connect("192.168.1.104",6379);
$message='新年快乐';
$ret=$redis->publish('中央广播电台',$message);
var_dump($ret);
<?php
//订阅03-sub.php
$redis = new Redis();
$res = $redis->connect("192.168.1.104",6379);
$result = $redis->subscribe(array('中央广播电台'),'callback');
function callback($instance,$channelName,$message){
echo "频道名称:{$channelName}---->发布内容:{$message}";
//第一个是redis实例,第二个是订阅的频道,第三个是订阅的消息内容
}
Hash操作
<?php
$redis = new Redis();
$redis->connect("192.168.1.104",6379);
//为hash表中的字段赋值。成功返回1,失败返回0。若hash表不存在会先创建表再赋值,若字段已存在会覆盖旧值。
$ret = $redis->hSet('user','realname','wangfan');
//获取hash表中指定字段的值。若hash表不存在则返回false。
$ret = $redis->hGet('user', 'realname');
//查看hash表的某个字段是否存在,存在返回true,否则返回false。
$ret = $redis->hExists('user', 'realname');
//删除hash表的一个字段,不支持删除多个字段。成功返回1,否则返回0。
$ret = $redis->hDel('user', 'realname');
//同时设置某个hash表的多个字段值。成功返回true。
$ret = $redis->hMset('user', ['name' => 'jet', 'age' => 18]);
//同时获取某个hash表的多个字段值。其中不存在的字段值为false。
$ret = $redis->hMget('user', ['name', 'age']);
//获取某个hash表所有的字段和值。
$ret = $redis->hGetAll('user');
//获取某个hash表所有字段名。hash表不存在时返回空数组,key不为hash表时返回false。
$ret = $redis->hKeys('user');
//获取某个hash表所有字段值。
$ret = $redis->hVals('user');
//为hash表中不存在的字段赋值。若hash表不存在则先创建,若字段已存在则不做任何操作。设置成功返回true,否则返回false。
$ret = $redis->hSetNx('user', 'realname', 'jetwu');
//获取某个hash表的字段数量。若hash表不存在返回0,若key不为hash表则返回false。
$ret = $redis->hLen('user');
//为hash表中的指定字段加上指定增量值,若增量值为负数则相当于减法操作。若hash表不存在则先创建,若字段不存在则先初始化值为0再进行操作,若字段值为字符串则返回false。设置成功返回字段新值。
$ret = $redis->hIncrBy('user', 'age', 10);
//为hash表中的指定字段加上指定浮点数增量值。
$ret = $redis->hIncrBy('user', 'age', 1.5);
List操作
blPop
<?php
$redis = new Redis();
$redis->connect("192.168.1.104",6379);
//移除并获取列表的第一个元素。如果列表没有元素则会阻塞列表直到等待超时或发现可弹出元素为止。
//参数:key,超时时间(单位:秒)
//返回值:[0=>key,1=>value],超时返回[]
$ret = $redis->blPop('city', 10);
var_dump($ret);
brPop
<?php
$redis = new Redis();
$redis->connect("192.168.1.104",6379);
//移除并获取列表的最后一个元素。如果列表没有元素则会阻塞列表直到等待超时或发现可弹出元素为止。
//参数:key,超时时间(单位:秒)
//返回值:[0=>key,1=>value],超时返回[]
$ret = $redis->brPop('city', 10);
var_dump($ret);
基本操作操作总结
<?php
$redis = new Redis();
$redis->connect("192.168.1.104",6379);
//从list头部插入一个值。
$ret = $redis->lPush('city', rand(0,1000));
//从list尾部插入一个值。
$ret = $redis->rPush('city', rand(0,1000));
//将一个插入已存在的列表头部,列表不存在时操作无效。
$ret = $redis->lPushx('city', 'qwe');
//将一个或多个值插入已存在的列表尾部,列表不存在时操作无效。
$ret = $redis->rPushx('city', 'asd');
//移除并返回列表的第一个元素,若key不存在或不是列表则返回false。
$ret = $redis->lPop('city');
//移除并返回列表的最后一个元素,若key不存在或不是列表则返回false。
$ret = $redis->rPop('city');
//获取列表指定区间中的元素。0表示列表第一个元素,-1表示最后一个元素,-2表示倒数第二个元素。
$ret = $redis->lrange('city', 0, -1);//查看队列所有元素
var_dump($ret);
返回列表长度 通过索引获取/设置列表中的元素
//返回列表长度。
$ret = $redis->lLen('city');
//通过索引获取列表中的元素。若索引超出列表范围则返回false。
$ret = $redis->lindex('city', 3);
//通过索引设置列表中元素的值。若是索引超出范围,或对一个空列表进行lset操作,则返回false。
$ret = $redis->lSet('city', 2, 'chengshi');
在列表中指定元素前或后面插入元素
//在列表中指定元素前或后面插入元素。若指定元素不在列表中,或列表不存在时,不执行任何操作。
//参数:列表key,Redis::AFTER或Redis::BEFORE,基准元素,插入元素
//返回值:插入成功返回插入后列表元素个数,若基准元素不存在返回-1,若key不存在返回0,若key不是列表返回false。
$ret = $redis->lInsert('city', Redis::AFTER, 'chengshi', 'chengshiAFTER');
$ret = $redis->lInsert('city', Redis::BEFORE, 'chengshi', 'chengshiBEFORE');
移除列表中与参数value相等的元素
//根据第三个参数count的值,移除列表中与参数value相等的元素。
//count > 0 : 从表头开始向表尾搜索,移除与value相等的元素,数量为count。
//count < 0 : 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
//count = 0 : 移除表中所有与value相等的值。
//返回实际删除元素个数
$ret = $redis->lrem('city', 'chengshi', -2);
列表进行修剪
//对一个列表进行修剪,只保留指定区间的元素,其他元素都删除。成功返回true。
$ret = $redis->ltrim('city', 1, 4);
Set操作
//将一个元素加入集合,已经存在集合中的元素则忽略。若集合不存在则先创建,若key不是集合类型则返回false,若元素已存在返回0,插入成功返回1。
$ret = $redis->sAdd('myset', 'hello'.rand(0,10));
//返回集合中所有成员。
$ret = $redis->sMembers('myset');
//判断指定元素是否是指定集合的成员,是返回true,否则返回false。
$ret = $redis->sismember('myset', 'hello'.rand(0,10));
//返回集合中元素的数量。
$ret = $redis->scard('myset');
//移除并返回集合中的一个随机元素。
$ret = $redis->sPop('myset');
//返回集合中的一个或多个随机成员元素,返回元素的数量和情况由函数的第二个参数count决定:
//如果count为正数,且小于集合基数,那么命令返回一个包含count个元素的数组,数组中的元素各不相同。
//如果count大于等于集合基数,那么返回整个集合。
//如果count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值。
$ret = $redis->sRandMember('myset', 2);
var_dump($ret);
//移除集合中指定的一个元素,忽略不存在的元素。删除成功返回1,否则返回0。
$ret = $redis->srem('myset', 'hello');
var_dump($ret);
//迭代集合中的元素。
//参数:key,迭代器变量,匹配模式,每次返回元素数量(默认为10个)
$ret = $redis->sscan('myset', $it, 'h*', 5);
//将指定成员从一个源集合移动到一个目的集合。若源集合不存在或不包含指定元素则不做任何操作,返回false。
//参数:源集合,目标集合,移动元素
$ret = $redis->sMove('myset', 'myset2', 'hello1');
//返回所有给定集合之间的差集,不存在的集合视为空集。
$ret = $redis->sDiff('myset', 'myset2', 'myset3');
//将所有给定集合之间的差集存储在指定的目的集合中。若目的集合已存在则覆盖它。返回差集元素个数。
//参数:第一个参数为目标集合,存储差集。
$ret = $redis->sDiffStore('myset3', 'myset', 'myset2');
//返回所有给定集合的交集,不存在的集合视为空集。
$ret = $redis->sInter('myset', 'myset2', 'myset3');
//将所有给定集合的交集存储在指定的目的集合中。若目的集合已存在则覆盖它。返回交集元素个数。
//参数:第一个参数为目标集合,存储交集。
$ret = $redis->sInterStore('myset4', 'myset', 'myset2', 'myset3');
//返回所有给定集合的并集,不存在的集合视为空集。
$ret = $redis->sUnion('myset', 'myset2', 'myset3');
//将所有给定集合的并集存储在指定的目的集合中。若目的集合已存在则覆盖它。返回并集元素个数。
//参数:第一个参数为目标集合,存储并集。
$ret = $redis->sUnionStore('myset4', 'myset', 'myset2', 'myset3');
Zset操作
//将一个或多个成员元素及其分数值加入到有序集当中。如果某个成员已经是有序集的成员,则更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。分数值可以是整数值或双精度浮点数。
$ret = $redis->zAdd('scores', 98, 'English', 90, 'physics');
//返回有序集中指定区间内的成员。成员按分数值递增排序,分数值相同的则按字典序来排序。
//参数:第四个参数表示是否返回各个元素的分数值,默认为false。
$ret = $redis->zRange('scores', 0, -1, true);//查看Zset所有成员以及它们各自的分数值
//返回有序集中指定分数区间的成员列表,按分数值递增排序,分数值相同的则按字典序来排序。默认使用闭区间。
$ret = $redis->zRangeByScore('scores', 90, 100, ['withscores'=>true]);
//返回有序集中指定分数区间的成员列表,按分数值递减排序,分数值相同的则按字典序的逆序来排序。注意,区间表示的时候大值在前,小值在后,默认使用闭区间。
$ret = $redis->zRevRangeByScore('scores', 100, 90, ['withscores'=>true]);
//返回指定有序集的元素数量。
$ret = $redis->zCard('scores');
//返回有序集中指定分数区间的成员数量。
$ret = $redis->zCount('scores', 90, 100);
//返回有序集中指定成员的分数值。若成员不存在则返回false。
$ret = $redis->zScore('scores', 'math');
//返回有序集中指定成员的排名,按分数值递增排序。分数值最小者排名为0。
$res = $redis->zRank('scores','English');//scores--->key
//返回有序集中指定成员的排名,按分数值递减排序。分数值最大者排名为0。
$ret = $redis->zRevRank('scores', 'chemistry');
//移除有序集中的一个或多个成员,忽略不存在的成员。返回删除的元素个数。
$ret = $redis->zRem('scores', 'chemistry', 'English');
//移除有序集中指定排名区间的所有成员。
$ret = $redis->zRemRangeByRank('scores', 0, 2);
//移除有序集中指定分数值区间的所有成员。
$ret = $redis->zRemRangeByScore('scores', 80, 90);
//对有序集中指定成员的分数值增加指定增量值。若为负数则做减法,若有序集不存在则先创建,若有序集中没有对应成员则先添加,最后再操作。
$ret = $redis->zIncrBy('scores', 2, 'Chinese');
//计算给定一个或多个有序集的交集,并将其存储到一个目的有序集中。结果集中某个成员的分数值是所有给定集下该成员分数值之和。
$ret = $redis->zinterstore('zset3', 'zset2', 'zset1');
//计算给定一个或多个有序集的并集,并将其存储到一个目的有序集中。结果集中某个成员的分数值是所有给定集下该成员分数值之和。
$ret = $redis->zunionstore('zset3', 'zset2', 'zset1');
相关推荐
- Redis合集-使用benchmark性能测试
-
采用开源Redis的redis-benchmark工具进行压测,它是Redis官方的性能测试工具,可以有效地测试Redis服务的性能。本次测试使用Redis官方最新的代码进行编译,详情请参见Redis...
- Java简历总被已读不回?面试挂到怀疑人生?这几点你可能真没做好
-
最近看了几十份简历,发现大部分人不是技术差,而是不会“卖自己”——一、简历死穴:你写的不是经验,是岗位说明书!反面教材:ד使用SpringBoot开发项目”ד负责用户模块功能实现”救命写法:...
- redission YYDS(redission官网)
-
每天分享一个架构知识Redission是一个基于Redis的分布式Java锁框架,它提供了各种锁实现,包括可重入锁、公平锁、读写锁等。使用Redission可以方便地实现分布式锁。red...
- 从数据库行锁到分布式事务:电商库存防超卖的九重劫难与破局之道
-
2023年6月18日我们维护的电商平台在零点刚过3秒就遭遇了严重事故。监控大屏显示某爆款手机SKU_IPHONE13_PRO_MAX在库存仅剩500台时,订单系统却产生了1200笔有效订单。事故复盘发...
- SpringBoot系列——实战11:接口幂等性的形而上思...
-
欢迎关注、点赞、收藏。幂等性不仅是一种技术需求,更是数字文明对确定性追求的体现。在充满不确定性的网络世界中,它为我们建立起可依赖的存在秩序,这或许正是技术哲学最深刻的价值所在。幂等性的本质困境在支付系...
- 如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享
-
如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享在高流量场景下。首先,我需要回忆一下常见的优化策略,比如负载均衡、缓存、数据库优化、微服务拆分这些。不过,可能还需要考虑用户的具体情况,比...
- Java面试题: 项目开发中的有哪些成长?该如何回答
-
在Java面试中,当被问到“项目中的成长点”时,面试官不仅想了解你的技术能力,更希望看到你的问题解决能力、学习迭代意识以及对项目的深度思考。以下是回答的策略和示例,帮助你清晰、有说服力地展示成长点:一...
- 互联网大厂后端必看!Spring Boot 如何实现高并发抢券逻辑?
-
你有没有遇到过这样的情况?在电商大促时,系统上线了抢券活动,结果活动刚一开始,服务器就不堪重负,出现超卖、系统崩溃等问题。又或者用户疯狂点击抢券按钮,最后却被告知无券可抢,体验极差。作为互联网大厂的后...
- 每日一题 |10W QPS高并发限流方案设计(含真实代码)
-
面试场景还原面试官:“如果系统要承载10WQPS的高并发流量,你会如何设计限流方案?”你:“(稳住,我要从限流算法到分布式架构全盘分析)…”一、为什么需要限流?核心矛盾:系统资源(CPU/内存/数据...
- Java面试题:服务雪崩如何解决?90%人栽了
-
服务雪崩是指微服务架构中,由于某个服务出现故障,导致故障在服务之间不断传递和扩散,最终造成整个系统崩溃的现象。以下是一些解决服务雪崩问题的常见方法:限流限制请求速率:通过限流算法(如令牌桶算法、漏桶算...
- 面试题官:高并发经验有吗,并发量多少,如何回复?
-
一、有实际高并发经验(建议结构)直接量化"在XX项目中,系统日活用户约XX万,核心接口峰值QPS达到XX,TPS处理能力为XX/秒。通过压力测试验证过XX并发线程下的稳定性。"技术方案...
- 瞬时流量高并发“保命指南”:这样做系统稳如泰山,老板跪求加薪
-
“系统崩了,用户骂了,年终奖飞了!”——这是多少程序员在瞬时大流量下的真实噩梦?双11秒杀、春运抢票、直播带货……每秒百万请求的冲击,你的代码扛得住吗?2025年了,为什么你的系统一遇高并发就“躺平”...
- 其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。
-
其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。比如上周有个小伙伴找我,五年经验但简历全是'参与系统设计''优化接口性能'这种空话。我就问他:你做的秒杀...
- PHP技能评测(php等级考试)
-
公司出了一些自我评测的PHP题目,现将题目和答案记录于此,以方便记忆。1.魔术函数有哪些,分别在什么时候调用?__construct(),类的构造函数__destruct(),类的析构函数__cal...
- 你的简历在HR眼里是青铜还是王者?
-
你的简历在HR眼里是青铜还是王者?兄弟,简历投了100份没反应?面试总在第三轮被刷?别急着怀疑人生,你可能只是踩了这些"隐形求职雷"。帮3630+程序员改简历+面试指导和处理空窗期时间...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)