搜索
首页后端开发php教程php连接redis的操作库predis操作大全

predis是php连接redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写,相信改换c语言编写的php扩展后性能会大幅提升(比如使用C扩展phpredis https://github.com/owlient/phpredis)。

将session数据存放到redis也很简单:
session.save_handler = redis
session.save_path = “tcp://127.0.0.1:6379″

以下是汇总一些操作,并不断更新。

  1. //使用autoload加载相关库,这边重点就是为了require $file;
  2. spl_autoload_register(function($class) {
  3. $file = __DIR__.'/lib/Predis/'.$class.'.php';
  4. if (file_exists($file)) {
  5. require $file;
  6. return true;
  7. }
  8. });
  9. //配置连接的IP、端口、以及相应的数据库
  10. $server = array(
  11. 'host' => '127.0.0.1',
  12. 'port' => 6379,
  13. 'database' => 15
  14. );
  15. $redis = new Client($server);
  16. //普通set/get操作
  17. $redis->set('library', 'predis');
  18. $retval = $redis->get('library');
  19. echo $retval; //显示 'predis'
  20. //setex set一个存储时效
  21. $redis->setex('str', 10, 'bar'); //表示存储有效期为10秒
  22. //setnx/msetnx相当于add操作,不会覆盖已有值
  23. $redis->setnx('foo',12); //true
  24. $redis->setnx('foo',34); //false
  25. //getset操作,set的变种,结果返回替换前的值
  26. $redis->getset('foo',56);//返回34
  27. // incrby/incr/decrby/decr 对值的递增和递减
  28. $redis->incr('foo'); //foo为57
  29. $redis->incrby('foo',2); //foo为59
  30. //exists检测是否存在某值
  31. $redis->exists('foo');//true
  32. //del 删除
  33. $redis->del('foo');//true
  34. //type 类型检测,字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash
  35. $redis->type('foo');//不存在,返回none
  36. $redis->set('str','test');
  37. $redis->type('str'); //字符串,返回string
  38. //append 连接到已存在字符串
  39. $redis->append('str','_123'); //返回累加后的字符串长度8,此进str为 'test_123'
  40. //setrange 部分替换操作
  41. $redis->setrange('str',0,'abc'); //返回3,参数2为0时等同于set操作
  42. $redis->setrange('str',2,'cd');//返回4,表示从第2个字符后替换,这时'str'为'abcd'
  43. //substr 部分获取操作
  44. $redis->substr('str',0,2);//表示从第0个起,取到第2个字符,共3个,返回'abc'
  45. //strlen 获取字符串长度
  46. $redis->strlen('str'); //返回4
  47. //setbit/getbit 位存储和获取
  48. $redis->setbit('binary',31,1); //表示在第31位存入1,这边可能会有大小端问题?不过没关系,getbit 应该不会有问题
  49. $redis->getbit('binary',31); //返回1
  50. //keys 模糊查找功能,支持*号以及?号(匹配一个字符)
  51. $redis->set('foo1',123);
  52. $redis->set('foo2',456);
  53. $redis->keys('foo*'); //返回foo1和foo2的array
  54. $redis->keys('f?o?'); //同上
  55. //randomkey 随机返回一个key
  56. $redis->randomkey(); //可能是返回 'foo1'或者是'foo2'及其它任何一存在redis的key
  57. //rename/renamenx 对key进行改名,所不同的是renamenx不允许改成已存在的key
  58. $redis->rename('str','str2'); //把原先命名为'str'的key改成了'str2'
  59. //expire 设置key-value的时效性,ttl 获取剩余有效期,persist 重新设置为永久存储
  60. $redis->expire('foo', 1); //设置有效期为1秒
  61. $redis->ttl('foo'); //返回有效期值1s
  62. $redis->expire('foo'); //取消expire行为
  63. //dbsize 返回redis当前数据库的记录总数
  64. $redis->dbsize();
  65. /*
  66. 队列操作
  67. */
  68. //rpush/rpushx 有序列表操作,从队列后插入元素
  69. //lpush/lpushx 和rpush/rpushx的区别是插入到队列的头部,同上,'x'含义是只对已存在的key进行操作
  70. $redis->rpush('fooList', 'bar1'); //返回一个列表的长度1
  71. $redis->lpush('fooList', 'bar0'); //返回一个列表的长度2
  72. $redis->rpushx('fooList', 'bar2'); //返回3,rpushx只对已存在的队列做添加,否则返回0
  73. //llen返回当前列表长度
  74. $redis->llen('fooList');//3
  75. //lrange 返回队列中一个区间的元素
  76. $redis->lrange('fooList',0,1); //返回数组包含第0个至第1个共2个元素
  77. $redis->lrange('fooList',0,-1);//返回第0个至倒数第一个,相当于返回所有元素,注意redis中很多时候会用到负数,下同
  78. //lindex 返回指定顺序位置的list元素
  79. $redis->lindex('fooList',1); //返回'bar1'
  80. //lset 修改队列中指定位置的value
  81. $redis->lset('fooList',1,'123');//修改位置1的元素,返回true
  82. //lrem 删除队列中左起指定数量的字符
  83. $redis->lrem('fooList',1,'_'); //删除队列中左起(右起使用-1)1个字符'_'(若有)
  84. //lpop/rpop 类似栈结构地弹出(并删除)最左或最右的一个元素
  85. $redis->lpop('fooList'); //'bar0'
  86. $redis->rpop('fooList'); //'bar2'
  87. //ltrim 队列修改,保留左边起若干元素,其余删除
  88. $redis->ltrim('fooList', 0,1); //保留左边起第0个至第1个元素
  89. //rpoplpush 从一个队列中pop出元素并push到另一个队列
  90. $redis->rpush('list1','ab0');
  91. $redis->rpush('list1','ab1');
  92. $redis->rpush('list2','ab2');
  93. $redis->rpush('list2','ab3');
  94. $redis->rpoplpush('list1','list2');//结果list1 =>array('ab0'),list2 =>array('ab1','ab2','ab3')
  95. $redis->rpoplpush('list2','list2');//也适用于同一个队列,把最后一个元素移到头部list2 =>array('ab3','ab1','ab2')
  96. //linsert 在队列的中间指定元素前或后插入元素
  97. $redis->linsert('list2', 'before','ab1','123'); //表示在元素'ab1'之前插入'123'
  98. $redis->linsert('list2', 'after','ab1','456'); //表示在元素'ab1'之后插入'456'
  99. //blpop/brpop 阻塞并等待一个列队不为空时,再pop出最左或最右的一个元素(这个功能在php以外可以说非常好用)
  100. //brpoplpush 同样是阻塞并等待操作,结果同rpoplpush一样
  101. $redis->blpop('list3',10); //如果list3为空则一直等待,直到不为空时将第一元素弹出,10秒后超时
  102. /**
  103. set表操作
  104. */
  105. //sadd 增加元素,返回true,重复返回false
  106. $redis->sadd('set1','ab');
  107. $redis->sadd('set1','cd');
  108. $redis->sadd('set1','ef');
  109. //srem 移除指定元素
  110. $redis->srem('set1','cd'); //删除'cd'元素
  111. //spop 弹出首元素
  112. $redis->spop('set1');
  113. //smove 移动当前set表的指定元素到另一个set表
  114. $redis->sadd('set2','123');
  115. $redis->smove('set1','set2','ab');//移动'set1'中的'ab'到'set2',返回true or false
  116. //scard 返回当前set表元素个数
  117. $redis->scard('set2');//2
  118. //sismember 判断元素是否属于当前表
  119. $redis->sismember('set2','123'); //true or false
  120. //smembers 返回当前表的所有元素
  121. $redis->smembers('set2'); //array('123','ab');
  122. //sinter/sunion/sdiff 返回两个表中元素的交集/并集/补集
  123. $redis->sadd('set1','ab');
  124. $redis->sinter('set2','set1'); //返回array('ab')
  125. //sinterstore/sunionstore/sdiffstore 将两个表交集/并集/补集元素copy到第三个表中
  126. $redis->set('foo',0);
  127. $redis->sinterstore('foo','set1'); //这边等同于将'set1'的内容copy到'foo'中,并将'foo'转为set表
  128. $redis->sinterstore('foo',array('set1','set2')); //将'set1'和'set2'中相同的元素copy到'foo'表中,覆盖'foo'原有内容
  129. //srandmember 返回表中一个随机元素
  130. $redis->srandmember('set1');
  131. /**
  132. 有序set表操作
  133. */
  134. //sadd 增加元素,并设置序号,返回true,重复返回false
  135. $redis->zadd('zset1',1,'ab');
  136. $redis->zadd('zset1',2,'cd');
  137. $redis->zadd('zset1',3,'ef');
  138. //zincrby 对指定元素索引值的增减,改变元素排列次序
  139. $redis->zincrby('zset1',10,'ab');//返回11
  140. //zrem 移除指定元素
  141. $redis->zrem('zset1','ef'); //true or false
  142. //zrange 按位置次序返回表中指定区间的元素
  143. $redis->zrange('zset1',0,1); //返回位置0和1之间(两个)的元素
  144. $redis->zrange('zset1',0,-1);//返回位置0和倒数第一个元素之间的元素(相当于所有元素)
  145. //zrevrange 同上,返回表中指定区间的元素,按次序倒排
  146. $redis->zrevrange('zset1',0,-1); //元素顺序和zrange相反
  147. //zrangebyscore/zrevrangebyscore 按顺序/降序返回表中指定索引区间的元素
  148. $redis->zadd('zset1',3,'ef');
  149. $redis->zadd('zset1',5,'gh');
  150. $redis->zrangebyscore('zset1',2,9); //返回索引值2-9之间的元素 array('ef','gh')
  151. //参数形式
  152. $redis->zrangebyscore('zset1',2,9,'withscores'); //返回索引值2-9之间的元素并包含索引值 array(array('ef',3),array('gh',5))
  153. $redis->zrangebyscore('zset1',2,9,array('withscores' =>true,'limit'=>array(1, 2))); //返回索引值2-9之间的元素,'withscores' =>true表示包含索引值; 'limit'=>array(1, 2),表示最多返回2条,结果为array(array('ef',3),array('gh',5))
  154. //zunionstore/zinterstore 将多个表的并集/交集存入另一个表中
  155. $redis->zunionstore('zset3',array('zset1','zset2','zset0')); //将'zset1','zset2','zset0'的并集存入'zset3'
  156. //其它参数
  157. $redis->zunionstore('zset3',array('zset1','zset2'),array('weights' => array(5,0)));//weights参数表示权重,其中表示并集后值大于5的元素排在前,大于0的排在后
  158. $redis->zunionstore('zset3',array('zset1','zset2'),array('aggregate' => 'max'));//'aggregate' => 'max'或'min'表示并集后相同的元素是取大值或是取小值
  159. //zcount 统计一个索引区间的元素个数
  160. $redis->zcount('zset1',3,5);//2
  161. $redis->zcount('zset1','(3',5)); //'(3'表示索引值在3-5之间但不含3,同理也可以使用'(5'表示上限为5但不含5
  162. //zcard 统计元素个数
  163. $redis->zcard('zset1');//4
  164. //zscore 查询元素的索引
  165. $redis->zscore('zset1','ef');//3
  166. //zremrangebyscore 删除一个索引区间的元素
  167. $redis->zremrangebyscore('zset1',0,2); //删除索引在0-2之间的元素('ab','cd'),返回删除元素个数2
  168. //zrank/zrevrank 返回元素所在表顺序/降序的位置(不是索引)
  169. $redis->zrank('zset1','ef');//返回0,因为它是第一个元素;zrevrank则返回1(最后一个)
  170. //zremrangebyrank 删除表中指定位置区间的元素
  171. $redis->zremrangebyrank('zset1',0,10); //删除位置为0-10的元素,返回删除的元素个数2
  172. /**
  173. hash表操作
  174. */
  175. //hset/hget 存取hash表的数据
  176. $redis->hset('hash1','key1','v1'); //将key为'key1' value为'v1'的元素存入hash1表
  177. $redis->hset('hash1','key2','v2');
  178. $redis->hget('hash1','key1'); //取出表'hash1'中的key 'key1'的值,返回'v1'
  179. //hexists 返回hash表中的指定key是否存在
  180. $redis->hexists ('hash1','key1'); //true or false
  181. //hdel 删除hash表中指定key的元素
  182. $redis->hdel('hash1','key2'); //true or false
  183. //hlen 返回hash表元素个数
  184. $redis->hlen('hash1'); //1
  185. //hsetnx 增加一个元素,但不能重复
  186. $redis->hsetnx('hash1','key1','v2'); //false
  187. $redis->hsetnx('hash1','key2','v2'); //true
  188. //hmset/hmget 存取多个元素到hash表
  189. $redis->hmset('hash1',array('key3'=>'v3','key4'=>'v4'));
  190. $redis->hmget('hash1',array('key3','key4')); //返回相应的值 array('v3','v4')
  191. //hincrby 对指定key进行累加
  192. $redis->hincrby('hash1','key5',3); //返回3
  193. $redis->hincrby('hash1','key5',10); //返回13
  194. //hkeys 返回hash表中的所有key
  195. $redis->hkeys('hash1'); //返回array('key1','key2','key3','key4','key5')
  196. //hvals 返回hash表中的所有value
  197. $redis->hvals('hash1'); //返回array('v1','v2','v3','v4',13)
  198. //hgetall 返回整个hash表元素
  199. $redis->hgetall('hash1'); //返回array('key1'=>'v1','key2'=>'v2','key3'=>'v3','key4'=>'v4','key5'=>13)
  200. /**
  201. 排序操作
  202. */
  203. //sort 排序
  204. $redis->rpush('tab',3);
  205. $redis->rpush('tab',2);
  206. $redis->rpush('tab',17);
  207. $redis->sort('tab'); //返回array(2,3,17)
  208. //使用参数,可组合使用 array('sort' => 'desc','limit' => array(1, 2))
  209. $redis->sort('tab',array('sort' => 'desc')); //降序排列,返回array(17,3,2)
  210. $redis->sort('tab',array('limit' => array(1, 2))); //返回顺序位置中1的元素2个(这里的2是指个数,而不是位置),返回array(3,17)
  211. $redis->sort('tab',array('limit' => array('alpha' => true))); //按首字符排序返回array(17,2,3),因为17的首字符是'1'所以排首位置
  212. $redis->sort('tab',array('limit' => array('store' => 'ordered'))); //表示永久性排序,返回元素个数
  213. $redis->sort('tab',array('limit' => array('get' => 'pre_*'))); //使用了通配符'*'过滤元素,表示只返回以'pre_'开头的元素
  214. /**
  215. redis管理操作
  216. */
  217. //select 指定要操作的数据库
  218. $redis->select('mydb'); //指定为mydb,不存在则创建
  219. //flushdb 清空当前库
  220. $redis->flushdb();
  221. //move 移动当库的元素到其它库
  222. $redis->set('foo', 'bar');
  223. $redis->move('foo', 'mydb2'); //若'mydb2'库存在
  224. //info 显示服务当状态信息
  225. $redis->info();
  226. //slaveof 配置从服务器
  227. $redis->slaveof('127.0.0.1',80); //配置127.0.0.1端口80的服务器为从服务器
  228. $redis->slaveof(); //清除从服务器
  229. //同步保存服务器数据到磁盘
  230. $redis->save();
  231. //异步保存服务器数据到磁盘
  232. $redis->bgsave();
  233. //??
  234. $redis->bgrewriteaof();
  235. //返回最后更新磁盘的时间
  236. $redis->lastsave();
  237. //set/get多个key-value
  238. $mkv = array(
  239. 'usr:0001' => 'First user',
  240. 'usr:0002' => 'Second user',
  241. 'usr:0003' => 'Third user'
  242. );
  243. $redis->mset($mkv); //存储多个key对应的value
  244. $retval = $redis->mget(array_keys($mkv)); //获取多个key对应的value
  245. print_r($retval);
  246. //批量操作
  247. $replies = $redis->pipeline(function($pipe) {
  248. $pipe->ping();
  249. $pipe->flushdb();
  250. $pipe->incrby('counter', 10); //增量操作
  251. $pipe->incrby('counter', 30);
  252. $pipe->exists('counter');
  253. $pipe->get('counter');
  254. $pipe->mget('does_not_exist', 'counter');
  255. });
  256. print_r($replies);
  257. //CAS,事务性操作
  258. function zpop($client, $zsetKey) {
  259. $element = null;
  260. $options = array(
  261. 'cas' => true, // Initialize with support for CAS operations
  262. 'watch' => $zsetKey, // Key that needs to be WATCHed to detect changes
  263. 'retry' => 3, // Number of retries on aborted transactions, after
  264. // which the client bails out with an exception.
  265. );
  266. $txReply = $client->multiExec($options, function($tx)
  267. use ($zsetKey, &$element) {
  268. @list($element) = $tx->zrange($zsetKey, 0, 0);
  269. if (isset($element)) {
  270. $tx->multi(); // With CAS, MULTI *must* be explicitly invoked.
  271. $tx->zrem($zsetKey, $element);
  272. }
  273. });
  274. return $element;
  275. }
  276. $zpopped = zpop($redis, 'zset');
  277. echo isset($zpopped) ? "ZPOPed $zpopped" : "Nothing to ZPOP!", "\n";
  278. //对存取的key加前缀,如: 'nrk:'
  279. $redis->getProfile()->setPreprocessor(new KeyPrefixPreprocessor('nrk:'));
  280. //分布式存储的一些方法
  281. $multiple_servers = array(
  282. array(
  283. 'host' => '127.0.0.1',
  284. 'port' => 6379,
  285. 'database' => 15,
  286. 'alias' => 'first',
  287. ),
  288. array(
  289. 'host' => '127.0.0.1',
  290. 'port' => 6380,
  291. 'database' => 15,
  292. 'alias' => 'second',
  293. ),
  294. );
  295. use Predis\Distribution\IDistributionStrategy;
  296. class NaiveDistributionStrategy implements IDistributionStrategy {
  297. private $_nodes, $_nodesCount;
  298. public function __constructor() {
  299. $this->_nodes = array();
  300. $this->_nodesCount = 0;
  301. }
  302. public function add($node, $weight = null) {
  303. $this->_nodes[] = $node;
  304. $this->_nodesCount++;
  305. }
  306. public function remove($node) {
  307. $this->_nodes = array_filter($this->_nodes, function($n) use($node) {
  308. return $n !== $node;
  309. });
  310. $this->_nodesCount = count($this->_nodes);
  311. }
  312. public function get($key) {
  313. $count = $this->_nodesCount;
  314. if ($count === 0) {
  315. throw new RuntimeException('No connections');
  316. }
  317. return $this->_nodes[$count > 1 ? abs(crc32($key) % $count) : 0];
  318. }
  319. public function generateKey($value) {
  320. return crc32($value);
  321. }
  322. }
  323. //配置键分布策略
  324. $options = array(
  325. 'key_distribution' => new NaiveDistributionStrategy(),
  326. );
  327. $redis = new Predis\Client($multiple_servers, $options);
  328. for ($i = 0; $i set("key:$i", str_pad($i, 4, '0', 0));
  329. $redis->get("key:$i");
  330. }
  331. $server1 = $redis->getClientFor('first')->info();
  332. $server2 = $redis->getClientFor('second')->info();
  333. printf("Server '%s' has %d keys while server '%s' has %d keys.\n",
  334. 'first', $server1['db15']['keys'], 'second', $server2['db15']['keys']
  335. );
复制代码

php, redis, predis
本主题由 小贝 于 2015-11-12 08:43 移动


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?Apr 17, 2025 am 12:24 AM

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP与Python:用例和应用程序PHP与Python:用例和应用程序Apr 17, 2025 am 12:23 AM

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

描述不同的HTTP缓存标头(例如,Cache-Control,ETAG,最后修饰)。描述不同的HTTP缓存标头(例如,Cache-Control,ETAG,最后修饰)。Apr 17, 2025 am 12:22 AM

HTTP缓存头的关键玩家包括Cache-Control、ETag和Last-Modified。1.Cache-Control用于控制缓存策略,示例:Cache-Control:max-age=3600,public。2.ETag通过唯一标识符验证资源变化,示例:ETag:"686897696a7c876b7e"。3.Last-Modified指示资源最后修改时间,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1?说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1?Apr 17, 2025 am 12:06 AM

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP:服务器端脚本语言的简介PHP:服务器端脚本语言的简介Apr 16, 2025 am 12:18 AM

PHP是一种服务器端脚本语言,用于动态网页开发和服务器端应用程序。1.PHP是一种解释型语言,无需编译,适合快速开发。2.PHP代码嵌入HTML中,易于网页开发。3.PHP处理服务器端逻辑,生成HTML输出,支持用户交互和数据处理。4.PHP可与数据库交互,处理表单提交,执行服务器端任务。

PHP和网络:探索其长期影响PHP和网络:探索其长期影响Apr 16, 2025 am 12:17 AM

PHP在过去几十年中塑造了网络,并将继续在Web开发中扮演重要角色。1)PHP起源于1994年,因其易用性和与MySQL的无缝集成成为开发者首选。2)其核心功能包括生成动态内容和与数据库的集成,使得网站能够实时更新和个性化展示。3)PHP的广泛应用和生态系统推动了其长期影响,但也面临版本更新和安全性挑战。4)近年来的性能改进,如PHP7的发布,使其能与现代语言竞争。5)未来,PHP需应对容器化、微服务等新挑战,但其灵活性和活跃社区使其具备适应能力。

为什么要使用PHP?解释的优点和好处为什么要使用PHP?解释的优点和好处Apr 16, 2025 am 12:16 AM

PHP的核心优势包括易于学习、强大的web开发支持、丰富的库和框架、高性能和可扩展性、跨平台兼容性以及成本效益高。1)易于学习和使用,适合初学者;2)与web服务器集成好,支持多种数据库;3)拥有如Laravel等强大框架;4)通过优化可实现高性能;5)支持多种操作系统;6)开源,降低开发成本。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器