字符串 / 列表 / 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]
```
';