最近测试服务端的时候,接触到了redis,之前也看过,但不系统,借着这次实践,记录一下。

一、写在前面

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

使用场景和优势简单概述:

1.redis是目前业界非常受到欢迎的一个内存数据库,一般用作系统的中间缓存系统,用以提升整体商业系统的吞吐量响应速度;

2.redis支持从内存中实现数据的读写,所以速度非常快;

3.redis支持数据持久化,redis将数据存储在硬盘中,即使断电了,redis依然可以将数据重新加载到内存中。

二、安装redis

windows、linux系统下安装redis的详细教程可以见此链接:

http://www.runoob.com/redis/redis-install.html

下载完之后,进行解压、安装:

解压命令:tar -zxvf redis-3.2.11.tar.gz

解压得到一个【redis-3.2.11】文件夹,进入到此文件夹内;

Linux系统安装步骤

1.输入指令:make,进行编译,编译完成之后,会看到:

然后cd到src目录

2.执行make install,进行安装

  1. make install PREFIX=/usr/local/redis #安装到指定目录中

如果make失败,一般是你们系统中还未安装gcc或者tcl(根据具体的报错信息安装),那么可以通过yum安装:

  1. yum install gcc/tcl

安装完成后,继续执行make

在安装redis成功后,可以在/usr/local/redis看到一个bin的目录,里面包括了以下文件:

  1. redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server

测试安装是否成功

[root@docker redis-3.2.11]# make test
只截取最后的结果:
\o/ All tests passed without errors!

Cleanup: may take some time... OK

配置redis.conf:

[root@docker redis-3.2.11]# vi /usr/local/src/redis-3.2.11/redis.conf

我这里修改3个地方

A.   daemonize no   改成 daemonize yes (将redis修改为后台启动进程,防止redis启动后一直停留在redis界面)

B.   logfile ""  改成 logfile "./redis.log"(redis日志文件,在redis.conf同级目录下)

C.   bind 127.0.0.1    (只能本机访问)   改为   bind 0.0.0.0    (非本机亦可访问(或者可以绑定指定IP))

启动redis:

[root@docker ~]# redis-server /usr/local/src/redis-3.2.11/redis.conf
这里加载刚才修改的默认的redis配置文件redis.conf

查看是否启动成功:

[root@docker ~]# ps -ef | grep redis
root 30284 1 0 16:48 ? 00:00:00 redis-server 127.0.0.1:6379
root 30289 25916 0 16:48 pts/0 00:00:00 grep redis

测试redis:

[root@docker ~]# redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> exit

关闭redis:

[root@docker redis-3.2.11]# redis-cli shutdown

redis安全模式访问:

测试程序报错为:

DENIED Redis is running protected mode because protected mode is enabled,
    no bind address was specified, no authentication password is requested to clients.
    In this mode connections are only accepted from the loopback interface.

需要给redis配置密码

启动redis客户端

执行  redis-cli指令

然后执行    config set requirepass 777888(密码)

三、redis测试

1.简单的Redis测试程序:

可以自行创建Eclipse项目,引入jedis的客户端包,测试程序如下:

import redis.clients.jedis.Jedis;

import redis.clients.jedis.exceptions.JedisConnectionException;

  1. public class RedisTest {
  2.  
  3. private Jedis jedis = null;
  4. private String key1 = "key1";
  5. private String key2 = "key2";
  6.  
  7. public RedisTest() {
  8. jedis = new Jedis("127.0.0.1"); // redis的IP地址
  9. jedis.auth("redis"); // redis密码
  10. }
  11.  
  12. public static void main(String[] args) {
  13. RedisTest redisTest = new RedisTest();
  14. redisTest.isReachable(); // redis是否访问成功 返回结果true/false
  15. redisTest.testData(); // 数据测试
  16. redisTest.delData(); // 删除数据
  17. redisTest.testExpire();
  18. }
  19.  
  20. public boolean isReachable() {
  21. boolean isReached = true;
  22. try {
  23. jedis.connect();
  24. jedis.ping();
  25. // jedis.quit();
  26. } catch (JedisConnectionException e) {
  27. e.printStackTrace();
  28. isReached = false;
  29. }
  30.  
  31. System.out
  32. .println("The current Redis Server is Reachable:" + isReached);
  33. return isReached;
  34. }
  35.  
  36. public void testData() {
  37. jedis.set("key1", "data1");
  38. jedis.set("maxm", "MMM");
  39. System.out.println(jedis.get("maxm"));
  40. System.out.println("Check status of data existing:"
  41. + jedis.exists(key1));
  42. System.out.println("Get Data key1:" + jedis.get("key1"));
  43.  
  44. long s = jedis.sadd(key2, "data2");
  45. System.out.println("Add key2 Data:" + jedis.scard(key2)
  46. + " with status " + s);
  47. }
  48.  
  49. public void delData() {
  50. long count = jedis.del(key1);
  51.  
  52. System.out.println("Get Data Key1 after it is deleted:"
  53. + jedis.get(key1));
  54. }
  55.  
  56. public void testExpire() {
  57. long count = jedis.expire(key2, 5);
  58.  
  59. try {
  60. Thread.currentThread().sleep(6000);
  61. } catch (InterruptedException e) {
  62. e.printStackTrace();
  63. }
  64.  
  65. if (jedis.exists(key2)) {
  66. System.out
  67. .println("Get Key2 in Expire Action:" + jedis.scard(key2));
  68. } else {
  69. System.out.println("Key2 is expired with value:"
  70. + jedis.scard(key2));
  71. }
  72. }
  73.  
  74. }

2.Redis性能压测工具 redis-benchmark

Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求。 (类似于 Apache ab 程序)。你可以使用 redis-benchmark -h 来查看基准参数。

  1. 以下参数被支持:
  2.  
  3. Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]
  4.  
  5. -h <hostname> Server hostname (default 127.0.0.1)
  6. -p <port> Server port (default 6379)
  7. -s <socket> Server socket (overrides host and port)
  8. -a <password> Password for Redis Auth
  9. -c <clients> Number of parallel connections (default 50)
  10. -n <requests> Total number of requests (default 100000)
  11. -d <size> Data size of SET/GET value in bytes (default 2)
  12. -dbnum <db> SELECT the specified db number (default 0)
  13. -k <boolean> 1=keep alive 0=reconnect (default 1)
  14. -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD
  15. Using this option the benchmark will expand the string __rand_int__
  16. inside an argument with a 12 digits number in the specified range
  17. from 0 to keyspacelen-1. The substitution changes every time a command
  18. is executed. Default tests use this to hit random keys in the
  19. specified range.
  20. -P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline).
  21. -q Quiet. Just show query/sec values
  22. --csv Output in CSV format
  23. -l Loop. Run the tests forever
  24. -t <tests> Only run the comma separated list of tests. The test
  25. names are the same as the ones produced as output.
  26. -I Idle mode. Just open N idle connections and wait.

测试命令事例:

1、redis-benchmark -h 192.168.1.201 -p 6379 -c 100 -n 100000 
100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能

2、redis-benchmark -h 192.168.1.201 -p 6379 -q -d 100  

测试存取大小为100字节的数据包的性能

3、redis-benchmark -t set,lpush -n 100000 -q

只测试某些操作的性能

4、redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"

只测试某些数值存取的性能

  1. requests completed in 0.30 seconds
  2. parallel clients
  3. bytes payload
  4. keep alive: 1
  5.  
  6. 0.11% <= 1 milliseconds
  7. 86.00% <= 2 milliseconds
  8. 90.12% <= 3 milliseconds
  9. 96.68% <= 4 milliseconds
  10. 99.27% <= 5 milliseconds
  11. 99.54% <= 6 milliseconds
  12. 99.69% <= 7 milliseconds
  13. 99.78% <= 8 milliseconds
  14. 99.89% <= 9 milliseconds
  15. 100.00% <= 9 milliseconds
  16. 33222.59 requests per second
  17.  
  18. ====== PING_BULK ======
  19. requests completed in 0.27 seconds
  20. parallel clients
  21. bytes payload
  22. keep alive: 1
  23.  
  24. 0.93% <= 1 milliseconds
  25. 97.66% <= 2 milliseconds
  26. 100.00% <= 2 milliseconds
  27. 37174.72 requests per second
  28.  
  29. ====== SET ======
  30. requests completed in 0.32 seconds
  31. parallel clients
  32. bytes payload
  33. keep alive: 1
  34.  
  35. 0.22% <= 1 milliseconds
  36. 91.68% <= 2 milliseconds
  37. 97.78% <= 3 milliseconds
  38. 98.80% <= 4 milliseconds
  39. 99.38% <= 5 milliseconds
  40. 99.61% <= 6 milliseconds
  41. 99.72% <= 7 milliseconds
  42. 99.83% <= 8 milliseconds
  43. 99.94% <= 9 milliseconds
  44. 100.00% <= 9 milliseconds
  45. 30959.75 requests per second
  46.  
  47. ====== GET ======
  48. requests completed in 0.28 seconds
  49. parallel clients
  50. bytes payload
  51. keep alive: 1
  52.  
  53. 0.55% <= 1 milliseconds
  54. 98.86% <= 2 milliseconds
  55. 100.00% <= 2 milliseconds
  56. 35971.22 requests per second
  57.  
  58. ====== INCR ======
  59. requests completed in 0.14 seconds
  60. parallel clients
  61. bytes payload
  62. keep alive: 1
  63.  
  64. 95.61% <= 1 milliseconds
  65. 100.00% <= 1 milliseconds
  66. 69444.45 requests per second
  67.  
  68. ====== LPUSH ======
  69. requests completed in 0.21 seconds
  70. parallel clients
  71. bytes payload
  72. keep alive: 1
  73.  
  74. 18.33% <= 1 milliseconds
  75. 100.00% <= 1 milliseconds
  76. 48309.18 requests per second
  77.  
  78. ====== LPOP ======
  79. requests completed in 0.23 seconds
  80. parallel clients
  81. bytes payload
  82. keep alive: 1
  83.  
  84. 0.29% <= 1 milliseconds
  85. 99.76% <= 2 milliseconds
  86. 100.00% <= 2 milliseconds
  87. 44052.86 requests per second
  88.  
  89. ====== SADD ======
  90. requests completed in 0.22 seconds
  91. parallel clients
  92. bytes payload
  93. keep alive: 1
  94.  
  95. 2.37% <= 1 milliseconds
  96. 99.81% <= 2 milliseconds
  97. 100.00% <= 2 milliseconds
  98. 44444.45 requests per second
  99.  
  100. ====== SPOP ======
  101. requests completed in 0.22 seconds
  102. parallel clients
  103. bytes payload
  104. keep alive: 1
  105.  
  106. 4.27% <= 1 milliseconds
  107. 99.84% <= 2 milliseconds
  108. 100.00% <= 2 milliseconds
  109. 44642.86 requests per second
  110.  
  111. ====== LPUSH (needed to benchmark LRANGE) ======
  112. requests completed in 0.22 seconds
  113. parallel clients
  114. bytes payload
  115. keep alive: 1
  116.  
  117. 12.35% <= 1 milliseconds
  118. 99.62% <= 2 milliseconds
  119. 100.00% <= 2 milliseconds
  120. 46082.95 requests per second
  121.  
  122. ====== LRANGE_100 (first 100 elements) ======
  123. requests completed in 0.48 seconds
  124. parallel clients
  125. bytes payload
  126. keep alive: 1
  127.  
  128. 0.01% <= 1 milliseconds
  129. 3.27% <= 2 milliseconds
  130. 98.71% <= 3 milliseconds
  131. 99.93% <= 4 milliseconds
  132. 100.00% <= 4 milliseconds
  133. 20964.36 requests per second
  134.  
  135. ====== LRANGE_300 (first 300 elements) ======
  136. requests completed in 1.26 seconds
  137. parallel clients
  138. bytes payload
  139. keep alive: 1
  140.  
  141. 0.01% <= 2 milliseconds
  142. 0.14% <= 3 milliseconds
  143. 0.90% <= 4 milliseconds
  144. 7.03% <= 5 milliseconds
  145. 31.68% <= 6 milliseconds
  146. 78.93% <= 7 milliseconds
  147. 98.88% <= 8 milliseconds
  148. 99.56% <= 9 milliseconds
  149. 99.72% <= 10 milliseconds
  150. 99.95% <= 11 milliseconds
  151. 100.00% <= 11 milliseconds
  152. 7961.78 requests per second
  153.  
  154. ====== LRANGE_500 (first 450 elements) ======
  155. requests completed in 1.82 seconds
  156. parallel clients
  157. bytes payload
  158. keep alive: 1
  159.  
  160. 0.01% <= 2 milliseconds
  161. 0.06% <= 3 milliseconds
  162. 0.14% <= 4 milliseconds
  163. 0.30% <= 5 milliseconds
  164. 0.99% <= 6 milliseconds
  165. 2.91% <= 7 milliseconds
  166. 8.11% <= 8 milliseconds
  167. 43.15% <= 9 milliseconds
  168. 88.38% <= 10 milliseconds
  169. 97.25% <= 11 milliseconds
  170. 98.61% <= 12 milliseconds
  171. 99.26% <= 13 milliseconds
  172. 99.30% <= 14 milliseconds
  173. 99.44% <= 15 milliseconds
  174. 99.48% <= 16 milliseconds
  175. 99.64% <= 17 milliseconds
  176. 99.85% <= 18 milliseconds
  177. 99.92% <= 19 milliseconds
  178. 99.95% <= 20 milliseconds
  179. 99.96% <= 21 milliseconds
  180. 99.97% <= 22 milliseconds
  181. 100.00% <= 23 milliseconds
  182. 5491.49 requests per second
  183.  
  184. ====== LRANGE_600 (first 600 elements) ======
  185. requests completed in 2.29 seconds
  186. parallel clients
  187. bytes payload
  188. keep alive: 1
  189.  
  190. 0.01% <= 2 milliseconds
  191. 0.05% <= 3 milliseconds
  192. 0.10% <= 4 milliseconds
  193. 0.19% <= 5 milliseconds
  194. 0.34% <= 6 milliseconds
  195. 0.46% <= 7 milliseconds
  196. 0.58% <= 8 milliseconds
  197. 4.46% <= 9 milliseconds
  198. 21.80% <= 10 milliseconds
  199. 40.48% <= 11 milliseconds
  200. 60.14% <= 12 milliseconds
  201. 79.81% <= 13 milliseconds
  202. 93.77% <= 14 milliseconds
  203. 97.14% <= 15 milliseconds
  204. 98.67% <= 16 milliseconds
  205. 99.08% <= 17 milliseconds
  206. 99.30% <= 18 milliseconds
  207. 99.41% <= 19 milliseconds
  208. 99.52% <= 20 milliseconds
  209. 99.61% <= 21 milliseconds
  210. 99.79% <= 22 milliseconds
  211. 99.88% <= 23 milliseconds
  212. 99.89% <= 24 milliseconds
  213. 99.95% <= 26 milliseconds
  214. 99.96% <= 27 milliseconds
  215. 99.97% <= 28 milliseconds
  216. 99.98% <= 29 milliseconds
  217. 100.00% <= 29 milliseconds
  218. 4359.20 requests per second
  219.  
  220. ====== MSET (10 keys) ======
  221. requests completed in 0.37 seconds
  222. parallel clients
  223. bytes payload
  224. keep alive: 1
  225.  
  226. 0.01% <= 1 milliseconds
  227. 2.00% <= 2 milliseconds
  228. 18.41% <= 3 milliseconds
  229. 88.55% <= 4 milliseconds
  230. 96.09% <= 5 milliseconds
  231. 99.50% <= 6 milliseconds
  232. 99.65% <= 7 milliseconds
  233. 99.75% <= 8 milliseconds
  234. 99.77% <= 9 milliseconds
  235. 99.78% <= 11 milliseconds
  236. 99.79% <= 12 milliseconds
  237. 99.80% <= 13 milliseconds
  238. 99.81% <= 15 milliseconds
  239. 99.82% <= 16 milliseconds
  240. 99.83% <= 17 milliseconds
  241. 99.84% <= 19 milliseconds
  242. 99.85% <= 21 milliseconds
  243. 99.86% <= 23 milliseconds
  244. 99.87% <= 24 milliseconds
  245. 99.88% <= 25 milliseconds
  246. 99.89% <= 27 milliseconds
  247. 99.90% <= 28 milliseconds
  248. 99.91% <= 30 milliseconds
  249. 99.92% <= 32 milliseconds
  250. 99.93% <= 34 milliseconds
  251. 99.95% <= 35 milliseconds
  252. 99.96% <= 36 milliseconds
  253. 99.97% <= 37 milliseconds
  254. 99.98% <= 39 milliseconds
  255. 99.99% <= 41 milliseconds
  256. 100.00% <= 41 milliseconds
  257. 27173.91 requests per second

更详细的使用方法可以参加链接:

http://www.redis.cn/topics/benchmarks.html

-------------------------------------------

***番外篇***:

一、将redis做成一个服务

复制脚本到/etc/rc.d/init.d目录 
ps: /etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行 
其服务脚本位于:

  1. /usr/local/src/redis/utils/redis_init_script

必须将其复制到/etc/rc.d/init.d的目录下:

  1. cp /usr/local/src/redis/utils/redis_init_script /etc/rc.d/init.d/redis

将redis_init_script复制到/etc/rc.d/init.d/,同时易名为redis。

如果这时添加注册服务:

  1. chkconfig --add redis

将报以下错误:

  1. redis服务不支持chkconfig

为此,需要更改redis脚本。

2.更改redis脚本 
打开使用vi打开脚本,查看脚本信息:

  1. vim /etc/rc.d/init.d/redis

看到的内容如下(下内容是更改好的信息):

  1. #!/bin/sh
  2. #chkconfig: 2345 80 90
  3. # Simple Redis init.d script conceived to work on Linux systems
  4. # as it does use of the /proc filesystem.
  5.  
  6. REDISPORT=6379
  7. EXEC=/usr/local/redis/bin/redis-server
  8. CLIEXEC=/usr/local/redis/bin/redis-cli
  9.  
  10. PIDFILE=/var/run/redis_${REDISPORT}.pid
  11. CONF="/etc/redis/${REDISPORT}.conf"
  12.  
  13. case "$1" in
  14. start)
  15. if [ -f $PIDFILE ]
  16. then
  17. echo "$PIDFILE exists, process is already running or crashed"
  18. else
  19. echo "Starting Redis server..."
  20. $EXEC $CONF &
  21. fi
  22. ;;
  23. stop)
  24. if [ ! -f $PIDFILE ]
  25. then
  26. echo "$PIDFILE does not exist, process is not running"
  27. else
  28. PID=$(cat $PIDFILE)
  29. echo "Stopping ..."
  30. $CLIEXEC -p $REDISPORT shutdown
  31. while [ -x /proc/${PID} ]
  32. do
  33. echo "Waiting for Redis to shutdown ..."
  34. sleep 1
  35. done
  36. echo "Redis stopped"
  37. fi
  38. ;;
  39. *)
  40. echo "Please use start or stop as first argument"
  41. ;;
  42. esac

和原配置文件相比:

1.新增了第2行的内容

  1. #chkconfig: 2345 80 90

2.原文件EXEC、CLIEXEC参数,有所更改。

  1. EXEC=/usr/local/redis/bin/redis-server
  2. CLIEXEC=/usr/local/redis/bin/redis-cli

3.redis开启的命令,以后台运行的方式执行。

  1. $EXEC $CONF &

ps:注意后面的那个“&”,即是将服务转到后面运行的意思,否则启动服务时,Redis服务将

占据在前台,占用了主用户界面,造成其它的命令执行不了。

4.将redis配置文件拷贝到/etc/redis/${REDISPORT}.conf

  1. mkdir /etc/redis
  2. cp /usr/local/src/redis/redis.conf /etc/redis/6379.conf

这样,redis服务脚本指定的CONF就存在了。默认情况下,Redis未启用认证,可以通过开启6379.conf的requirepass 指定一个验证密码。

以上操作完成后,即可注册yedis服务:

  1. chkconfig --add redis

5.启动redis服务

  1. service redis start

二、将Redis的命令所在目录添加到系统参数PATH中 (添加环境变量)

修改profile文件:

  1. vi /etc/profile

在最后行追加:

  1. export PATH="$PATH:/usr/local/redis/bin"

然后马上应用这个文件:

  1. . /etc/profile

这样就可以直接调用redis-cli的命令了,如下所示:

  1. $ redis-cli
  2. redis 127.0.0.1:6379> auth superman
  3. OK
  4. redis 127.0.0.1:6379> ping
  5. PONG
  6. redis 127.0.0.1:6379>

redis测试实践的更多相关文章

  1. Redis进阶实践之十八 使用管道模式加速Redis查询

    一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...

  2. windows下php7.1安装redis扩展以及redis测试使用全过程

    最近做项目,需要用到redis相关知识.在Linux下,redis扩展安装起来很容易,但windows下还是会出问题的.因此,特此记下自己实践安装的整个过程,以方便后来人. 一,php中redis扩展 ...

  3. windows下php7.1安装redis扩展以及redis测试使用全过程(转)

    最近做项目,需要用到redis相关知识.在Linux下,redis扩展安装起来很容易,但windows下还是会出问题的.因此,特此记下自己实践安装的整个过程,以方便后来人. 一,php中redis扩展 ...

  4. Redis进阶实践之九 独立封装的RedisClient客户端工具类(转载9)

    Redis进阶实践之九 独立封装的RedisClient客户端工具类 一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己 ...

  5. Redis进阶实践之七Redis和Lua初步整合使用(转载 7)

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  6. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务(转载6)

    Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务 一.引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题 ...

  7. Redis进阶实践之二如何在Linux系统上安装安装Redis(转载)(2)

    Redis进阶实践之二如何在Linux系统上安装安装Redis 一.引言 上一篇文章写了“如何安装VMware Pro虚拟机”和在虚拟机上安装Linux操作系统.那是第一步,有了Linux操作系统,我 ...

  8. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中 ...

  9. Redis进阶实践之十三 Redis的Redis-trib.rb文件详解

    一.简介     事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的角度来阐述一下,对第一次使用的人来说很重要.redis-trib.rb是redis官方推出的管理re ...

随机推荐

  1. SpringBoot Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.

    使用SpringBoot写HelloWorld,当配置好启动类后,再创建新的controller或其它类,启动项目后访问对应的映射名,页面显示: Whitelabel Error Page This ...

  2. Cocos2d-x 实战

    跨平台商业项目实战:攻城大作战游戏创意触发点:做什么样的游戏?分析当前主流的游戏:经典游戏(俄罗斯方块).大众化的游戏(卡牌游戏.休闲游戏).重口味游戏. 游戏创意:生活当中 游戏开发流程:1.策划方 ...

  3. 请求转发(forward)和重定向(redirect)的区别

    转发不会改变地址栏,重定向会. 转发是请求一次,重定向请求两次. 转发过程中只有一个request对象产生,重定向是两个. 转发不能转发到站外,重定向可以发送到站外. 重定向的第2个请求的请求方式是什 ...

  4. 学习CTF的经历-文件分析

    文件分析-ZIP伪加密 最近在准备铁人三项赛的比赛,所以在实验吧上尝试着学习CTF,目前菜鸡一枚 我主要负责的是Web和安全杂项这一块,安全杂项的知识点较为薄弱,在实验吧练习的过程中遇到一个很有趣的题 ...

  5. VM虚拟机链接克隆及linux eth0网卡的快速设置方法

    对于后台开发者来说,在学习过程中必然接触众多中间件,在自己的虚拟机进行操作甚至搭建cluster是很常见的事情. 我在初学者时摸索出一套快速的克隆虚拟机方法.分享给大家. 产品VMware® Work ...

  6. SSM-Spring-15:Spring中名称自动代理生成器BeanNameAutoProxyCreator

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 名称自动代理生成器:BeanNameAutoProxyCreator 为了更好的测试,我放了俩个接口,俩个实现 ...

  7. CORS 实战 专题

    本文会代码层面对CORS问题进行剖析 CORS相关相关概念可参考http://www.cnblogs.com/softidea/p/5496719.html ERROR info: XMLHttpRe ...

  8. 激活IDEA 2017.3 mac版 2018.05.21亲测可用

    本文激活方式不会导致IEDA打不开,可激活一年,最简便方式,只需要30秒. 1.修改hosts sudo vim /private/etc/hosts 在文件最后一行中添加: 0.0.0.0 acco ...

  9. sublime text3汉化

    注意在安装 sublime text3 时勾选Add to explorer context menu,这样在右键单击文件时就可以直接使用Sublime Text打开. 下载Package Contr ...

  10. Mongodb数据更新命令、操作符

    一.Mongodb数据更新命令 Mongodb更新有两个命令:update.save. 1.1update命令 update命令格式: db.collection.update(criteria,ob ...