Redis-PHP实战篇——常用的使用场景
redis-php实战
public function getRedis()
{$redis = new \Redis();$redis->connect(env("REDIS_MASTER",'127.0.0.1'),6379);$redis->auth(env('REDIS_AUTH','123456'));return $redis;
}$redis = $this->getRedis();
String 简单字符串缓存实战
$key = 'str:name';// 字符串缓存实战
$redis->set($key, 'WXiangQian');
$name = $redis->get($key);
echo $name; // WXiangQian
$redis->expire($strCacheKey, 30); # 设置30秒后过期
HSET 简单哈希缓存实战
$key = 'hset:name'$uid = 1;
$redis->hSet($key, $uid, 'WXiangQian');
$data = $redis->hGet($key, 1);
print_r($data); //输出数据
排行榜实战
$strKey = 'zset:ranking_list';//存储数据
$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}由大到小的排序 ---- <br /><br />";
print_r($dataOne);$dataTwo = $redis->ZRANGE($strKey, 0, -1, true);
echo "<br /><br />---- {$strKey}由小到大的排序 ---- <br /><br />";
print_r($dataTwo);
list分页实战
$strKey = 'list:data';
$page = $request->input('page',1);
$pageSize = $request->input('limit',50);
$limit_s = ($page-1) * $pageSize;
$limit_e = ($limit_s + $pageSize) - 1;
$data = $tools->redis->lRange($strKey,$limit_s,$limit_e);
print_r($data);
简单字符串悲观锁实战
解释:悲观锁(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 = 'str:lock';// 获取锁
$is_lock = lock($key, 10);
if ($is_lock) {echo 'get lock success<br>';echo 'do sth..<br>';sleep(5);echo 'success<br>';unlock($key);
} else { //获取锁失败echo 'request too frequently<br>';
}
简单事务的乐观锁实战
解释:乐观锁(Optimistic Lock), 顾名思义,就是很乐观。
每次去拿数据的时候都认为别人不会修改,所以不会上锁。
watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。
也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。
注意watch的key是对整个连接有效的,事务也一样。
如果连接断开,监视和事务都会被自动清除。
当然了exec,discard,unwatch命令都会清除连接中的所有监视。
$strKey = 'str:age';$redis->set($strKey,10);$age = $redis->get($strKey);echo "---- Current Age:{$age} ---- <br/><br/>"; // 10$redis->watch($strKey);// 开启事务
$redis->multi();//-------------------------------
/*** 在这个时候新开了一个新会话执行** redis-cli 执行 $redis->set($strKey,30); //新会话 模拟其他终端* 这时候$age=30; //30*/
//-------------------------------$redis->set($strKey,20);$redis->exec();$age = $redis->get($strKey);echo "---- Current Age:{$age} ---- <br/><br/>"; //30//当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败
悲观锁与乐观锁的适用场景:
悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。
乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。
总结:两种所各有优缺点,读取频繁使用乐观锁,写入频繁使用悲观锁。
像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适,之所以用悲观锁就是因为两个用户更新同一条数据的概率高,也就是冲突比较严重的情况下,所以才用悲观锁.
悲观锁比较适合强一致性的场景,但效率比较低,特别是读的并发低。乐观锁则适用于读多写少,并发冲突少的场景
redis篇集合
Redis基础篇——Redis安装
Redis基础篇——介绍以及了解
Redis基础篇——基本用法
Redis进阶篇——PHP连接redis
Redis-PHP实战篇——常用的使用场景
Redis-PHP实战篇——常用的使用场景相关推荐
- 黑马Redis视频教程实战篇(三)
目录 一.优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒 ...
- 【Redis】实战篇:优惠卷秒杀 (库存超卖问题、一人一单问题)
文章目录 3.1 全局唯一ID 3.2 -Redis实现全局唯一Id 3.3 添加优惠卷 3.4 实现秒杀下单 3.5 库存超卖问题分析 3.6 乐观锁解决超卖问题 3.7 优惠券秒杀-一人一单 3. ...
- 黑马Redis学习——实战篇(4)
目录 4.分布式锁 4.1 .基本原理和实现方式对比 4.2 .Redis分布式锁的实现核心思路 4.3 实现分布式锁版本一 4.4 Redis分布式锁误删情况说明 4.5 解决Redis分布式锁误删 ...
- 黑马Redis视频教程实战篇(五)
目录 一.达人探店 1.1.发布探店笔记 1.2.查看探店笔记 1.3.点赞功能 1.4.点赞排行榜 二.好友关注 2.1.关注和取消关注 2.2.共同关注 2.3.Feed流实现方案 2.4.推送到 ...
- 黑马Redis视频教程实战篇(六)
目录 一.附近商户 1.1.GEO数据结构的基本用法 1.2.导入店铺数据到GEO 1.3.实现附近商户功能 二.用户签到 2.1.BitMap功能演示 2.2.实现签到功能 2.3.签到统计 2.4 ...
- Redis入门到实战(实战篇)缓存更新、穿透、雪崩、击穿!
Redis基础篇 Java面试宝典-redis 实战篇Redis 开篇导读 亲爱的小伙伴们大家好,马上咱们就开始实战篇的内容了,相信通过本章的学习,小伙伴们就能理解各种redis的使用啦,接下来咱们来 ...
- Redis总结_实战篇
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 实战篇Redis 开篇导读 1.短信登录 1.1.导入黑马点评项目 1.1.1 .导入SQL 1.1.2.有关当前模型 1. ...
- Redis学习笔记②实战篇_黑马点评项目
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...
- redis常用数据类型的场景,你真的用对了么?
关注微信公众号"虾米聊吧",每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流. redis常用数据类型的场景,你真的用对了么? redis常用数 ...
最新文章
- 漫话:敏捷Scrum研发技术与过程管理实践
- Java后端:Linux的基本使用学习笔记
- 解析远程服务器响应错误,远程服务器返回一个意外的响应:(400)错误的请求,WCF...
- geth bootnodes
- App设计灵感之十二组精美的手机闹钟App设计案例
- python类属性初始化_Python:如何模拟类属性初始化函数
- 特斯拉为何使用.NET 技术栈?
- 计算机专业接本应用心理学,专接本接应用心理学但遇到阻挠?
- ofbiz mysql_ofbiz+mysql安装求教
- python一次性输入多个数_python如何利用input函数输入多个参数?
- Mac不用Boot Camp 安装双系统
- python实现seo疯狂外链发送工具
- 国风PPT自制卷轴动效,你的PPT也能很“香“
- 编译MKL50.1 (for 一加手机)
- dfuse 现在正式面向商业部署
- java实现订单未支付失效_Java微信支付之关闭订单
- 技术总监做技术经理的工作,技术经理做研发的工作是怎么回事?
- 基于ANSYS WORKBENCH的装配体分析
- 世界杯吉祥物玩偶难产?俄罗斯人紧急求助这个杭州男人
- 程序员谈谈返利机器人
热门文章
- 滤波器的抽头系数、通带、阻带、过渡带
- 幻方 java_Java三阶幻方的8种结果输出
- Python实现knn分类算法(Iris 数据集)
- Linux学习笔记——文件大小和文件压缩命令
- mysql中用户权限的授予_如何在MySQL中创建用户和授予权限
- web网络知识(一)公网IP、内网IP
- 淘宝/天猫撸猫猫领喵币、京东全民营业领京豆二合一助手,自动完成双11任务,分享源码
- 一文饱览年度AI盛宴!WAVE SUMMIT+2021峰会精彩回顾
- 【树莓派】关于树莓派2代,更新最新内核后,DS18B20温度传感器无法找到对应文件的问题的解决
- 迄今最全人脸识别开源