Redis
Redis管道
管道就是将很多指令一次性发给Redis,Redis执行完毕后一次性返回,管道技术最显著的优势是提高了 redis 服务的性能。
/**
* Redis管道,一次将所有命令全部执行,返回执行的结果(无就是NULL)
*/
public function index() {
$data = Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->setex("key:$i", 100, $i);
// $pipe->get("key:$i");
}
});
dd($data);
}
简单分析性能提升多少
memory_get_usage()
和 memory_get_peak_usage()
的区别 PHP文档
memory_get_usage()
返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte)
memory_get_peak_usage()
返回分配给你的 PHP 脚本的内存峰值字节数
microtime()
时间记录,分析程序运行时间
使用管道
//用计划任务执行一千遍
$time_start = microtime();
$memory_start = memory_get_peak_usage();
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->setex("key:$i", 20, mt_rand(1, 999));
}
});
$time_end = microtime();
$memory_end = memory_get_peak_usage();
$data = $time_start . ' | ' . $time_end . ' | ' . $memory_start . ' | ' . "$memory_end\n";
file_put_contents('test.txt', $data, FILE_APPEND);
不使用管道
//用计划任务执行一千遍
$time_start = microtime();
$memory_start = memory_get_peak_usage();
for ($i = 0; $i < 1000; $i++) {
Redis::setex("key:$i", 20, mt_rand(1, 999));
}
$time_end = microtime();
$memory_end = memory_get_peak_usage();
$data = $time_start . ' | ' . $time_end . ' | ' . $memory_start . ' | ' . "$memory_end\n";
file_put_contents('test.txt', $data, FILE_APPEND);
结果分析:
Redis 键的操作
public function key() {
// key 存在时删除 key,返回删除的数目
// $data = Redis::del('user_id:2', 'user_id:3', 'user_id:27');
//判断key是否存在,存在返回1,否则返回0
// $data = Redis::exists('wx_access_token');
//给键设置有效期
Redis::set('name', 'shuxiaoyuan');
$data = Redis::expire('name', 600);
dd($data);
}
Redis 字符串操作
public function string() {
//设置字符串
// $data = Redis::set('number', mt_rand(100000, 999999));
// $data = Redis::get('number');
$temp = [
'user_id:' . 1 => mt_rand(100, 9999),
'user_id:' . 2 => mt_rand(100, 9999),
'user_id:' . 3 => mt_rand(100, 9999),
'user_id:' . 4 => mt_rand(100, 9999),
'user_id:' . 5 => mt_rand(100, 9999),
];
//批量设置
// $data = Redis::mset($temp);
//批量获取
// $data = Redis::mget(array_keys($temp));
// Redis::set('name','shuxiaoyuan');
$a = Redis::getset('name', null);
if (!$a) {
echo 'null';
}
echo '123';
//设置有效期10秒
// $data = Redis::setex('temp', 10, '临时存储');
// return $data;
}
Redis 哈希操作
public function hash() {
$hash = 'hash1';
//hset/hget 存取hash表的数据
// Redis::hset($hash, 'key1', 'v1'); //将key为'key1' value为'v1'的元素存入hash1表
// Redis::hset($hash, 'key2', 'v2');
// return Redis::hget($hash, 'key1'); //取出表'hash1'中的key 'key1'的值,返回'v1'
//hexists 返回hash表中的指定key是否存在,返回true和false
// $data = Redis::hexists($hash, 'key111');
//hdel 删除hash表中指定key的元素
// $data = Redis::hdel($hash, 'key2'); //true or false
//hlen 返回hash表元素个数
// $data = Redis::hlen($hash);
//hsetnx 增加一个元素,但不能重复,重复返回false
// $data = Redis::hsetnx($hash, 'key3', '333');
// $data = Redis::hsetnx($hash, 'key1', '333');
//hmset/hmget 存取多个元素到hash表
// $data = Redis::hmset('hash1', [
// 'key3' => 'v33',
// 'key4' => 'v44'
// ]);//会覆盖之前的
// $data = Redis::hmget('hash1', [
// 'key3',
// 'key4'
// ]); // 返回相应的值 array('v3','v4')
//hincrby 对指定key进行累加
// $data = Redis::hincrby('hash1', 'key5', 3); //不存在,则存储并返回 3;存在,即返回 原有值 + 3;
//hkeys 返回hash表中的所有key
$data = Redis::hkeys($hash);
//hvals 返回hash表中的所有value
$data = Redis::hvals($hash);
//hgetall 返回整个hash表元素
$data = Redis::hgetall($hash);
dd($data);
}
Redis 列表操作
Redis 参考链接 Redis操作