最近项目要用redis,依然是基于tp3.2.

  发现thinkphp3.2自带的缓存类并不好使用,就自己封装了一个

  目前只支持hash格式,其他数据类型的操作后面用到的时候再补充

  

<?php
/**
* Author:laomiao
* Time:2018/07/03
*/
namespace Org\Util; /**
* redis实现类
* @category ORG
* @package ORG
* @subpackage Util
*/ class Redis{
//redis对象
public $redis=null; /**
* 构造方法
* 设置初始化redis服务器信息
*/
public function __construct(string $ip=null,string $password=null,int $port=null)
{
$redis = $this->connect($ip,$password,$port);
if(is_object($redis)){
$this->redis = $redis;
}else{
return false;
}
} /**
* redis连接方法
* @param string $ip 服务器ip
* @param string $password 授权密码
* @param string $prot 服务器端口
* @return object $redis 返回redis连接对象
*/
private function connect(string $ip=null,string $password=null,int $port=null)
{
$ip = $ip ?? C("REDIS_HOST");
$password = $password ?? C("REDIS_AUTH");
$port = $port ?? C("REDIS_PORT"); $redis = new \Redis();
$connect= $redis->connect($ip, $port);
if($connect){
$redis->auth($password);
return $redis;
}else{
return "redis服务器连接失败";
}
} /**
* 增加hash字段值
* @param string $key 哈希的键
* @param string $field 字段名
* @param mixed $value 存储的值
* @return bool
*/
public function hset(string $key, string $field,$value)
{
if($key != "" && $field != ""){
if(is_array($value)) $value = json_encode($value);
return $this->redis->hset($key,$field,$value);
}else{
return false;
}
} /**
* 获取hash的某个key的某个field
* @param string $key 某个hash的键名
* @param string $field hash的字段名
* @return mixed
*/
public function hget(string $key,string $field)
{
$value = $this->redis->hget($key,$field);
if(!$value){
return "";
}else{
if($this->is_json($value)){
return json_decode($value,true);
}else{
return $value;
}
}
} /**
* 获取hash的某个key的某个field或者多个field
* @param string $key 某个hash的键名
* @param string $field hash的字段名
* @return array
*/
public function hmget(string $key,string ...$fields):array
{
// dump($fields); t1 t2
$this->key=$key;
//通过array_map获取所有的field对应的数据,但是该结果却是索引形式
$data = array_map(function(string $field){
$list = $this->redis->hget($this->key,$field);
if($this->is_json($list)){
$tmp = json_decode($list,true);
}else{
$tmp = $list;
}
return $tmp;
},$fields); //遍历上述结果 将field对应到结果上
$result=[];
foreach($data as $key=>$vo){
$result[$fields[$key]] = $vo;
}
return $result;
} /**
* 获取hash的某个key的所有field
* @param $key 键名
* @return array
*/
public function hgetall(string $key):array
{
$key = $key??'';
$data = $this->redis->hgetall($key);
if(count($data)>1){
foreach($data as $key=>$vo){
if($this->is_json($vo)) $tmp[$key]=json_decode($vo,true);
else $tmp[$key] = $vo;
}
$data=$tmp;
}
return $data;
} /**
* 判断哈希某key的某个field是否存在
* @param string $key 键名
* @param string $field 字段名
* @return bool
*/
public function hexists(string $key,string $field):bool
{
$result = $this->redis->hexists($key,$field);
if($result == 1){
return true;
}else{
return false;
}
} /**
* 读取redis中某键的所有key
* @param string $key
* @return array/bool
*/
public function hkeys(string $key)
{
if($key){
$result = $this->redis->hkeys($key);
if(count($result)>=1){
return $result;
}else{
return false;
}
}else{
return false;
}
} /**
* 判断哈希中某个键中存储多少个键值
* @param string $key
* @return int
*/
public function hlen(string $key):int
{
if($key){
return $this->redis->hlen($key);
}else{
return false;
}
} /**
* 获取哈希中某键中存储的所有值
* @param string $key
* @return array/bool
*/
public function hvals(string $key)
{
if($key){
$result = $this->redis->hvals($key);
if(count($result)>=1){
return $result;
}else{
return false;
}
}else{
return false;
}
} /**
* 删除hash中某个key中的某些个field
* @param string $key
* @param string $fields
* @return bool
*/
public function hdel(string $key,string ...$fields):bool
{
if(!$key) return false;
$this->key = $key;
array_map(function(string $field){
return $this->redis->hdel($this->key,$field);
},$fields);
return true;
} /**
* 判断字符串是否是json格式
* @param string $str 要判断的字符串
*/
private function is_json(string $str):bool
{
json_decode($str);
return (json_last_error() == JSON_ERROR_NONE);
}
}

封装一个redis操作类来操作hash格式的更多相关文章

  1. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  2. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

  3. Python_selenium封装一个浏览器引擎类

    Python_selenium封装一个浏览器引擎类 现在我们在编写一个类,叫浏览器引擎类(此例为:启动浏览器),将文件名命名为browser.py,代码下面通过更改一个字符串的值,运用if语句判断和控 ...

  4. redis(Springboot中封装整合redis,java程序如何操作redis的5种基本数据类型)

    平常测试redis操作命令,可能用的是cmd窗口 操作redis,记录一下 java程序操作reids, 操作redis的方法 可以用Jedis ,在springboot 提供了两种 方法操作 Red ...

  5. Python+Selenium中级篇之-封装一个自己的类-浏览器引擎类

    前一篇文章我们知道了,如何去封装几个简单的Selenium方法到我们自定义的类,这次我们编写一个类,叫浏览器引擎类,通过更改一个字符串的值,利用if语句去判断和控制启动那个浏览器.这里我们暂时,支持三 ...

  6. 在Lua中封装一个调试日志(附lua时间格式)

    --自己封装一个Debug调试日志 Debug={} Info={} local function writeMsgToFile(filepath,msg) end function Debug.Lo ...

  7. 封装一个简易版的ajax操作对象

    /** * 发送ajax请求 * @type {Object} * 使用方法如下: * $ajax.request( * method: "post", //请求方式 * url: ...

  8. 分享一个Redis帮助类

    最近在项目中使用了redis来存储已经下载过的URL,项目中用的是ServiceStack来操作Redis,一开始ServiceStack的版本用的是最新的,后来发现ServiceStack已经商业化 ...

  9. block传值以及利用block封装一个网络请求类

    1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...

随机推荐

  1. windows eclipse直接访问远程linux hadoop开发环境配置(符合实际开发的做法)

    CDH 5.x搭建请参考CentOS 7离线安装CDH 5.16.1完全指南(含各种错误处理). 如果使用的是cloudera quickstart vm,则只能在linux服务器中使用eclipse ...

  2. python:循环定义、赋值多个变量

    exec函数,可以循环定义.赋值多个变量 exec ("temp%s=1"%1)   这段代码的意思是,让exec执行temp1=1.字符串里面的%s由‘1’代替了. 我们在外面再 ...

  3. gitlab搭建

    环境说明: 虚拟机 centos 7 64位 内存:4GB 存储:100GB CPU: CORE 版本: gitlab 10.0.3 配置系统基础环境 配置阿里巴巴 yum 源 wget -O /et ...

  4. HTML和CSS怎么用

    首页> 1.HTML和CSS是什么? ·网站和HTML页面 ·简单理解网站 ·一个房子比喻(HTML比喻成房子,CSS为装修) ·页面的整体结构:有树桩标签对嵌套组成 ·页面的组成单元:元素 · ...

  5. pycharm 序列号/行号 的宽度太宽了如何调整

    问题:行号宽度嫌宽: 解决:在settings里面,如下图顺序,取消“show gutter icons”的勾,即可. 调整后如下图:

  6. bzoj 3513: [MUTC2013]idiots FFT

    bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...

  7. 用Xshell在centos7下安装lnmp服务

    虚拟机已创建好,本机已安装Xshell 一.准备工作:安装常用工具 1.1  yum install -y vim 备注:-y是同意安装过程中的询问,不被询问打断安装 vim:vim是一个类似于Vi的 ...

  8. MyBatis Generator 自定义生成注释

    注释生成器 为了生成db里面的注释,必须自定义注释生成器 EmptyCommentGenerator: import org.mybatis.generator.api.CommentGenerato ...

  9. 使用telnet进行Dubbo接口测试

    telnet进入dubbo 查看pid $ jps -l 26048 org.apache.catalina.startup.Bootstrap 12388 org.jetbrains.jps.cmd ...

  10. Java包装类介绍与类型之间相互转换

    1.包装类存在的意义 通俗解释就是由于Java是面对对象的语言,而基本类型不具有面对对象的概念,为了弥补不足,引入了包装类方便使用面对对象的变成思想操作基本类型. 2.基本类型和包装类对应关系 byt ...