Predis는 PHP로 Redis에 연결하기 위한 연산 라이브러리이며, PHP5.3 이상만 지원하므로 측정된 성능은 평균 25,000회입니다. C 언어로 작성된 PHP 확장(예: C 확장 phpredis https://github.com/owlient/phpredis 사용)으로 변경하면 성능이 크게 향상될 것이라고 믿습니다.
세션 데이터를 redis에 저장하는 것도 매우 간단합니다. session.save_handler = redis session.save_path = “tcp://127.0.0.1:6379″
다음은 일부 작업을 요약한 것이며 지속적으로 업데이트될 예정입니다.
- //자동 로드를 사용하여 관련 라이브러리를 로드합니다. 여기서 초점은 $file;
- spl_autoload_register(function($class) {
- $file = __DIR__.'을 요구하는 것입니다. / lib/Predis/'.$class.'.php';
- if (file_exists($file)) {
- require $file;
- return true;
- }
- });
-
- //연결 IP, 포트 및 해당 데이터베이스 구성
- $server = array(
- 'host' => '127.0.0.1',
- 'port' => ; 6379,
- '데이터베이스' => 15
- );
- $redis = new Client($server);
-
- //일반 설정/가져오기 작업
- $ redis- >set('library', 'predis');
- $retval = $redis->get('library');
- echo $retval; //'predis' 표시
-
- //setex 저장 유효기간 설정
- $redis->setex('str', 10, 'bar') //저장 유효기간이 10초임을 나타냅니다
-
- //setnx/ msetnx는 동일합니다. 추가 작업의 경우 기존 값을 덮어쓰지 않습니다.
- $redis->setnx('foo',12) //true
- $redis->setnx('foo',34) ); //false
-
- //set의 변형인 getset 연산, 결과는 교체 전의 값을 반환합니다
- $redis->getset('foo',56);//returns 34
-
- // incrby/incr/decrby/decr 값을 늘리거나 줄입니다.
- $redis->incr('foo') //foo는 57
- $redis->incrby(' foo',2); //foo는 59입니다
-
- //exists는 특정 값이 존재하는지 감지합니다
- $redis->exists('foo');//true
-
- //del delete
- $redis->del('foo');//true
-
- //유형 감지, 문자열 반환 문자열, 목록 반환 목록, 집합 테이블 반환 집합/zset, 해시 테이블은 해시를 반환합니다
- $redis->type('foo');//존재하지 않으면 없음을 반환합니다
- $redis->set('str','test');
- $redis ->type('str '); //문자열, 반환 문자열
-
- //append는 기존 문자열에 연결됩니다.
- $redis->append('str','_123'); //누적된 값을 반환합니다. 문자열 길이는 8이고, 입력된 str은 'test_123'입니다
-
- //setrange 부분 교체 연산
- $redis->setrange('str',0,'abc' ); //return 3, 매개변수 2가 0이면 설정 작업
- $redis->setrange('str',2,'cd');//에서 대체를 나타내는 4를 반환합니다. 두 번째 문자 이후부터 'str'은 'abcd'입니다
-
- //substr 부분 획득 작업
- $redis->substr('str',0,2);// 0번째 문자, 두 번째 문자 가져오기, 총 3개, 'abc' 반환
-
- //strlen 문자열 길이 가져오기
- $redis->strlen('str') //Return 4
-
- //setbit/ getbit 비트 저장 및 검색
- $redis->setbit('binary',31,1); //31번째 비트에 1이 저장됨을 나타냅니다. 여기서 엔디안 문제가 발생합니까? 하지만 문제가 되지 않습니다. getbit에서는 문제가 발생합니다
- $redis->getbit('binary',31); //return 1
-
- //keys 퍼지 검색 함수, * 기호 및 ? 기호 지원(한 문자와 일치)
- $redis->set('foo1',123);
- $redis->set('foo2',456);
- $redis->keys('foo*'); // foo1과 foo2의 배열을 반환합니다.
- $redis->keys('f?o?') //위와 같습니다
-
- //randomkey는 무작위로 키를 반환합니다
- $redis->randomkey( ); //'foo1' 또는 'foo2' 및 redis에 존재하는 다른 키를 반환할 수 있습니다
-
- //rename/ renamenx는 키 이름을 바꿉니다. 차이점은 renamenx는 기존 키로의 변경을 허용하지 않는다는 것입니다. key
- $redis->rename('str','str2') //원래 이름이 'str'인 키를 ' str2'
-
- //expire 키 설정- 값의 적시성, ttl은 남은 유효 기간을 가져오고 지속은 영구 저장소로 재설정됩니다
- $redis->expire('foo', 1) // 유효기간을 1초로 설정
- $redis->ttl( 'foo'); //유효기간 값을 1초로 반환
- $redis->expire('foo'); //만료 취소 동작
-
- //dbsize 현재 Redis 데이터베이스의 총 레코드 수를 반환합니다.
- $redis->dbsize();
-
- /*
- 큐 작업
- * /
-
- //rpush/rpushx 순서가 지정된 목록 작업, 대기열에서 요소 삽입
- //lpush/lpushx와 rpush/rpushx의 차이점은 대기열의 헤드에 삽입된다는 점입니다. 위와 같이 'x'는 기존 키에서만 작동한다는 의미입니다.
- $redis->rpush('fooList', ' bar1') //목록의 길이를 반환합니다. 1
- $redis->lpush( 'fooList', 'bar0'); //목록의 길이를 반환합니다. 2
- $redis->rpushx(' fooList', 'bar2') //3을 반환합니다. rpushx는 기존 대기열에만 추가합니다. 그렇지 않으면 0을 반환합니다.
- //llen은 현재 목록 길이를 반환합니다.
- $redis->llen('fooList') ;//3
-
- //lrange는 대기열의 요소 범위를 반환합니다
- $redis->lrange('fooList',0,1); //0~1번째 요소를 포함하는 배열을 반환합니다. 총 2개의 요소
- $redis->lrange('fooList',0, -1);//0번째 요소를 두 번째 요소로 반환하는 것은 모든 요소를 반환하는 것과 동일합니다. redis에서 종종 음수로 사용되며, 아래와 동일합니다.
-
- //lindex는 다음 위치의 목록 요소를 반환합니다. 지정된 시퀀스 위치
- $redis->lindex('fooList',1); //'bar1'을 반환합니다
-
- //lset은 대기열의 지정된 위치에 있는 값을 수정합니다
- $ redis->lset('fooList',1,'123');//위치 1의 요소를 수정하고 true를 반환합니다
-
- //lrem 대기열의 왼쪽에서 지정된 수의 문자를 삭제합니다
- $redis->lrem('fooList',1,'_'); //큐(있는 경우)의 왼쪽에서 '_' 문자 1개를 삭제합니다(오른쪽에서 -1 사용).
-
- //lpop/rpop은 스택 구조와 유사한 가장 왼쪽 또는 가장 오른쪽 요소를 팝(및 삭제)합니다.
- $redis->lpop('fooList') //' bar0'
- $redis-> rpop('fooList'); //'bar2'
-
- //ltrim 대기열 수정, 왼쪽에서 몇 가지 요소 유지, 나머지 삭제
- $redis-> ,1); //왼쪽에서 0번째부터 첫 번째 요소 유지
-
- //rpoplpush 한 대기열의 요소를 팝하고 다른 대기열로 푸시
- $ redis->rpush('list1','ab0 ');
- $redis->rpush('list1','ab1');
- $redis->rpush('list2','ab2 ');
- $redis->rpush ('list2','ab3');
- $redis->rpoplpush('list1','list2');//결과 list1 =>array('ab0'),list2 =>array('ab1','ab2','ab3')
- $redis->rpoplpush('list2','list2');//또한 동일한 대기열에 적용되며 마지막 요소를 헤드로 이동합니다. list2 =>array('ab3','ab1','ab2 ' )
-
- //linsert는 대기열 중간에 지정된 요소 앞이나 뒤에 요소를 삽입합니다.
- $redis->linsert('list2', 'before','ab1','123') ; / /'ab1' 요소 앞에 '123'을 삽입함을 나타냅니다.
- $redis->linsert('list2', 'after','ab1','456') //'ab1' 요소 뒤에 '를 삽입함을 나타냅니다. 456'
-
- //blpop/brpop은 큐가 비어 있지 않을 때까지 차단하고 기다린 다음 가장 왼쪽 또는 가장 오른쪽 요소를 팝아웃합니다(이 함수는 PHP 외부에서 매우 유용하다고 할 수 있습니다)
- / / brpoplpush도 작업을 차단하고 기다리며 결과는 rpoplpush
- $redis->blpop('list3',10); //list3이 비어 있으면 첫 번째 요소가 팝될 때까지 기다립니다. 비어 있지 않습니다. 10초 후 시간 초과
-
- /**
- 테이블 조작 설정
- */
-
- //sadd가 요소를 추가하고, true를 반환하고, false를 반복적으로 반환합니다.
- $redis->sadd ('set1' ,'ab');
- $redis->sadd('set1','cd');
- $redis->sadd('set1','ef');
-
- //srem은 지정된 요소를 제거합니다.
- $redis->srem('set1','cd') //'cd' 요소를 삭제합니다.
-
- //spop은 첫 번째 요소
- $redis ->spop('set1');
-
- //smove는 현재 설정 테이블의 지정된 요소를 다른 설정 테이블로 이동합니다
- $redis->sadd(' set2','123');
- $redis->smove('set1','set2','ab');//'set1'의 'ab'를 'set2'로 이동하고 true 또는 false를 반환합니다.
-
- / /scard는 현재 세트 테이블의 요소 수를 반환합니다.
- $redis->scard('set2');//2
-
- //sismember는 요소가 요소인지 여부를 결정합니다. 현재 테이블에 속함
- $redis-> sismember('set2','123'); //true 또는 false
-
- //smembers는 현재 테이블의 모든 요소를 반환합니다
- $redis ->smembers('set2'); //array( '123','ab');
-
- //sinter/sunion/sdiff 두 테이블에 있는 요소의 교집합/합집합/보수를 반환합니다.
- $redis->sadd('set1', 'ab');
- $redis->sinter('set2','set1') //배열 반환('ab')
-
- //sinterstore/sunionstore/sdiffstore 두 테이블 결합 교집합/합집합/보완 요소를 세 번째 테이블에 복사
- $redis->set('foo',0);
- $redis-> ;sinterstore('foo','set1') ; //'set1'의 내용을 'foo'에 복사하고 'foo'를 세트 테이블로 변환하는 것과 같습니다
- $redis->sinterstore('foo ',array('set1',' set2')); //'set1'과 'set2'의 동일한 요소를 'foo' 테이블에 복사하여 'foo'의 원래 내용을 덮어씁니다
-
- / /srandmember는 테이블의 임의 요소를 반환합니다.
- $redis->srandmember('set1');
-
- /**
- 주문한 세트 테이블 운영
- */
-
- //sadd는 요소를 추가하고 일련 번호를 설정하고, true를 반환하고, 반복하면 false를 반환합니다.
- $redis->zadd('zset1',1,'ab');
- $redis->zadd('zset1',2,' cd');
- $redis-> zadd('zset1',3,'ef');
-
- //zincrby는 지정된 요소의 인덱스 값을 늘리거나 줄이고 순서를 변경합니다. elements
- $redis->zincrby('zset1',10 ,'ab');//Return 11
-
- //zrem은 지정된 요소를 제거합니다
- $redis->zrem(' zset1','ef'); //true 또는 false
-
- //zrange는 테이블의 지정된 범위에 있는 요소를 위치 순서로 반환합니다.
- $redis->zrange('zset1',0 ,1); //위치 0과 1(2) 사이의 요소를 반환합니다.
- $redis->zrange('zset1',0,-1);//위치 0과 첫 번째 요소 사이의 요소를 반환합니다. 마지막 (모든 요소와 동일)
-
- //zrevrange 위와 동일, 테이블의 지정된 범위에 있는 요소를 역순으로 반환
- $redis->zrevrange('zset1',0 ,-1); //요소 순서가 zrange와 반대입니다
-
- //zrangebyscore /zrevrangebyscore는 테이블의 지정된 인덱스 범위에 있는 요소를 순서/내림차순으로 반환합니다
- $redis-> zadd('zset1',3,'ef');
- $redis->zadd('zset1',5 ,'gh');
- $redis->zrangebyscore('zset1',2, 9); //인덱스 값 2~9 사이의 요소 array('ef','gh')
- 반환 //매개변수 형식
- $redis->zrangebyscore('zset1',2,9, 'withscores'); //인덱스 값 2-9 사이의 요소를 반환하고 인덱스 값을 포함합니다. array(array('ef' ,3),array('gh',5))
- $redis-> zrangebyscore('zset1',2,9,array('withscores' =>true,'limit'=>array(1 , 2))) //인덱스 값 2-9 사이의 요소 반환, 'withscores ' =>true는 인덱스 값을 포함한다는 의미입니다. 'limit'=>array(1, 2)는 최대 2개 항목을 반환한다는 의미입니다. 결과는 array(array('ef',3),array('gh'입니다. ,5))
-
- //zunionstore/zinterstore 여러 테이블의 합집합/교집합을 다른 테이블에 저장
- $redis->zunionstore('zset3',array('zset1','zset2', 'zset0')); //'zset1','zset2','zset0'의 합집합을 'zset3'에 저장
- //기타 매개변수
- $redis->zunionstore('zset3',array( 'zset1','zset2'),array('weights' => array(5,0)));/ /weights 매개변수는 가중치를 나타냅니다. 즉, 합집합 후 5보다 큰 값을 가진 요소의 순위가 매겨집니다. 먼저, 0보다 큰 요소는 마지막으로 순위가 매겨집니다.
- $redis->zunionstore('zset3',array('zset1','zset2') ,array('aggregate' => 'max'));/ /'aggregate' => 'max' 또는 'min'은 합집합 후 동일한 요소가 큰 값을 취하는지 작은 값을 취하는지 나타냅니다.
-
- //zcount는 인덱스 범위의 요소 수를 계산합니다
- $redis->zcount('zset1',3,5);//2
- $redis->zcount('zset1',' (3',5)) //'(3'은 다음을 나타냅니다. 인덱스 값은 3-5 사이이지만 3을 포함하지 않습니다. 마찬가지로 '(5'를 사용하여 상한이 5이지만 5를 포함하지 않음을 나타낼 수도 있습니다.
-
- //zcard는 개수를 계산합니다. elements
- $redis->zcard('zset1');//4
-
- //zscore는 요소의 인덱스를 쿼리합니다
- $redis->zscore('zset1','ef');//3
-
- //zremrangebyscore는 인덱스 범위의 요소를 삭제합니다
- $redis->zremrangebyscore('zset1',0, 2); //0-2('ab', 'cd') 사이의 인덱스를 가진 요소를 삭제하고, 삭제된 요소의 수를 반환합니다. 2
-
- //zrank/zrevrank는 테이블의 순서/내림차순을 반환합니다. 요소가 있는 위치 위치(인덱스 아님)
- $redis->zrank('zset1','ef');//첫 번째 요소이므로 0을 반환합니다. zrevrank는 1(마지막 요소)을 반환합니다. >
- //zremrangebyrank는 테이블의 지정된 위치 범위에 있는 요소를 삭제합니다
- $redis->zremrangebyrank('zset1',0,10) //위치 0-10의 요소를 삭제하고 개수를 반환합니다. 삭제된 요소 2
-
- /**
- 해시 테이블 연산
- */
-
- //hset/hget 해시 테이블 데이터 액세스
- $redis->hset('hash1','key1', 'v1'); //'key1' 키와 'v1' 값을 갖는 요소를 hash1 테이블에 저장
- $redis->hset('hash1','key2','v2');
- $redis ->hget('hash1','key1'); //'hash1' 테이블에서 'key1' 키의 값을 가져오고 'v1'을 반환합니다.
-
- //hexists는 해시에 지정된 키를 반환합니다. table
- $redis->hexists ('hash1','key1'); //true 또는 false
-
- //hdel 해시 테이블에서 지정된 키의 요소를 삭제합니다
- $redis-> ;hdel('hash1','key2'); //true 또는 false
-
- //hlen은 해시 테이블 요소 수를 반환합니다
- $redis->hlen('hash1 '); //1
-
- //hsetnx는 요소를 추가하지만 반복할 수는 없습니다.
- $redis->hsetnx('hash1','key1','v2') //false
- $redis-> hsetnx('hash1','key2','v2'); //true
-
- //hmset/hmget은 해시 테이블에 대한 여러 요소에 액세스합니다
- $redis-> ;hmset('hash1' ,array('key3'=>'v3','key4'=>'v4'));
- $redis->hmget('hash1',array('key3' ,'key4')) ; //해당 값을 반환합니다 array('v3','v4')
-
- //hincrby는 지정된 키를 누적합니다
- $redis->hincrby('hash1', 'key5',3 ); //3을 반환
- $redis->hincrby('hash1','key5',10); //13을 반환
-
- //hkeys 해시 테이블
- $redis->hkeys('hash1'); //return array('key1','key2','key3','key4','key5')
-
- // hvals는 해시 테이블로 반환됩니다. 모든 값
- $redis->hvals('hash1') //return array('v1','v2','v3','v4',13)
-
- //hgetall 전체 해시 테이블 요소를 반환합니다
- $redis->hgetall('hash1') //return array('key1'=>'v1','key2'=>'v2' ,'key3'=> ;'v3','key4'=>'v4','key5'=>13)
-
- /**
- 정렬 작업
- */
-
- / /sort sort
- $redis->rpush('tab',3);
- $redis->rpush('tab',2);
- $redis->rpush('tab' ,17);
- $redis->sort('tab'); //배열(2,3,17) 반환
- //매개변수 사용 array('sort' => 'desc', 'limit'는 조합하여 사용할 수 있습니다 => array(1, 2))
- $redis->sort('tab',array('sort' => 'desc')); 내림차순, return array(17,3, 2)
- $redis->sort('tab',array('limit' => array(1, 2))) //1의 2개 요소 반환 시퀀스 위치(여기서 2는 위치가 아닌 숫자를 나타냄)에서 array(3,17)
- $redis->sort('tab',array('limit' => array('alpha' =)를 반환합니다. > true))); // 첫 번째 문자를 기준으로 정렬하고 배열(17,2,3)을 반환합니다. 17의 첫 번째 문자가 '1'이므로 첫 번째 위치는
- $redis->sort입니다. ('tab',array('limit' => ; array('store' => 'ordered')))) //영구 정렬을 나타내며 요소 수를 반환합니다
- $redis->sort(' tab',array('limit' => array ('get' => 'pre_*'))); //와일드카드 문자 '*'는 요소를 필터링하는 데 사용됩니다. 즉, 'pre_로 시작하는 요소만 필터링됩니다. '가 반환됩니다.
-
- /**
- Redis 관리 작업
- */
-
- //select는 운용할 데이터베이스를 지정합니다.
- $redis->select('mydb') //specify mydb, 존재하지 않으면 생성
-
- //flushdb 현재 라이브러리 지우기
- $redis->flushdb();
-
- //move는 현재 라이브러리의 요소를 이동합니다. 다른 라이브러리로
- $redis->set('foo', 'bar');
- $redis->move('foo', 'mydb2') //'mydb2' 라이브러리가 존재하는 경우
-
- //info는 서비스 상태 정보를 표시합니다
- $redis->info( ; redis->slaveof(); //슬레이브 서버 지우기
-
- //서버 데이터 저장 동기식으로 디스크에
- $redis->save();
- //서버 데이터를 디스크에 비동기식으로 저장
- $redis->bgsave();
- //??
- $redis ->bgrewriteaof();
- //디스크가 마지막으로 업데이트된 시간을 반환합니다
- $redis-> lastsave();
-
- //여러 키-값 설정/가져오기
- $mkv = array(
- 'usr:0001' => '첫 번째 사용자',
- 'usr: 0002' => '두 번째 사용자',
- 'usr:0003' => '세 번째 사용자'
- );
- $redis->mset($mkv); //해당 값을 여러 개 저장
- $retval = $redis->mget(array_keys($mkv)); 여러 키에 해당하는 값
- print_r($retval);
-
- //일괄 작업
- $replies = $redis->pipeline(function($pipe) {
- $pipe-> ;ping();
- $pipe->flushdb();
- $pipe- >incrby('counter', 10) //증분 연산
- $pipe->incrby('counter ', 30);
- $pipe->exists('counter');
- $pipe->get('counter');
- $pipe->mget('does_not_exist', ' 카운터');
- });
- print_r($replies);
-
- //CAS,사건성操작
-
- function zpop($client, $zsetKey) {
- $element = null;
- $options = array(
- 'cas' => true, // CAS 연산 지원으로 초기화
- 'watch' => $zsetKey, // 변경 사항을 감지하기 위해 감시해야 하는 키
- 'retry' => 3, // 중단된 트랜잭션에 대한 재시도 횟수,
- // 클라이언트가 예외로 구제된 후.
- );
-
- $txReply = $client- >multiExec($options, function($tx)
- use ($zsetKey, &$element) {
- @list($element) = $tx->zrange($zsetKey, 0, 0);
- if (isset($element)) {
- $tx->multi(); // CAS를 사용하면 MULTI가 명시적으로 호출되어야 합니다.
- $tx->zrem($zsetKey, $element);
- }
- });
- return $element;
- }
- $zpopped = zpop($redis, 'zset');
- echo isset($zpopped) ? "ZPOPed $zpopped": "ZPOP에 아무 것도 없습니다!", "n";
-
- //对存取的key加前缀,如: 'nrk:'
- $redis->getProfile() ->setPreprocessor(new KeyPrefixPreprocessor('nrk:'));
-
- //分布式存储적 일些방법
- $multiple_servers = array(
- array(
- 'host' => ; '127.0.0.1',
- '포트' => 6379,
- '데이터베이스' => 15,
- '별칭' => array(
- '호스트' => '127.0.0.1',
- '포트' => 6380,
- '데이터베이스' => 15,
- '별칭' => '초 ',
- ),
- );
-
- predistributionIDistributionStrategy 사용;
-
- NaiveDistributionStrategy 클래스는 IDistributionStrategy {
- private $_nodes, $_nodesCount;
-
- 공개 함수를 구현합니다. __constructor() {
- $this->_nodes = array();
- $this->_nodesCount = 0;
- }
-
- 공용 함수 add($node, $weight = null) {
- $this->_nodes[] = $node;
- $this->_nodesCount ;
- }
-
- 공용 함수 제거($node) {
- $ this->_nodes = array_filter($this->_nodes, function($n) use($node) {
- return $n !== $node;
- });
- $this- >_nodesCount = count($this->_nodes);
- }
-
- 공개 함수 get($key) {
- $count = $this->_nodesCount;
- if ( $count === 0) {
- throw new RuntimeException('연결 없음');
- }
- return $this->_nodes[$count > 1? abs(crc32($key) % $count) : 0];
- }
-
- 공개 함수 generateKey($value) {
- return crc32($value);
- }
- }
-
- //配置键分布策略
- $options = array(
- 'key_distribution' => new NaiveDistributionStrategy(),
- );
-
- $redis = new PredisClient($multiple_servers, $options);
-
- for ($i = 0; $i set("key:$i", str_pad($i, 4, '0', 0));
- $redis->get("key:$i");
- }
-
- $server1 = $redis->getClientFor('first')->info();
- $server2 = $redis->getClientFor('second')->info();
-
- printf("서버 '%s'에는 %d개의 키가 있고 서버 '%s'에는 %d개의 키가 있습니다. n",
- '첫 번째', $server1['db15']['keys'], '두 번째', $server2['db15']['keys']
- );
-
-
제조대码
|
PHP, 레디스, 프레디스