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操作