>백엔드 개발 >PHP 튜토리얼 >Redis의 7가지 일반적인 사용 시나리오(PHP 실용)

Redis의 7가지 일반적인 사용 시나리오(PHP 실용)

阿神
阿神원래의
2017-02-28 14:00:293323검색

Redis는 ANSI C 언어로 작성된 오픈소스 로그형 Key-Value 데이터베이스로, 네트워크를 지원하고, 메모리 기반 및 영속성이 있으며, 다국어로 API를 제공합니다.

이 글에서는 주로 Redis를 PHP와 함께 사용하는 주요 애플리케이션 시나리오를 소개합니다.


간단한 문자열 캐시 연습

$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 "---- 进队列成功 ---- <br /><br />";

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

//出队列
$redis->lpop($strQueueName);
echo "<br /><br /> ---- 出队列成功 ---- <br /><br />";

//查看队列
$strCount = $redis->lrange($strQueueName, 0, -1);
echo "当前队列数据为: <br />";
print_r($strCount);
//以下是 pub.php 文件的内容 cli下运行
ini_set(&#39;default_socket_timeout&#39;, -1);
$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strChannel = &#39;Test_bihu_channel&#39;;

//发布
$redis->publish($strChannel, "来自{$strChannel}频道的推送");
echo "---- {$strChannel} ---- 频道消息推送成功~ <br/>";
$redis->close();


간단한 카운터 연습

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

//订阅
echo "---- 订阅{$strChannel}这个频道,等待消息推送...----  <br/><br/>";
$redis->subscribe([$strChannel], &#39;callBackFun&#39;);
function callBackFun($redis, $channel, $msg)
{
    print_r([
        &#39;redis&#39;   => $redis,
        &#39;channel&#39; => $channel,
        &#39;msg&#39;     => $msg
    ]);
}

연습 순위 목록

$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strKey = &#39;Test_bihu_comments&#39;;

//设置初始值
$redis->set($strKey, 0);

$redis->INCR($strKey);  //+1
$redis->INCR($strKey);  //+1
$redis->INCR($strKey);  //+1

$strNowCount = $redis->get($strKey);

echo "---- 当前数量为{$strNowCount}。 ---- ";


단순 문자열 비관적 잠금 연습

설명: 비관적 잠금은 이름에서 알 수 있듯이 매우 비관적입니다.

데이터 얻으러 갈 때마다 남들이 수정할 것 같아서 데이터 얻을 때마다 잠궈둡니다.

시나리오: 프로젝트에서 캐시를 사용하고 캐시에 시간 초과가 설정된 경우.

동시성이 비교적 큰 경우, 잠금 메커니즘이 없으면 캐시가 만료되는 순간

많은 동시 요청이 캐시에 침투하여 데이터베이스에 직접 쿼리하게 됩니다. , 눈사태 효과를 유발합니다.

$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strKey = &#39;Test_bihu_score&#39;;

//存储数据
$redis->zadd($strKey, &#39;50&#39;, json_encode([&#39;name&#39; => &#39;Tom&#39;]));
$redis->zadd($strKey, &#39;70&#39;, json_encode([&#39;name&#39; => &#39;John&#39;]));
$redis->zadd($strKey, &#39;90&#39;, json_encode([&#39;name&#39; => &#39;Jerry&#39;]));
$redis->zadd($strKey, &#39;30&#39;, json_encode([&#39;name&#39; => &#39;Job&#39;]));
$redis->zadd($strKey, &#39;100&#39;, json_encode([&#39;name&#39; => &#39;LiMing&#39;]));

$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);


간단한 거래를 위한 낙관적 잠금 연습

설명 : Optimistic Lock은 이름에서 알 수 있듯이 매우 낙관적입니다.

데이터 얻으러 갈 때마다 남들이 수정하지 않을 것 같아서 잠그지 않을게요.

watch 명령은 지정된 키를 모니터링합니다. exec 중에 watch를 호출한 이후 모니터링되는 키가 변경된 경우 전체 트랜잭션이 실패합니다.

watch를 여러 번 호출하여 여러 키를 모니터링할 수도 있습니다. 이러한 방식으로 지정된 키에 낙관적 잠금을 추가할 수 있습니다.

Watch Key는 연결 전체에 유효하며, 트랜잭션에서도 마찬가지입니다.

연결이 끊어지면 시계와 거래가 모두 자동으로 지워집니다.

물론 exec, Discard 및 unwatch 명령은 연결의 모든 모니터링을 지웁니다.

아아아아
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.