封装一个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之间传值,在这里分享给刚開始学习 ...
随机推荐
- httplib和urllib2常用方法
都是几年前用过的,现在翻出来记录一下. import httplib import urllib2 import socket ##---------------------------------- ...
- 关于layui富文本编辑器和form表单提交的问题
今天下午因为要做一个富文本编辑器上传文件给后台,所以看了一下layui的富文本编辑器,折腾了半天,终于把这玩意搞定了. 首先需要先创建layui的富文本编辑器 <textarea id=&quo ...
- [ZOJ 4024] Peak
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4024 从前往后找满足al<al+1的最大下标l,从后往前找 ...
- js注意点:数组比较大小方法及数组与对象的区别
(迁移自旧博客2017-04-19) 快速复制数组及数组比较大小方法 首先介绍一下复制数组的方法: var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; var ...
- credential for git
1, 编辑~/.gitconfig文件怎加如下配置 [credential] helper = store 2,执行 git pull.输入username, password. 3.检查~/.git ...
- 使用代理实现对C# list distinct操作
范型在c#编程中经常使用,而经常用list 去存放实体集,因此会设计到对list的各种操作,比较常见的有对list进行排序,查找,比较,去重复.而一般的如果要对list去重复如果使用linq dist ...
- 數據監控与診斷--環形緩沖區(RING BUFFER)
1. 環形緩沖區 動態管理視圖: sys.dm_os_ring_buffers 查看ring_buffers: Select distinct ring_buffer_type from sys.d ...
- Zynq PS和PL间的连接
跨越PS和PL的信号 AXI总线.EMIO.其他(看门狗.重启信号.中断信号.DMA接口信号) AXI标准 AXI(高级可扩展接口)是ARM AMBA的一部分.AMBA总线主要用于片上系统.AXI总线 ...
- hadoop配置项笔记 - streaming
stream.map.input.ignoreKey 作用:是否忽略key,只传递值. 默认值:false 我的设置:按需要更改 stream.map.input.field.separator st ...
- OO随笔
第一次作业——多项式计算 1.自我程序分析 第一次作业是多项式计算,只使用了一个多项式类.第一次接触面向对象的程序,还比较生疏,不是很能理解面向对象的思想.将读入,处理,计算,都放到了main函数中, ...