Skip to content

Latest commit

 

History

History
508 lines (420 loc) · 7.64 KB

缓存技术与性能测试.md

File metadata and controls

508 lines (420 loc) · 7.64 KB

Node.js进阶 缓存技术

⭐ by calidion


缓存技术的作用

主要作用是提升系统的性能。 任何多级系统都会使用到缓存技术,以加速系统性能。 比如CPU与内存,硬盘,网络IO。


Web服务器缓存

对于Web开发者来说,主要关心的缓存技术是服务器缓存技术。 服务器缓存,主要缓存以下几类数据:

  1. session信息
  2. 经常访问的html静态页面
  3. 缓存固定或者基本不变化的常量数据。比如pi,分类信息,行政区划等
  4. 缓存用户信息
  5. 缓存模板信息或者模板生成信息

常见的缓存服务器

  1. redis
  2. memcached

redis

  1. 开源
  2. 内存数据结构存储
  3. 可以当成是数据库,缓存,或者消息中介
  4. 支持字符,哈希,列表,集合,排序的集合,图片,地理信息,超级日志等类型的数据
  5. 内建对集群的支持
  6. 支持永久存储

安装redis

Ubuntu:

sudo apt-get install redis-server

通过

dpkg -L redis-server

可以查看安装的文件


连接到redis服务器

格式:

redis-cli -h host -p port -a password
  1. 执行命令行工具redis-cli
$ redis-cli 
127.0.0.1:6379> 

其中6379是redis服务器的默认端口号


  1. 测试连接性
127.0.0.1:6379> ping
PONG

返回PONG表示服务器是正常能连接的。


redis配置信息

  1. 查看所有配置信息
127.0.0.1:6379> CONFIG GET *

这时会返回所有的配置信息。

  1. 查看具体的配置信息

所有配置会显得过多,我们可以选择对一个配置进行查看

127.0.0.1:6379> CONFIG GET 'dbfilename'
1) "dbfilename"
2) "dump.rdb"

  1. 设置配置信息

格式:

127.0.0.1:6379> CONFIG SET <key, value>

示例:

127.0.0.1:6379> CONFIG SET loglevel 'notice'
OK

重要配置参数说明

  1. maxclients 最多客户连接数

设置 maxclients 0,表示不作限制

CONFIG GET 'maxclients'
1) "maxclients"
2) "10000"

  1. maxmemory 最大允许内存 当内存超出后,如果启动了vm,数据将会被保存在swap中,但key仍保存在内存里。
CONFIG GET 'maxmemory'
1) "maxmemory"
2) "0"
  1. requirepass 服务器的密码
127.0.0.1:6379> CONFIG GET 'requirepass'
1) "requirepass"
2) ""

  1. port 服务器的端口

默认端口为6379

127.0.0.1:6379> CONFIG GET 'port'
1) "port"
2) "6379"
  1. bind 服务器的绑定IP

默认是127.0.0.1

127.0.0.1:6379> CONFIG GET 'bind'
1) "bind"
2) "127.0.0.1"

  1. save 保存频率 指代保存被触发的条件,默认有三个: a. [900 1] 表示900秒里1次操作,会保存 b. [300 10] 表示300秒里10次操作,会保存 c. [60 10000] 表示60秒里执行了10000次操作,会保存

也就是更新频率越快,保存的越频繁。

127.0.0.1:6379> CONFIG GET 'save'
1) "save"
2) "900 1 300 10 60 10000"

缓存数据

  1. 字符串(string) 格式: a. 设置: SET <key, value> b. 获取: GET <key, value> b. 删除: DEL key

key区分大小写

127.0.0.1:6379> SET name 'hello'
OK
127.0.0.1:6379> GET name
"hello"
127.0.0.1:6379> GET Name
(nil)

  1. 哈希数据(hash)

格式: a. 设置 HMSET key <subkey, value> <subkey, value> b. 获取 HGETALL key b. 获取 HGET key

127.0.0.1:6379> HMSET a a 1 b 2
OK
127.0.0.1:6379> HGETALL a
1) "a"
2) "1"
3) "b"
4) "2"
127.0.0.1:6379> HGET a
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> HGET a a
"1"

  1. 列表数据(list)

格式: a. 设置 LPUSH <key, value> b. 获取 LRANGE key <from, to> 列表最多可存储 $$ 2^32 - 1 $$ 个元素

127.0.0.1:6379> LPUSH aaa 1
(integer) 1
127.0.0.1:6379> LPUSH aaa 2
(integer) 2
127.0.0.1:6379> LPUSH aaa 3
(integer) 3
127.0.0.1:6379> LRANGE aaa 0 100
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> LRANGE aaa 0 1
1) "3"
2) "2"

  1. 集合(set) 格式: a. 设置 SADD <key, value> b. 获取 SMEMBERS key

集合最多可存储 $$ 2^32 - 1 $$ 个元素

127.0.0.1:6379> SADD AAA 111
(integer) 1
127.0.0.1:6379> SADD AAA 29292
(integer) 1
127.0.0.1:6379> SADD AAA 292923
(integer) 1
127.0.0.1:6379> SADD AAA 111
(integer) 0
127.0.0.1:6379> SMEMBERS AAA
1) "111"
2) "29292"
3) "292923"

  1. 有序集合(sorted set) 格式: a. 设置 ZADD key score value b. 获取 ZRANGEBYSCORE key
127.0.0.1:6379> ZADD DDD 0 AAA
(integer) 1
127.0.0.1:6379> ZADD DDD 0 BBB
(integer) 1
127.0.0.1:6379> ZADD DDD 0 CCC
(integer) 1
127.0.0.1:6379> ZADD DDD 0 CCC
(integer) 0
127.0.0.1:6379> ZRANGEBYSCORE DDD 0 10
1) "AAA"
2) "BBB"
3) "CCC"

订阅/发布消息

  1. 订阅 消息
127.0.0.1:6379> SUBSCRIBE chat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chat"
3) (integer) 1
  1. 发布 消息 新开一个连接,通过PUBLISH chat。
$ redis-cli 
127.0.0.1:6379> PUBLISH chat "Hello world"
(integer) 1

数据备份与恢复

  1. 备份
redis 127.0.0.1:6379> SAVE 

该命令将在redis的安装目录中创建文件dump.rdb。

  1. 恢复

将备份文件dump.rdb放在redis安装目录再启动。 目录地址:

127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis"

消除所有缓存数据

redis-cli flushall

在Node下使用redis


  1. 安装redis包
npm install redis --save
  1. 连接到redis服务器
var redis = require('redis');
var config = { "host": "127.0.0.1", "port": "6379" };
var redisClient = redis.createClient(config);
redisClient.on("connect", function() {
  console.log("connected");
  redisClient.quit();
});

  1. 设置字符串
redisClient.set("key1", "value1");
// 或者
redisClient.set(["key2", "value2"]);
// 或者
redisClient.set(["key3", "value3"], function() {
console.log("key set");
});

  1. 获取字符串
redisClient.get("key1", function(err, reply) {
  console.log(reply);
  redisClient.quit();
});

结果是:

value1

  1. 设置失效时间
client.set('key4', 'value!', 'EX', 10);

设置10秒后失效


  1. 设置哈希对象

a. 通过对象设置

client.hmset("key", {
  subk1: "v1", 
  subk2: "v2",
  subk3, "v3"
});

b. 通过<subk, v>数列设置

client.hmset("key1", "subk1", "v1", "subk2", "v2", "subk3", "v3");

  1. 获取哈希对象
client.hgetall("key", function (err, obj) {
    console.log(obj);
});

订阅与发布消息

  1. 创建一个发布连接
var redis = require("redis");
var pub = redis.createClient();
  1. 创建一个接收连接
var redis = require("redis");
var sub = redis.createClient();

  1. 侦听订阅消息
sub.on("message", function (channel, message) {
});
  1. 订阅一个消息
sub.subscribe("a channel");

  1. 发布一个消息
pub.publish("a channel", "sending a message.");

由于publish与subscribe需要有时间差。 所以subscribe之后直接publish可能会失效。 所以测试时可以使用setTimeout

setTimeout(function() {
  pub.publish("a channel", "sending a message.");
}, 5);

性能测试

衡量Web性能的最常用的指标是

QPS=Query Per Second

也就是每秒钟的请求次数。

而最常用的测试工具就是ab(apache bench)


ab安装

Ubuntu下面:

sudo apt install apache2-utils

ab测试

  1. 本地测试
ab -n 1000 -c 80 http://127.0.0.1:8080/

其中 -n 1000 表示请求次数 -c 80 表示并发数

详细


  1. 远程测试
ab -n 5 -c 1 http://www.sina.com.cn/