개발 꿀팁/PHP

phpredis의 추가 및 삭제 작업 라이브러리

Jammie 2022. 9. 21. 15:05
반응형

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
     */

}

 

반응형