php 哈希 列表结构,php操作redis进阶 列表和哈希

本文介绍PHP操作redis string类型 hash类型 以及list类型操作。封装代码如下

/**

* @author jinanav 2020年1月13日16:40:38

* @desc 自定义Redis服务类

*/

class RedisService{

//redis操作对象

private static $redis = null;

//全局用户token

private static $token = null;

//全局user信息

private static $user = null;

//前缀

private static $fix = "token_";

/**

* 初始化

*/

public function __construct(){

if(empty(self::$redis)){

self::$redis = new \Redis();

self::$redis->connect("127.0.0.1",6379,5);

self::$redis->auth('7b857da97cf6d95d5b824c4c42c9a9bb');

self::$redis->select(3);

}

//这里用到tp5.1的门面

//!empty(Request::header('token')) && self::$token = Request::header('token');

}

/**

* 初始化

*/

public static function init(){

new static();

}

/**

* 根据token获取当前登录用户

* @author jinanav 2020年1月13日16:40:57

* @return array | string | null

*/

public static function getUser($key = null){

if(!isset(self::$user[$key]) || empty(self::$user[$key])){

if (empty(self::$token)) return null;

self::$user = self::$redis->get(self::$token);

self::$user = empty(self::$user) ? [] : json_decode(self::$user,true);

}

return empty($key) ? self::$user : self::$user[$key] ?? null;

}

/**

* 设置用户登录信息

* @author jinanav 2020年1月13日17:47:15

* @param array $user 用户信息

* @param int $timeout 失效时间

* @return array|bool

*/

public static function setUser($userInfo,$timeout = 86400 * 7){

empty(self::$token) && self::$token = self::createToken($userInfo['id'] ?? 0);

self::$user = array_merge(self::getUser(),$userInfo);

return self::$redis->set(self::$token,json_encode(self::$user),$timeout);

}

/**

* 注销用户

* @author jinanav 2020年1月17日15:53:11

* @return bool

*/

public static function delUser($token = null){

return self::$redis->del(empty($token) ? self::$token : $token);

}

/**

* 根据用户uid生成token

* @author jinanav 2020年1月13日17:47:15

* @param int $string 用户识别字符串

* @retrun string;

*/

public static function createToken($string){

return self::$fix.strtoupper(md5($string.time().rand(100,999)));

}

/**

* 统计key长度,默认获取当前在线用户

* @author jinanav 2020年1月13日19:45:03

* @return int

*/

public static function onLineNumber($key = null){

empty($key) && $key = self::$fix."*";

return count(self::$redis->keys($key));

}

/**

* 校验是否需要登录

* @author jinanav 2020年1月19日14:56:29

* @param bool $needLogin 是否需要登录

* @return string Json

*/

public static function loginStatus($needLogin = false){

return self::existKey() ? true : $needLogin ? ajaxReturn(302,'请先到登录...') : false;

}

/**

* 查询当前token是否存在

* @author jinanav 2020年1月19日14:59:26

* @return bool

*/

public static function existKey($key = null){

return self::$redis->exists(!empty($key) ? $key : self::$token);

}

/**

* 日志数据写入队列

* @author jinanav 2020年1月17日15:05:06

* @param array $data 写入队列的消息

* @param string $queue 队列key名称 与日志表名相关联

* @return boolean

*/

public static function enqueue($data,$queue = 'api_queue'){

//MQ过长不予写入,建议自定义长度

if(self::queueLen($queue) < 8000 && !empty($data)){

return self::$redis->lPush($queue,json_encode($data));

}

return false;

}

/**

* 读取队列数据

* @author jinanav 2020年1月17日15:11:44

* @param string $queue 队列key名称

* @return array

*/

public static function dequeue($queue = 'api_queue'){

$info = self::$redis->rPop($queue);

return !empty($info) ? json_decode($info,true) : [];

}

/**

* 获取当前token

* @author jinanav 2020年3月6日15:35:44

* @return string|null

*/

public static function getToken(){

return self::existKey() ? self::$token : null;

}

/**

* 设置当前token

* @author jinanav 2020年3月6日15:35:44

* @return string

*/

public static function setToken($token){

self::$token = $token;

}

/**

* 返回当前redis操作对象

* @author jinanav 2020年4月21日15:32:57

* @return \Redis

*/

public static function op(){

return self::$redis;

}

/**

* 删除键

* @author jinanav 2020年6月4日00:13:12

* @return bool

*/

public static function remove($key){

return self::$redis->del($key);

}

/**

* 查看指定键的生存时间

* @author jinanav 2020年6月4日00:13:12

* @return bool

*/

public static function ttl($key = null){

return self::$redis->ttl(empty($key) ? self::$token : $key);

}

/**

* 设置指定键的过期时间

* @author jinanav 2020年6月29日00:29:25

* @return bool

*/

public static function expire($timeout = 600,$key = null){

return self::$redis->expire(empty($key) ? self::$token : $key,$timeout);

}

/**

* 写新值,并返回旧值

* @author jinanav 2020年6月29日00:29:25

* @return bool

*/

public static function getSet($key,$value){

return self::$redis->GetSet(empty($key) ? self::$token : $key,$value);

}

/**

* 将value绑定到key,并重置过期时间

* @author jinanav 2020年6月29日00:29:25

* @return bool

*/

public static function setex($key,$value,$timeOut){

return self::$redis->setex(empty($key) ? self::$token : $key,$timeOut,$value);

}

/**

* hash操作,设置hash

* @param string $key redis键

* @param string $hashKey 哈希键

* @param string $value 哈希值

* @return bool|int

*/

public static function hSet($key,$hashKey,$value){

return self::$redis->hSet($key,$hashKey,$value);

}

/**

* hash操作,设置hash

* @param string $key redis键

* @param string $hashKey 哈希键

* @return string | bool

*/

public static function hGet($key,$hashKey){

return self::$redis->hGet($key,$hashKey);

}

/**

* hash操作,判断hashKey是否存在

* @param string $key redis键

* @param string $hashKey 哈希键

* @return bool

*/

public static function hExists($key,$hashKey){

return self::$redis->hExists($key,$hashKey);

}

/**

* 删除指定的哈希key

* @param string $key redis键

* @param string $hashKey 哈希键

* @return bool

*/

public static function hDel($key,$hashKey){

return self::$redis->hDel($key,$hashKey);

}

/**

* 同时设置某个哈希表的多个字段值

* @param string $key redis键

* @param array $hashKey 键值对

* @return bool

*/

public static function hMset($key,$hashKey){

return self::$redis->hMset($key,$hashKey);

}

/**

* 同时获得哈希表中多个字段值

* @param string $key redis键

* @param array $hashKey 键值对

* @return array

*/

public static function hMget($key,$hashKeys){

return self::$redis->hMget($key,$hashKeys);

}

/**

* 获取完整的哈希表

* @param string $key redis键

* @return array

*/

public static function hGetAll($key){

return self::$redis->hGetAll($key);

}

/**

* 获取指定哈希表的所有字段

* @param string $key redis键

* @return array

*/

public static function hKeys($key){

return self::$redis->hKeys($key);

}

/**

* 获取指定哈希表的所有值

* @param string $key redis键

* @return array

*/

public static function hVals($key){

return self::$redis->hVals($key);

}

/**

* 获取哈希表长度

* @param string $key redis键

* @return int

*/

public static function hLen($key){

return self::$redis->hLen($key);

}

/**

* 给指定字段添加数值

* @param string$key 哈希表名

* @param string $hashKey 哈希字段

* @param int|float $number 获取哈希表长度

* @return int

*/

public static function hIncrBy($key,$hashKey,$number){

return self::$redis->hIncrBy($key,$hashKey,$number);

}

/**

* 列表头部插入一个值,当列表不存在时自动创建一个列表,$listKey为列表名

* @param string $listKey 列表名

* @param string $value 列表值

* @return int

*/

public function lpush($listKey,$value){

return self::$redis->lpush($listKey,$value);

}

/**

* 列表尾部插入一个值,当列表不存在时自动创建一个列表,$listKey为列表名

* @param string $listKey 列表名

* @param string $value 列表值

* @return int

*/

public function rpush($listKey,$value){

return self::$redis->rpush($listKey,$value);

}

/**

* 将一个插入已存在的列表头部,列表不存在时操作无效

* @param string $listKey 列表名

* @param string $value 列表值

* @return int

*/

public static function rPushx($listKey,$value){

return self::$redis->rPushx($listKey,$value);

}

/**

* 删除并返回列表的第一个元素

* @param string $listKey 列表名

* @return string

*/

public static function lPop($listKey){

return self::$redis->lPop($listKey);

}

/**

* 删除并返回列表的最后一个元素

* @param string $listKey 列表名

* @return string

*/

public static function rPop($listKey){

return self::$redis->rPop($listKey);

}

/**

* 删除并返回列表的第一个元素 堵塞 返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值

* @param string $listKey 列表名

* @param int $timeOut 过期时间

* @return array

*/

public static function blPop($listKey,$timeOut){

return self::$redis->blPop($listKey,$timeOut);

}

/**

* 删除并返回列表的最后一个元素 堵塞 返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值

* @param string $listKey 列表名

* @param int $timeOut 过期时间

* @return array

*/

public static function brPop($listKey,$timeOut){

return self::$redis->brPop($listKey,$timeOut);

}

/**

* 将列表from的末端元素移动到列表to的头部

* @param string $from 源列表

* @param string $to 目标列表

* @return string

*/

public static function rpoplpush($from,$to){

return self::$redis->rpoplpush($from,$to);

}

/**

* 将列表from的末端元素移动到列表to的头部,并设置堵塞超时时间

* @param string $from 源列表

* @param string $to 目标列表

* @param int $timeOut 超时时间

* @return string

*/

public static function brpoplpush($from,$to,$timeOut){

return self::$redis->brpoplpush($from,$to,$timeOut);

}

/**

* 返回列表长度

* @author jinanav 2020年7月12日12:49:45

* @param string $listKey 列表名称

* @return int

*/

public static function lLen($listKey){

return self::$redis->lLen($listKey);

}

/**

* 通过索引下标获取值

* @author jinanav 2020年7月12日12:51:21

* @param string $listKey 列表名称

* @param int $index 索引位置

* @return int

*/

public static function lindex($listKey,$index){

return self::$redis->lindex($listKey,$index);

}

/**

* 通过索引下标获设置值

* @author jinanav 2020年7月12日12:52:32

* @param string $listKey 列表名称

* @param int $index 索引位置

* @param int $value 值

* @return bool

*/

public static function lSet($listKey,$index,$value){

return self::$redis->lSet($listKey,$index,$value);

}

/**

* 在列表指定元素之前/之后插入元素 若指定元素不在列表中,或列表不存在时,不执行任何操作

* Redis::AFTER插入元素后面 Redis::BEFORE插入元素前面

* @author jinanav 2020年7月12日12:52:32

* @param string $listKey 列表名称

* @param string $perch 位置 在之前或之后

* @param int $pivot 指定元素

* @param int $value 值

* @return bool 插入成功返回插入后列表元素个数,若列表不存在返回0,若不是列表返回false

*/

public static function lInsert($listKey,$pivot,$value,$perch = \Redis::AFTER){

return self::$redis->lInsert($listKey, $perch, $pivot, $value);

}

/**

* 根据第三个参数(count),删除掉相对的value

* Redis::AFTER插入元素后面 Redis::BEFORE插入元素前面

* @author jinanav 2020年7月12日13:55:34

* @param string $listKey 列表名称

* @param string $value 值

* @param int $count 数量 //count > 0 : 从表头开始向表尾搜索,移除与value相等的元素,数量为count。//count < 0 : 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。//count = 0 : 移除表中所有与value相等的值。

* @return int 返回实际删除元素个数

*/

public static function lrem($listKey,$value,$count){

return self::$redis->lrem($listKey, $value,$count);

}

/**

* 获取存储的数据并输出列表下标$start,长度为$end的数据 类似mysql limit

* @author jinanav 2020年7月12日14:05:34

* @param string $listKey 列表

* @param string $start 索引位置

* @param string $end 读取长度

* @return array

*/

public static function lRange($listKey,$start=0,$end=10){

return self::$redis->lRange($listKey,$start,$end);

}

}

RedisService::init();

RedisService::setUser(['id'=>20,'age'=>18]);

echo "用户数据
";

var_dump(RedisService::getUser());

echo '
';

echo "token:
";

var_dump(RedisService::getToken());

echo '
';

echo "在线用户数:
";

var_dump(RedisService::onLineNumber());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值