<?php

/**
* ------------------------------------------
* 统一redis的配置与数据存储规范,便于扩展与修改
* # redis通常用于热数据与消息列队等场景
* # list内存储array是采用json格式
*
*/ class RedisDriver
{ protected $redis; // redis对象
protected $ip = '127.0.0.1'; // redis服务器ip地址
protected $port = '6379'; // redis服务器端口
protected $passwd = null; // redis密码 public function __construct($config = array())
{
$this->redis = new Redis();
empty($config) or $this->connect($config);
} // 连接redis服务器
public function connect($config = array())
{
if (!empty($config)) {
$this->ip = $config['ip'];
$this->port = $config['port'];
if (isset($config['passwd'])) {
$this->passwd = $config['passwd'];
}
}
$state = $this->redis->connect($this->ip, $this->port);
if ($state == false) {
die('redis connect failure');
}
if (!is_null($this->passwd)) {
$this->redis->auth($this->passwd);
}
} // 设置一条String
public function setStr($key, $text, $expire = null)
{
$key = 'string:' . $key;
$this->redis->set($key, $text);
if (!is_null($expire)) {
$this->redis->setTimeout($key, $expire);
}
} // 获取一条String
public function getStr($key)
{
$key = 'string:' . $key;
$text = $this->redis->get($key);
return empty($text) ? null : $text;
} // 删除一条String
public function delStr($key)
{
$key = 'string:' . $key;
$this->redis->del($key);
} // 设置一条Hash
public function setHash($key, $arr, $expire = null)
{
$key = 'hash:' . $key;
$this->redis->hMset($key, $arr);
if (!is_null($expire)) {
$this->redis->setTimeout($key, $expire);
}
} // 获取一条Hash,$fields可为字符串或数组
public function getHash($key, $fields = null)
{
$key = 'hash:' . $key;
if (is_null($fields)) {
$arr = $this->redis->hGetAll($key);
} else {
if (is_array($fields)) { $arr = $this->redis->hmGet($key, $fields);
foreach ($arr as $key => $value) {
if ($value === false) {
unset($arr[$key]);
}
}
} else {
$arr = $this->redis->hGet($key, $fields);
}
}
return empty($arr) ? null : (is_array($arr) ? $arr : array($fields => $arr));
} // 删除一条Hash,$field为字符串
public function delHash($key, $field = null)
{
$key = 'hash:' . $key;
if (is_null($field)) {
$this->redis->del($key);
} else {
$this->redis->hDel($key, $field);
}
} // 在Hash的field内增加一个值 (值之间使用“,”分隔)
public function fieldAddVal($key, $field, $val)
{
$arr = $this->getHash($key, $field);
if (!is_null($arr)) {
$str = reset($arr);
$arr = explode(',', $str);
foreach ($arr as $v) {
if ($v == $val) {
return;
}
}
$str .= ",{$val}";
$this->setHash($key, array($field => $str));
} else {
$this->setHash($key, array($field => $val));
}
} // 在Hash的field内删除一个值
public function fieldDelVal($key, $field, $val)
{
$arr = $this->getHash($key, $field);
if (!is_null($arr)) {
$arr = explode(',', reset($arr));
$tmpStr = '';
foreach ($arr as $v) {
if ($v != $val) {
$tmpStr .= ",{$v}";
}
}
if ($tmpStr == '') {
$this->delHash($key, $field);
} else {
$this->setHash($key, array($field => substr($tmpStr, 1)));
}
}
} // 设置表格的一行数据
public function setTableRow($table, $id, $arr, $expire = null)
{
$key = '' . $table . ':' . $id;
$this->redis->hMset($key, $arr);
if (!is_null($expire)) {
$this->redis->setTimeout($key, $expire);
}
} // 获取表格的一行数据,$fields可为字符串或数组
public function getTableRow($table, $id, $fields = null)
{
$key = '' . $table . ':' . $id;
if (is_null($fields)) {
$arr = $this->redis->hGetAll($key);
} else {
if (is_array($fields)) {
$arr = $this->redis->hmGet($key, $fields);
foreach ($arr as $key => $value) {
if ($value === false) {
unset($arr[$key]);
}
}
} else {
$arr = $this->redis->hGet($key, $fields);
}
}
return empty($arr) ? null : (is_array($arr) ? $arr : array($fields => $arr));
} // 删除表格的一行数据
public function delTableRow($table, $id)
{
$key = '' . $table . ':' . $id;
$this->redis->del($key);
} // 推送一条数据至列表,头部
public function pushList($key, $arr)
{
$key = 'list:' . $key;
$this->redis->lPush($key, json_encode($arr));
} // 从列表拉取一条数据,尾部
public function pullList($key, $timeout = 0)
{
$key = 'list:' . $key;
if ($timeout > 0) {
$val = $this->redis->brPop($key, $timeout); // 该函数返回的是一个数组, 0=key 1=value
} else {
$val = $this->redis->rPop($key);
}
$val = is_array($val) && isset($val[1]) ? $val[1] : $val;
return empty($val) ? null : $this->objectToArray(json_decode($val));
} // 取得列表的数据总条数
public function getListSize($key)
{
$key = 'list:' . $key;
return $this->redis->lSize($key);
} // 删除列表
public function delList($key)
{
$key = 'list:' . $key;
$this->redis->del($key);
} // 使用递归,将stdClass转为array
protected function objectToArray($obj)
{
if (is_object($obj)) {
$arr = (array) $obj;
}
if (is_array($obj)) {
foreach ($obj as $key => $value) {
$arr[$key] = $this->objectToArray($value);
}
}
return !isset($arr) ? $obj : $arr;
} }

  

最新文章

  1. easyuidatagrid中load,reload,loadData的区别
  2. Disable the screen switching about VI
  3. 【JavaScript】内置对象Math
  4. 用distinct在MySQL中查询多条不重复记录值[转]
  5. vim显示行号
  6. windows下的C/C++精确计时
  7. [原创] IIS7下顶级域名301跳转到WWW域名
  8. JS基础之属性操作注意事项
  9. PHP 和Apache的安装和配置
  10. input type file onchange上传文件的过程中,遇到同一个文件二次上传无效的问题。
  11. Servlet过滤器——使用过滤器禁止浏览器缓存页面
  12. 安装npm及cnpm(Windows)
  13. 离开Visual Studio C#的编译(你不知道的C#)
  14. Linux的打印rpm包的详细信息的shell脚本
  15. UGUI实现摇杆
  16. google打不开怎么办?谷歌打不开的解决方法
  17. Android之对TabActivity的见解,个人觉得不错
  18. CSS3 flex的使用方法
  19. UVA-11882 Biggest Number (DFS+剪枝)
  20. elasticsearch(一):JAVA api操作

热门文章

  1. thinkphp类的调用
  2. linux笔记二-----目录及文件命令
  3. NeuSoft(2)添加系统调用
  4. 火狐的调试利器-----Firebug
  5. 让dwz 在td里显示图片
  6. IOS彩票第二天设置界面(1)
  7. ie下如果已经有缓存,load方法的效果就无法执行.的解决方法
  8. VS2015——命令行下编译、静态库动态库制作以及断点调试
  9. momentjs 求小时差异
  10. 随手记一次利用开源zxing生成带嵌入logo的二维码图片