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实战篇——常用的使用场景相关推荐

  1. 黑马Redis视频教程实战篇(三)

    目录 一.优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒 ...

  2. 【Redis】实战篇:优惠卷秒杀 (库存超卖问题、一人一单问题)

    文章目录 3.1 全局唯一ID 3.2 -Redis实现全局唯一Id 3.3 添加优惠卷 3.4 实现秒杀下单 3.5 库存超卖问题分析 3.6 乐观锁解决超卖问题 3.7 优惠券秒杀-一人一单 3. ...

  3. 黑马Redis学习——实战篇(4)

    目录 4.分布式锁 4.1 .基本原理和实现方式对比 4.2 .Redis分布式锁的实现核心思路 4.3 实现分布式锁版本一 4.4 Redis分布式锁误删情况说明 4.5 解决Redis分布式锁误删 ...

  4. 黑马Redis视频教程实战篇(五)

    目录 一.达人探店 1.1.发布探店笔记 1.2.查看探店笔记 1.3.点赞功能 1.4.点赞排行榜 二.好友关注 2.1.关注和取消关注 2.2.共同关注 2.3.Feed流实现方案 2.4.推送到 ...

  5. 黑马Redis视频教程实战篇(六)

    目录 一.附近商户 1.1.GEO数据结构的基本用法 1.2.导入店铺数据到GEO 1.3.实现附近商户功能 二.用户签到 2.1.BitMap功能演示 2.2.实现签到功能 2.3.签到统计 2.4 ...

  6. Redis入门到实战(实战篇)缓存更新、穿透、雪崩、击穿!

    Redis基础篇 Java面试宝典-redis 实战篇Redis 开篇导读 亲爱的小伙伴们大家好,马上咱们就开始实战篇的内容了,相信通过本章的学习,小伙伴们就能理解各种redis的使用啦,接下来咱们来 ...

  7. Redis总结_实战篇

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 实战篇Redis 开篇导读 1.短信登录 1.1.导入黑马点评项目 1.1.1 .导入SQL 1.1.2.有关当前模型 1. ...

  8. Redis学习笔记②实战篇_黑马点评项目

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  9. redis常用数据类型的场景,你真的用对了么?

    关注微信公众号"虾米聊吧",每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流. redis常用数据类型的场景,你真的用对了么? redis常用数 ...

最新文章

  1. 漫话:敏捷Scrum研发技术与过程管理实践
  2. Java后端:Linux的基本使用学习笔记
  3. 解析远程服务器响应错误,远程服务器返回一个意外的响应:(400)错误的请求,WCF...
  4. geth bootnodes
  5. App设计灵感之十二组精美的手机闹钟App设计案例
  6. python类属性初始化_Python:如何模拟类属性初始化函数
  7. 特斯拉为何使用.NET 技术栈?
  8. 计算机专业接本应用心理学,专接本接应用心理学但遇到阻挠?
  9. ofbiz mysql_ofbiz+mysql安装求教
  10. python一次性输入多个数_python如何利用input函数输入多个参数?
  11. Mac不用Boot Camp 安装双系统
  12. python实现seo疯狂外链发送工具
  13. 国风PPT自制卷轴动效,你的PPT也能很“香“
  14. 编译MKL50.1 (for 一加手机)
  15. dfuse 现在正式面向商业部署
  16. java实现订单未支付失效_Java微信支付之关闭订单
  17. 技术总监做技术经理的工作,技术经理做研发的工作是怎么回事?
  18. 基于ANSYS WORKBENCH的装配体分析
  19. 世界杯吉祥物玩偶难产?俄罗斯人紧急求助这个杭州男人
  20. 程序员谈谈返利机器人

热门文章

  1. 滤波器的抽头系数、通带、阻带、过渡带
  2. 幻方 java_Java三阶幻方的8种结果输出
  3. Python实现knn分类算法(Iris 数据集)
  4. Linux学习笔记——文件大小和文件压缩命令
  5. mysql中用户权限的授予_如何在MySQL中创建用户和授予权限
  6. web网络知识(一)公网IP、内网IP
  7. 淘宝/天猫撸猫猫领喵币、京东全民营业领京豆二合一助手,自动完成双11任务,分享源码
  8. 一文饱览年度AI盛宴!WAVE SUMMIT+2021峰会精彩回顾
  9. 【树莓派】关于树莓派2代,更新最新内核后,DS18B20温度传感器无法找到对应文件的问题的解决
  10. 迄今最全人脸识别开源