Skip to content

Latest commit

 

History

History
588 lines (416 loc) · 7.86 KB

缓存技术与性能测试.md

File metadata and controls

588 lines (416 loc) · 7.86 KB
marp paginate style
true
true
h1 { color: #0bb8e8; }
<style scoped> h1,h2 { color: #0bb8e8; text-align: center } h2 { text-align: right } </style>

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/