封装一个redis操作类来操作hash格式
最近项目要用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格式的更多相关文章
- Redis操作Hash工具类封装,Redis工具类封装
Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...
- Redis操作字符串工具类封装,Redis工具类封装
Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...
- Python_selenium封装一个浏览器引擎类
Python_selenium封装一个浏览器引擎类 现在我们在编写一个类,叫浏览器引擎类(此例为:启动浏览器),将文件名命名为browser.py,代码下面通过更改一个字符串的值,运用if语句判断和控 ...
- redis(Springboot中封装整合redis,java程序如何操作redis的5种基本数据类型)
平常测试redis操作命令,可能用的是cmd窗口 操作redis,记录一下 java程序操作reids, 操作redis的方法 可以用Jedis ,在springboot 提供了两种 方法操作 Red ...
- Python+Selenium中级篇之-封装一个自己的类-浏览器引擎类
前一篇文章我们知道了,如何去封装几个简单的Selenium方法到我们自定义的类,这次我们编写一个类,叫浏览器引擎类,通过更改一个字符串的值,利用if语句去判断和控制启动那个浏览器.这里我们暂时,支持三 ...
- 在Lua中封装一个调试日志(附lua时间格式)
--自己封装一个Debug调试日志 Debug={} Info={} local function writeMsgToFile(filepath,msg) end function Debug.Lo ...
- 封装一个简易版的ajax操作对象
/** * 发送ajax请求 * @type {Object} * 使用方法如下: * $ajax.request( * method: "post", //请求方式 * url: ...
- 分享一个Redis帮助类
最近在项目中使用了redis来存储已经下载过的URL,项目中用的是ServiceStack来操作Redis,一开始ServiceStack的版本用的是最新的,后来发现ServiceStack已经商业化 ...
- block传值以及利用block封装一个网络请求类
1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...
随机推荐
- Node.js基础学习四之注册功能
前言:在Node.js学习(二)和(三)中介绍了如何在Node.js 中获取登录的用户名和密码与数据库进行验证并返回数据给客户端 需求:实现注册功能 为了区分登录和注册是两个不同的请求,在端口后面加上 ...
- 3、SpringBoot集成Storm WorldCount
RandomSentenceSpout //数据源,在已知的英文句子中,随机发送一条句子出去. public class RandomSentenceSpout extends BaseRichSpo ...
- HBuilder 模拟器
模拟器名称 连接默认端口夜神安卓模拟器夜神安卓模拟器 62001逍遥安卓模拟器逍遥安卓模拟器 21503BlueStacks(蓝叠安卓模拟器)BlueStacks(蓝叠安卓模拟器 ...
- PO、POJO、BO、DTO、VO之间的区别(转)
PO:persistent object持久对象 1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录. 2 .在hibernate持久化框架中与in ...
- flutter插件汇总2
作者:知乎用户链接:https://www.zhihu.com/question/307594373/answer/568969429来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- 【TYVJ 1056】能量项链
[题目链接]传送门 [题解大意] 这题好水,可我还是调了一会,以下为调试中出现过的错误: 1.更新取值时弄清楚区间范围是[l,k][k+1,r]还是[l,k][k,r] 2.对于环形处理时左端点的取值 ...
- 面试被问之-----sql优化中in与exists的区别
曾经一次去面试,被问及in与exists的区别,记得当时是这么回答的:''in后面接子查询或者(xx,xx,xx,,,),exists后面需要一个true或者false的结果",当然这么说也 ...
- Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...
- webpack中如何使用vue
1.安装 vue包:npm i vue -S 2.由于在webpack中,推荐使用.vue这个组件模版文件来定义组件,不然会出现vue.js移动和一些高级语法的不支持,因此需要安装能解析这种文件的lo ...
- 使用TLS证书保护Docker
使用TLS证书保护Docker 当我们使用远程调用docker时,未设置TLS的docker,将可以被任何人调用,这是极其危险的. 在阿里云上跑的docker,这次就被不怀好意的人扫描到了默认端口,2 ...