RedisClass

RedisClass

<?php
namespace Addons\Api;
//[1.3.11]
class RedisController
{
    static $redis;

    /**
     * [__construct]
     * @param [string]    $local        [地址]
     * @param [int]    $port        [端口]
     * @param [string]    $pass        [密码]
     * @param [int]    $number    [选择的数据库]
     */
    public function __construct()
    {
        self::$redis = new \Redis();
        self::$redis->connect(C('REDIS_LOCAL'), C('REDIS_PORT'));           // 连接Redis
        self::$redis->auth(C('REDIS_PASS'));                                // 密码验证
        self::$redis->select(C('REDIS_NUMBER'));                            // 选择数据库
    }

    /**------------------------------ list --------------------------------------*/
    /**
     * [rPush 添加,从列表的尾部插入一条数据]
     * @param   [string]      $key        [键]
     * @param   [array]       $value      [值]
     * @param   [int]         $time       [时间]
     * @return  [bool|int]
     */
    public function rPush($key, $value, $time = 0)
    {
        // 添加队列
        $result = self::$redis->rpush($key, $value);
        // 判断是否需要设置周期
        if ($time && intval($time) > 0){
            // 更新周期
            self::$redis->expire($key, $time);
        }
        // 更新周期
        return $result;
    }

    /**
     * [lPop 获取,从列表的头部移除,获取一条数据]
     * @param   [string]      $key        [键]
     * @return  [bool|object]
     */
    public function lPop($key)
    {
        $result = self::$redis->lpop($key);
        return $result;
    }

    /**
     * [total 获取列表数据]
     * @param   [string]      $key                [键]
     * @param   [string]      $start_range        [开始位置]
     * @param   [string]      $end_range          [结束位置]
     * @return  [bool|array]
     */
    public function getData($key, $start_range = 0, $end_range = -1)
    {
        $result = self::$redis->lRange($key, $start_range, $end_range);
        return $result;
    }

    /**
     * [getLength 获取指定队列长度]
     * @param   [string]      $key        [键]
     * @return  [bool|int]
     */
    public function getLength($key)
    {
        $result = self::$redis->lsize($key);
        return $result;
    }

    /**
     * [getStockNumber 下单未支付的订单 获取未支付的库存数量]
     * @param   [string]      $key        [键]
     * @param   [string]      $str        [元素]
     * @return  [bool|int]
     */
    public function getStockNumber($key, $str)
    {
        $keys = self::$redis->keys($key);
        $count = 0;
        foreach ($keys as &$val) {
            $data = self::$redis->lRange($val, 0, -1);
            $count += intval(json_decode($data[0], true)[$str]);
            unset($data);
        }
        return $count;
    }

    /**
     * [forRPush 循环添加,从列表的尾部插入一条数据]
     * @param   [string]      $key        [键]
     * @param   [array]       $value      [值]
     * @param   [int]         $time       [时间]
     * @return  [bool|int]
     */
    public function forRPush($key, $value, $time = 0)
    {
        // 定义长度
        for ($i = 0; $i < $value; $i++) {
            // 添加队列
            $result = self::$redis->rpush($key, 1);
            if (!$result) {
                self::$redis->removeKey($key);
                return false;
            }
        }
        // 判断是否需要设置周期
        if ($time && intval($time) > 0) {
            // 更新周期
            self::$redis->expire($key, $time);
        }
        // 更新周期
        return $result;
    }

    /**
     * [forLPop 循环移除,从列表的头部移除一条数据]
     * @param   [string]      $key        [键]
     * @param   [array]       $value      [值]
     * @return  [bool|int]
     */
    public function forLPop($key, $value)
    {
        // 定义长度
        for ($i = 0; $i < $value; $i++) {
            // 添加队列
            $result = self::$redis->lpop($key);
            if(!$result){
                return false;
            }
        }
        return true;
    }

    /**------------------------------ 公共 --------------------------------------*/
    /**
     * [existsKey 判断key是否存在]
     * @param [string]      $key        [键]
     * @return  [bool|int]  存在返回1,不存在返回0
     */
    public function existsKey($key)
    {
        $result = self::$redis->exists($key);
        return $result;
    }

    /**
     * [removeKey 移除指定key]
     * @param   [string]      $key        [键]
     * @return  [bool]
     */
    public function removeKey($key)
    {
        $result = self::$redis->delete($key);
        return $result;
    }
}
### Redis 序列化 `@class` 使用方法及示例 在处理复杂对象时,为了保持 Java 对象的类型信息,在序列化过程中可以保留类名。这有助于反序列化时能够正确还原原始的对象结构。 #### JSON 序列化器配置 当使用 Fastjson2 进行序列化时,可以通过设置 `SerializerFeature.WriteClassName` 来让序列化后的 JSON 字符串包含完整的类路径名称: ```java import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; public class SerializationUtil { public static String serialize(Object obj) { return JSON.toJSONString(obj, true); // 启用了 WriteClassName 特性 } public static <T> T deserialize(String jsonStr, Class<T> clazz) { JSONObject jsonObject = JSON.parseObject(jsonStr); return JSON.toJavaObject(jsonObject, clazz); } } ``` 此代码片段展示了如何通过启用特性来确保生成的 JSON 数据流中包含了源对象所属的具体类的信息[^1]。 #### 定义测试用实体类 假设有一个简单的 `User` 类作为待存储的对象模型: ```java public class User { private Integer id; private String name; private int age; // Getters and Setters omitted for brevity @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } } ``` #### 编写操作逻辑 接下来编写一段程序用于演示将上述 `User` 实例保存至 Redis 并从中取出的过程: ```java // 假设已经存在一个名为 redisTemplate 的 Spring Data Redis 模板实例 String key = "user:john"; User user = new User(); user.setId(1L); user.setName("John Doe"); user.setAge(30); // 将用户对象转换成带有 @class 信息的 JSON 字符串存入 Redis redisTemplate.opsForValue().set(key, SerializationUtil.serialize(user)); // 从 Redis 获取 JSON 字符串并解析回原生 User 对象 String jsonString = (String) redisTemplate.opsForValue().get(key); System.out.println(SerializationUtil.deserialize(jsonString, Object.class)); ``` 这段代码先创建了一个新的 `User` 对象并将它转为带 `@class` 属性标记的 JSON 形式存入 Redis;之后再读取出来并通过指定目标类型完成自动映射过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值