PHP使用Redis常见7种使用场景

PHP使用Redis常见7种使用场景

本篇文章将简单大致介绍PHP使用Redis常见的7种使用场景

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

PHP使用 Redis 应用场景

  • 1、简单字符串缓存实战
  • 2、简单队列实战
  • 3、简单发布订阅实战
  • 4、简单计数器实战
  • 5、排行榜实战
  • 6、简单事务的悲观锁实战
  • 7、简单事务的乐观锁实战

简单字符串缓存实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$host = '127.0.0.1';
$port = 6379;
$redis = new \Redis();
$redis->connect($host, $port);
$str_cache_key = 'Test_bihu'; // 缓存字符串键
// set 应用 要缓存的数据
$arr_cache_data = [
'name' => 'huihui',
'sex' => '男',
'age' => '30'
];
$redis->set($str_cache_key, json_encode($arr_cache_data));
$redis->expire($str_cache_key, 30); # 设置30秒后过期
$json_data = $redis->get($str_cache_key);
$data = json_decode($json_data);
var_dump($data->age); // 输出数据

// hset 应用
$arr_web_site = [
'google' => [
'google.com',
'google.com.hk'
]
];
$redis->del($str_cache_key);
$redis->hSet($str_cache_key, 'google', json_encode($arr_web_site));
$json_data = $redis->hGet($str_cache_key, 'google');
$data = json_decode($json_data);
var_dump($data); // 输出数据

简单队列实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$host = '127.0.0.1';
$port = 6379;
$redis = new \Redis();
$redis->connect($host, $port);
$str_queue_name = 'Test_queue';
// 入队列
$redis->rPush($str_queue_name, json_encode(['uid' => 1, 'name' => 'Hui']));
$redis->rPush($str_queue_name, json_encode(['uid' => 2, 'name' => 'Tom']));
$redis->rPush($str_queue_name, json_encode(['uid' => 3, 'name' => 'John']));
echo '---入队列成功---<br /><br />';

// 查看队列
$str_count = $redis->lRange($str_queue_name, 0, -1);
echo '当前队列数据为:<br />';
var_dump($str_count);

// 出队列
$redis->lPop($str_queue_name);
echo '<br /><br />---出队列成功---<br /><br />';

// 查看队列
$str_count = $redis->lRange($str_queue_name, 0, -1);
echo '当前队列数据为:<br />';
var_dump($str_count);

简单发布订阅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
// 以下是 pub.php 文件的内容 cli下运行
ini_set('default_socket_timeout', -1);
$host = '127.0.0.1';
$port = 6379;
$redis = new \Redis();
$redis->connect($host, $port);
$str_channel = 'Test_channel';
// 发布
$redis->publish($str_channel, "来自{$str_channel}频道的推送");
echo "------ {$str_channel} ------ 频道消息推送成功~ <br />";
$redis->close();


// 以下是 sub.php 文件的内容 cli下运行
ini_set('default_socket_timeout', -1);
$host = '127.0.0.1';
$port = 6379;
$redis = new \Redis();
$redis->connect($host, $port);
$str_channel = 'Test_channel';
// 订阅
echo "------ 订阅{$str_channel}这个频道,等待消息推送... ------<br /><br />";
$redis->subscribe([$str_channel], 'callBackFun');
function callBackFun($redis, $channel, $msg) {
var_dump([
'redis' => $redis,
'channel' => $channel,
'msg' => $msg
]);
}

先运行 sub.php,订阅会挂起。
然后运行 pub.php,订阅会收到发布。

简单计数器实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$host = '127.0.0.1';
$port = 6379;
$redis = new \Redis();
$redis->connect($host, $port);
$str_key = "Test_comments";

// 设置初始值
$redis->set($str_key, 0);
$redis->incr($str_key); // +1
var_dump($redis->get($str_key));
$redis->incr($str_key); // +1
var_dump($redis->get($str_key));
$redis->incr($str_key); // +1
var_dump($redis->get($str_key));
$str_now_count = $redis->get($str_key);
echo "--- 当前数量为{$str_now_count}. ---";

排行榜实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$host = '127.0.0.1';
$port = 6379;
$redis = new \Redis();
$redis->connect($host, $port);
$str_key = "Test_score";

// 存储数据
$redis->zAdd($str_key, '50', json_encode(['name' => 'Tom']));
$redis->zAdd($str_key, '70', json_encode(['name' => 'John']));
$redis->zAdd($str_key, '90', json_encode(['name' => 'Jerry']));
$redis->zAdd($str_key, '30', json_encode(['name' => 'Job']));
$redis->zAdd($str_key, '100', json_encode(['name' => 'LiMing']));

$data_one = $redis->zRevRange($str_key, 0, -1, true);
echo "--- {$str_key}由大到小排序 ---<br /><br />";
var_dump($data_one);

echo PHP_EOL;

$data_two = $redis->zRange($str_key, 0, -1, true);
echo "<br /><br />--- {$str_key}由小到大排序 ---<br /><br />";
var_dump($data_two);

简单的悲观锁实战

概念理解:悲观锁(Pessimistic Lock),顾名思义,就是很悲观。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。

场景:如果项目中使用了缓存且对缓存设置了超时时间。当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,大量并发请求会穿透缓存直接查询数据库,造成雪崩效应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
class MyRedis
{
public $redis;

public function __construct($host, $port) {
$this->redis = new \Redis();
$this->redis->connect($host, $port);
}

/**
* 获取锁
* @param string $key 锁标识
* @param int $expire 锁过期时间
* @return bool
*/
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) {
$this->unlock($key);
$is_lock = $this->redis->setnx($key, time() + $expire);
}
}
return $is_lock ? true : false;
}

/**
* 释放锁
* @param string $key 锁标识
* @return int
*/
public function unlock($key = '')
{
return $this->redis->del($key);
}
}
$host = '127.0.0.1';
$port = 6379;
$redis_obj = new MyRedis($host, $port);

// 定义锁标识
$key = 'Test_lock';
// 获取锁
$is_lock = $redis_obj->lock($key, 10);
if ($is_lock) {
echo '成功获取锁' . PHP_EOL;
echo 'do sth...<br />' . PHP_EOL;
sleep(5);
echo 'success<br />';
$redis_obj->unlock($key);
} else { // 获取锁失败
echo '请求太频繁<br />';
}

简单事务的乐观锁

概念理解:乐观锁(Optimistic Lock), 顾名思义,就是很乐观。每次去拿数据的时候都认为别人不会修改,所以不会上锁。watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。 注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。
当然了exec,discard,unwatch命令都会清除连接中的所有监视。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$host = '127.0.0.1';
$port = 6379;
$redis = new \Redis();
$redis->connect($host, $port);

$str_key = 'Test_age';
$redis->set($str_key, 10);
$age = $redis->get($str_key);
echo "------ Current Age:{$age} ------" . PHP_EOL; // 10
$redis->watch($str_key);

// 开启事务
$redis->multi();
// 在这个时候新开了一个新会话执行
$redis2 = new \Redis();
$redis2->connect($host, $port);
$redis2->set($str_key, 30); // 新会话
$new_age = $redis->get($str_key);
echo "------ Current Age:{$new_age} ------" . PHP_EOL; // 30

$redis->set($str_key, 20);
$redis->exec();
$age = $redis->get($str_key);
echo "------ Current Age:{$age} ------" . PHP_EOL; // 30
// 当exec执行时,如果监视的key从调用watch后发生了变化,则整个事务会失败

以上就是PHP使用Redis常见7种使用场景的详细内容。

文章目录
  1. 1. PHP使用Redis常见7种使用场景
    1. 1.1. PHP使用 Redis 应用场景
    2. 1.2. 简单字符串缓存实战
    3. 1.3. 简单队列实战
    4. 1.4. 简单发布订阅
    5. 1.5. 简单计数器实战
    6. 1.6. 排行榜实战
    7. 1.7. 简单的悲观锁实战
    8. 1.8. 简单事务的乐观锁
本站总访问量 | 本页面被访问 | 您是第位小伙伴

© 炫彩信息科技有限公司 版权所有 备案号 : 赣ICP备19008485号