字符串 / 列表 / Hash / Set / Zet / 基数统计算法

最后更新于:2022-04-02 04:00:25

[TOC] ## 接口 ### 字符串 ``` $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->ping() //输出PONG 为正常 ,错误会报 RedisException 异常 ``` #### set/get/ setnx / getset ``` //字符串操作 $redis->set("tutorial-name", "Redis tutorial"); $redis->get("tutorial-name"); $redis->setnx('key', 'value'); //不存在则fasle ,存在则 true $redis->delete("tutorial-name"); ``` #### getset 先获得key的值,然后重新赋值 ``` $redis->set("tutorial-name", "Redis tutorial"); $redis->getset('tutorial-name', 'Redis'); //Redis tutorial ``` #### mset 存入多个值 key/value ``` //存入多个值 $array_mset=array('first_key'=>'first_val', 'second_key'=>'second_val', 'third_key'=>'third_val' ); $redis->mset($array_mset); #用MSET一次储存多个值 print_r($redis->get('third_key')); // third_val ``` #### mget 获取多个 key 对应的 value ``` $redis->set("key1", "1"); $redis->set("key2", "2"); var_export($redis->mget(["key1","key2"])); /** * array ( 0 => '1', 1 => '2', )*/ ``` #### setex / ttl /persist 设置一个有效期的值 /移除有效期 ``` $redis->setex("count", 5, "123"); // $redis->persist('count'); //移除失效时间 while(true){ $data = $redis->get("count"); if ($data){ print_r($redis->ttl("count")."\n"); //查看失效倒计时 print_r($data."\n"); }else{ return true; } sleep(1); } ``` #### incr / incrby / decr /decrby 自增自减 ``` $redis->set("name", 123); $redis->incr("name",2); print_r($redis->get("name")); //125 ``` #### strlen 字符串长度 ``` $redis->set("name", 123); print_r($redis->strlen("name")); //3 ``` ### 列表(List) 简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) #### lpush / lrange / Len 队列存储 /列表长度 ``` //向右追加 $redis->rPush("tutorial-list", "Redis",'Oracle'); $redis->rPush("tutorial-list", "Mongodb"); $redis->rPush("tutorial-list", "Mysql"); print_r($redis->lPop("tutorial-list")); //先进后出 $arList = $redis->lrange("tutorial-list",0,0); //取第一个 $arList = $redis->lrange("tutorial-list",0,-1); //取全部 print_r($redis->lLen("tutorial-list")); //3 print_r($arList); //数组形式的值 ``` ### Hash 接口 数据存储为`key` `field`、`value`的格式存储,可用来存储对象,避免序列化的开销与并发修改的控制问题 ![54EB8D6C-5613-49FE-B6E9-CB5FDF50CD36.png](http://yanxuan.nosdn.127.net/d4ae1e54292bba4fd23924018f0eddc9.png) 使用 string 还是 hash? 1. 如果一个数据中如果filed比较多,但是每次只需要使用其中的一个或者少数的几个,使用hash是一个好的选择,因为它提供了hget 和 hmget,而无需取出所有数据再在代码中处理。 2. 反之,如果数据差异较大,操作时常常需要把所有数据都读取出来再处理,使用string 是一个好的选择。 3. 也可以听Redis 官方的,放心的使用hash 4. 如果一个hash中有大量的field(成千上万个),需要考虑是不是使用string来分开存储是不是更好的选择 `语法`: HSET key field value `作用`: 设置一对 field value ``` $redis->hset('key', 'field', 'value'); //增,改,将哈希表key中的域field的值设为value, 不存在创建, 存在就覆盖【1 | 0】 $redis->hget('key', 'field'); //查,取值【value|false】 $arr = array('one'=>1, 2, 3);$arr2 = array('one', 0, 1); $redis->hmset('key', $arr); //增,改,设置多值$arr为(索引|关联)数组, $arr[key]=field, [ true ] $redis->hmget('key', $arr2); //查,获取指定下标的field,[$arr | false] $redis->hgetall('key'); //查,返回哈希表key中的所有域和值。[当key不存在时,返回一个空表] $redis->hkeys('key'); //查,返回哈希表key中的所有域。[当key不存在时,返回一个空表] $redis->hvals('key'); //查,返回哈希表key中的所有值。[当key不存在时,返回一个空表] $redis->hdel('key', $arr2); //删,删除指定下标的field, 不存在的域将被忽略, [num | false] ``` ### Set 唯一列表 ``` $redis->sRem('key', 'value1', 'value2', 'value1'); //删,移除集合key中的一个或多个member元素,不存在的member元素会被忽略 [del_num | false] $redis->sMembers('key'); //查,返回集合key中的所有成员 [array | ''] $redis->sIsMember('key', 'member'); //是否存在 $redis->sPop('key'); // 移除并返回集合中的一个随机元素 [member | false] $redis->sRandMember('key'); //查,返回集合中的一个随机元素 [member | false] $redis->sInter('key1', 'key2', 'keyn'); //查看多个 key 的交集的值 [array | false] $redis->sUnion('key1', 'key2', 'keyn'); //查看多个 key 合集 [array | false] $redis->sDiff('key1', 'key2', 'keyn'); //差差集 [array | false] ``` ### Zet 带顺序的 set ``` $redis->delete("z"); $redis->zAdd('z', 1, 'v2', 2, 'v2', 3, 'v3', 4, 'v4' ); $redis->zRem('z', 'v2', 'v3'); // $redis->zAdd("z", 3, "v5"); $redis->zAdd("z", 7, "v5"); //此赋值无效 $redis->zAdd("z", 3, "v6"); $redis->zAdd("z", 5, "v7"); var_export($redis->zRange("z", 0, -1)); // array ( 0 => 'v5', 1 => 'v6', 2 => 'v4', ) var_dump($redis->zScore('z', 'v5')); // 3 //var_dump($redis->zScore('z', 'v6')); // 3 var_export($redis->zRevRange('z', 0, -1)); // 返回从大到小 var_export($redis->zRangeByScore('z', 0, 4));//查排 0 到 4 的 value array ( 0 => 'v5', 1 => 'v6', ) var_export($redis->zRangeByScore('z', 0, 4,['withscores' => TRUE]));//array ( 'v5' => 3.0, 'v6' => 3.0, 'v4' => 4.0, ) var_export($redis->zRangeByScore('z', 0, 4,['limit' => [0, 1]]));// 分页 array ( 0 => 'v5',) //$redis->zRevRangeByScore('z', $max, $min,[$config]); //从大到小排 var_dump($redis->zRank('z', 'v4')); //查,在全部排序中的 从开数起的索引 //$redis->zRevRank('key', 'member'); //反向查找 ``` ### HyperLogLog (基数统计的算法) 计算不重复元素的数量 ``` redis 127.0.0.1:6379> PFADD runoobkey "redis" 1) (integer) 1 redis 127.0.0.1:6379> PFADD runoobkey "mongodb" 1) (integer) 1 redis 127.0.0.1:6379> PFADD runoobkey "mysql" 1) (integer) 1 redis 127.0.0.1:6379> PFCOUNT runoobkey (integer) 3 //返回不重复数3 ``` ### 其他 #### del / delete 清空队列或 set ``` $redis->del(["key1","key2"]); $redis->delete("key1","key2"); ``` #### expire 设置失效时间 `$redis->expire('key', 10); //设置失效时间[true | false]` #### keys 获取所有的 key ``` //获取key值 $arList = $redis->keys("*"); print_r($arList); // 数组形式 Array ( [0] => tutorial-list [1] => tutorial-name ) ``` #### 模糊查找 ``` $arList = $redis->keys("user:data:*"); ``` #### select / move 切换数据库 移动数据 默认为 16 可在配置文件中修改 ``` $redis->select(0); // switch to DB 0 $redis->set('x', '42'); // write 42 to x $redis->move('x', 1); // move to DB 1 $redis->select(1); // switch to DB 1 $redis->get('x'); // will return 42 ``` #### 把数据存储到磁盘 ``` $redis->save(); //同步?? 把数据存储到磁盘-dump.rdb[true] $redis->bgsave(); //异步??把数据存储到磁盘-dump.rdb[true] ``` #### 服务 接口 ``` $redis->dbSize(); //返回当前库中的key的个数 $redis->flushAll(); //清空整个redis[总true] $redis->flushDB(); //清空当前redis库[总true] $redis->info(); //查询当前redis的状态 [verson:2.4.5....] $redis->lastSave(); //上次存储时间key的时间[timestamp] ```
';