基础知识网上很多,就不写的太啰嗦,这里纪录一下我的首次使用。
一、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 写法
public function redis(){$redis = new Redis();$redis->connect('127.0.0.1', 6379);// GET请求:返回用户maxidif(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();}