반응형
redis의 추가 삭제 및 재조사를 위한 운영 라이브러리 공유
사용하기 전에 서버가 redis 서비스 및 redis 확장을 시작하는지 확인해야 합니다
<?php
namespace rely\cache;
use rely\init\Config;
/**
* Class Redis
* @package rely\cache
* @author Mr.taochuang <mr_taochuang@163.com>
* @date 2019/7/4 14:07
* 레디스 캐시
*/
class Redis extends Config{
/**
* @var \Redis;
*redis 인스턴스 클래스
*/
protected static $redis;
private static $table = ''; //데이터 테이블 이름
private static $where = []; //지정한 id의 데이터를 검색합니다
/**
* @param string $host
* @param string $port
* @param string $database
* @param string $prefix
* @return $this
* redis 연결
*/
public function connection($host = '127.0.0.1', $port = '6379', $database= '1', $prefix = 'db'){
self::set('host',$host);
self::set('port',$port);
self::set('database',$database);
self::set('prefix',$prefix);
self::$redis = new \Redis();
self::$redis->connect($host, $port);
self::$redis->select($database);
if(is_null(self::$redis)) throw new \Exception('연결 실패 redis');
return $this;
}
/**
* @param $table
* @return $this
* 표명
*/
public function name($table)
{
self::$table = $table;
return $this;
}
/**
* @param $param
* @return $this
* 지정한 ID의 데이터를 가져옵니다
*/
public function where($param)
{
if (is_array($param)) {
self::$where = $param;
} else {
self::$where = explode(',', $param);
}
return $this;
}
/**
* @param $data
* @return bool|int|string
* @throws \Exception
* 데이터 추가
*/
public function insert(Array $data)
{
$id = self::$redis->get(self::$table)??0;
$id=$id+1;
self::$redis->set(self::$table . '_id', $id);
if (empty(self::$table)) throw new \Exception('데이터시트를 설정하세요');
self::$redis->hMset(self::$table . '_' . $id, $data);
self::$redis->zAdd(self::get('prefix') . '_' . self::$table, $id, $id);
return $id;
}
/**
* @return array
* 모든 데이터 조회
*/
public function select()
{
$data = [];
if (empty(self::$where)) {
$count = self::count();
$result = self::$redis->ZRANGE(self::get('prefix') . '_' . self::$table, 0, $count);
foreach ($result as $id) {
$data[$id] = self::$redis->hGetAll(self::$table . '_' . $id);
}
} else {
foreach (self::$where as $id) {
$data[$id] = self::$redis->hMGet(self::$table . '_' . $id, self::$where);
}
}
return $data;
}
public function ids($position,$count){
return self::$redis->ZRANGE(self::get('prefix') . '_' . self::$table, $position, $count);
}
/**
* @param int $page_num
* @param null $page
* @return array
* 페이지를 나누어 redis 안의 값을 꺼낸다
*/
public function paginate($page_num = 15, $page = null)
{
if (is_null($page)) $page =$_REQUEST['page'];
empty($page) ? $page = 1 : true;
$start = ($page - 1) * $page_num;
$end = ($start + $page_num) - 1;
$count = self::count();
$result = self::$redis->ZRANGE(self::get('prefix') . '_' . self::$table, $start, $end);
$last_page = ceil($count / $page_num);
$data = array();
foreach ($result as $id) {
$data[$id] = self::$redis->hGetAll(self::$table . '_' . $id);
if (count(self::$where) > 0) {
$pageList[] = self::$redis->hMGet(self::$table . '_' . $id, self::$where);
} else {
$pageList[] = self::$redis->hGetAll(self::$table . '_' . $id);
}
}
return ['total' => $count, 'per_page' => $page_num, 'current_page' => $page, 'last_page' => $last_page, 'data' => $data];
}
/**
* @param $data
* @param $id
* @return mixed
* 지정한 데이터 수정
*/
public function update($data, $id)
{
self::$redis->del(self::$table . '_' . $id);
self::$redis->hMset(self::$table . '_' . $id, $data);
return $id;
}
/**
* @param $id
* @return bool
* redis 캐시 데이터 삭제
*/
public function delete($id)
{
if (!is_array($id)) $id = explode(',', $id);
foreach ($id as $maps) {
self::$redis->del(self::$table . '_' . $maps);
self::$redis->zRem(self::get('prefix') . '_' . self::$table, $maps);
}
return true;
}
/**
* @param string $field
* @return array
* 모든 redis key 가져오기
*/
public function keys($field = '*')
{
return self::$redis->keys($field);
}
/**
* @return int
* 가져온 데이터의 총 개수
*/
public function count()
{
return self::$redis->zCard(self::get('prefix') . '_' . self::$table);
}
/**
* @return \Redis
* 초기 redis
*/
public static function instance()
{
return self::$redis;
}
/*
* Db 테이블 비우기
* @return bool
*/
public function clear()
{
self::$redis->flushDB();
return true;
}
/**
* 모든 테이블 데이터 비우기
*/
public function truncate()
{
self::$redis->flushAll();
return true;
}
}
config.php 라이브러리
<?php
namespace rely\init;
/**
* Class Config
* @package rely\curl
* @author Mr.taochuang <mr_taochuang@163.com>
* @date 2019/7/3 11:25
* 설정 클래스
*/
class Config implements \ArrayAccess
{
/**
* @var array
* 설정 정보
*/
private static $config = [];
/**
* @param $config
* 설정 초기화
*/
public function __construct($config=[])
{
self::$config = array_merge(self::$config, $config);
}
/**
* @param string|null $field
* @return array
* Config 설정 매개 변수 가져오기
*/
public static function get(string $field = null)
{
if (is_null($field)) return self::$config;
return isset(self::$config[$field]) ? self::$config[$field] : null;
}
/**
* @param string $field
* @param $value
* @return $this
* Config 매개 변수 설정
*/
public function set(string $field, $value)
{
self::$config[$field] = $value;
return $this;
}
/**
* @param string $field
* @return bool
* Config 설정의 존재 여부 판단
*/
public static function has(string $field):bool
{
return !is_null($this->get($field));
}
/**
* 설정 변수 설정
* @access public
* @param string $field 매개 변수 이름
* @param mixed $value 값
*/
public function __set(string $field, $value): void
{
$this->set($field, $value);
}
/**
* 설정 변수 가져오기
* @access public
* @param string $field 매개 변수 이름
* @return mixed
*/
public function __get(string $field)
{
return $this->get($field);
}
/**
* @param mixed $field
* @param mixed $value
* ArrayAccess
*/
public function offsetSet($field, $value): void
{
$this->set($field, $value);
}
public function offsetExists($field): bool
{
return $this->has($field);
}
public function offsetUnset($field)
{
throw new \Exception('not support: unset');
}
public function offsetGet($field)
{
return $this->get($field);
}
/**
* ArrayAccess
*/
}
반응형
'개발 꿀팁 > PHP' 카테고리의 다른 글
php 타이머 phptimer (0) | 2022.09.22 |
---|---|
청구 사례다. PHPcurl (1) | 2022.09.21 |
php가 url을 해석하여 url의 매개 변수를 얻고, url 매개 변수를 얻는 네 가지 방식 (1) | 2022.09.21 |
PHP 추첨의 새로운 방법, 멀티채널 추첨 지원 (1) | 2022.09.20 |
PHP 연쇄 조작은 call과 callstatic 마술 기법을 통해 실현되고 phpstorm은 주석을 통해 function을 추적한다 (0) | 2022.09.20 |