初识 Redis

基础知识网上很多,就不写的太啰嗦,这里纪录一下我的首次使用。

一、redis 安装

在服务器上安装 redis

我的服务器环境是宝塔,方便安装

php 扩展打开 redis

二、项目中的实际应用

首先说明,项目环境是 php

redis 的一些基本操作命令

    //数据操作:
    // set($key, $value): 设置指定键的值。
    // get($key): 获取指定键的值。
    // del($key1, $key2, ...): 删除一个或多个键。
    // incr($key): 增加键对应的值。
    // decr($key): 减少键对应的值。
    // exists($key): 检查键是否存在。
    // 其他诸如append、strlen、mset、mget等等。
    // 列表操作:
    // lpush($key, $value1, $value2, ...): 在列表左侧插入一个或多个值。
    // rpush($key, $value1, $value2, ...): 在列表右侧插入一个或多个值。
    // lpop($key): 弹出列表左侧的值。
    // rpop($key): 弹出列表右侧的值。
    // llen($key): 获取列表长度。
    // 其他诸如lindex、lrange、ltrim等等。
    // hset / hget(设置 / 获取)

    // hexists(检查是否存在)
    
    // hdel(删除)
    
    // hkeys(获取所有 field)
    
    // hvals (获取所有的 value)
    
    // hgetall(获取所有键值对)
    
    // hmget(查询指定个 value)
    
    // hsetnx(设置值时设置参数)
    
    // hash 自增自减处理

redis 初始化

// 初始化 redis 类
$redis = new Redis();
// 打开 redis 连接
$redis->connect('127.0.0.1', 6379);
//TODO:操作

// 关闭 redis 连接
$redis->close();

set/get操作

$redis->set('mobile','1331889999'); 
$redis->get('mobile');

Hash 键值对集合操作

项目中需要存储对象,一开始我的考虑是:

mobile作为 key,userinfo 作为 value 存储,对应 get、set的方法就是set(mobile,userinfo),userinfo 需要转为字符串,如php 的 json encode 方法 ,取用户数据的时候得先 jsondecode。

这个方法的弊端是:存取麻烦。

比如说:修改用户的信息,要么整个键值对删除,重新插入,要么把用户信息拿出来解构,修改后再编码再更新。

那有没有更优的方案呢?这时候我注意到了哈希 Hash 键值对集合操作;

1、循环遍历写入

$_POST的数据格式大概长这样:

foreach ($_POST as $val){
                    $mobile = $val['mobile'];
                    $info = json_encode($val);
                    // $redis->set($mobile,$info);
                    // $redis->hset($mobile,'info',$info);
                    // 以 hash 键值对的方式存储
                    foreach($val as $k=>$v){
                        $redis->hset($val['mobile'],$k,$v);
                    }
                }

2、信息读取

$redis->hget('13712341234','mobile');

这样就可以通过手机号+字段获取信息

3、信息更新

$redis->hset('13712341234','mobile','13312341234');

这样就把手机号是"13712341234"的用户手机号修改为"13312341234",这样更新操作是不是就便捷的多?(当然手机业务逻辑涉及到手机号变更的,不应该这么改)

因此哈希表比较合适。

还有很多操作,还没用到,后续更新......

// hexists(检查是否存在)

// hdel(删除)

// hkeys(获取所有 field)

// hvals (获取所有的 value)

// hgetall(获取所有键值对)

// hmget(查询指定个 value)

// hsetnx(设置值时设置参数)

// hash 自增自减处理

三、应用案例

3.1 GET请求:返回最后一个用户 id

从列表"userid"左边获取第一个数值(如下表示例)

|-----------------|---|---|---|---|---|---|---|---|
| userid 列表 |||||||||
| | | | | | | | | |
| 如此类推 最大的 id 在左侧 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |

3.2 POST 请求:接收总库传来的消息

需要做两个动作:

1、用户数据以哈希键值对的方式存储;

2、用户 id 单独存列表"userid",并且从左边插入数据(返回的 id 必须按照顺序 asc排序,即最后一个 id 是最大的 id);

php 复制代码
// 备注:下面用到方法,判断请求类型是封装过的函数,非原生 php 写法
public function redis(){
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
       
        // GET请求:返回用户maxid
        if(is_get()){
            // 列表origin_uid左边第一个数值
            $user = $redis->lindex('userid',0);
            print_r($user);
        }
        
        // POST请求:接收数据,用户id必须是顺序排序,依次从左侧插入列表
        if(is_post()){
            print_r($_POST);
            // return json($_POST);
            if($_POST){
                $count = 0;
                foreach ($_POST as $val){
                    $mobile = $val['mobile'];
                    $info = json_encode($val);
                    // $redis->set($mobile,$info);
                    // $redis->hset($mobile,'info',$info);
                    // 以 hash 键值对的方式存储
                    foreach($val as $k=>$v){
                        $redis->hset($val['mobile'],$k,$v);
                    }
                    // 把用户原始 id 写入到集合里面,方便查询最后同步到那个客户。
                    $redis->lpush('userid',$val['id']);  // 以列表lpush方式存储(加在列表左边)
                    $count ++;
                }
                if($count>0){
                    return json('redis存下了'.$count.'条数据');
                }else{
                    return json();
                }
            }
            
        }
       // 关闭连接
        $redis->close();
    }
相关推荐
尘浮生7 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
偶尔。5358 分钟前
什么是事务?事务有哪些特性?
数据库·oracle
安迁岚10 分钟前
【SQL Server】华中农业大学空间数据库实验报告 实验六 视图
数据库·sql·mysql·oracle·实验报告
xoxo-Rachel20 分钟前
(超级详细!!!)解决“com.mysql.jdbc.Driver is deprecated”警告:详解与优化
java·数据库·mysql
JH30731 小时前
Oracle与MySQL中CONCAT()函数的使用差异
数据库·mysql·oracle
蓝染-惣右介1 小时前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
冷心笑看丽美人1 小时前
Spring框架特性及包下载(Java EE 学习笔记04)
数据库
登云时刻1 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
武子康2 小时前
Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis·springboot
代码吐槽菌2 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm