marp | paginate | style |
---|---|---|
true |
true |
h1 {
color: #0bb8e8;
}
|
主要作用是提升系统的性能。 任何多级系统都会使用到缓存技术,以加速系统性能。 比如 CPU 与内存,硬盘,网络 IO。
对于 Web 开发者来说,主要关心的缓存技术是服务器缓存技术。 服务器缓存,主要缓存以下几类数据:
- session 信息
- 经常访问的 html 静态页面
- 缓存固定或者基本不变化的常量数据。比如 pi,分类信息,行政区划等
- 缓存用户信息
- 缓存模板信息或者模板生成信息
- 开源
- 内存数据结构存储
- 可以当成是数据库,缓存,或者消息中介
- 支持字符,哈希,列表,集合,排序的集合,图片,地理信息,超级日志等类型的数据
- 内建对集群的支持
- 支持永久存储
Ubuntu:
sudo apt-get install redis-server
通过
dpkg -L redis-server
可以查看安装的文件
格式:
redis-cli -h host -p port -a password
- 执行命令行工具 redis-cli
$ redis-cli
127.0.0.1:6379>
其中 6379 是 redis 服务器的默认端口号
- 测试连接性
127.0.0.1:6379> ping
PONG
返回 PONG 表示服务器是正常能连接的。
- 查看所有配置信息
127.0.0.1:6379> CONFIG GET *
这时会返回所有的配置信息。
- 查看具体的配置信息
所有配置会显得过多,我们可以选择对一个配置进行查看
127.0.0.1:6379> CONFIG GET 'dbfilename'
1) "dbfilename"
2) "dump.rdb"
- 设置配置信息
格式:
127.0.0.1:6379> CONFIG SET <key, value>
示例:
127.0.0.1:6379> CONFIG SET loglevel 'notice'
OK
- maxclients 最多客户连接数
设置 maxclients 0,表示不作限制
CONFIG GET 'maxclients'
1) "maxclients"
2) "10000"
- maxmemory 最大允许内存 当内存超出后,如果启动了 vm,数据将会被保存在 swap 中,但 key 仍保存在内存里。
CONFIG GET 'maxmemory'
1) "maxmemory"
2) "0"
- requirepass 服务器的密码
127.0.0.1:6379> CONFIG GET 'requirepass'
1) "requirepass"
2) ""
- port 服务器的端口
默认端口为 6379
127.0.0.1:6379> CONFIG GET 'port'
1) "port"
2) "6379"
- bind 服务器的绑定 IP
默认是 127.0.0.1
127.0.0.1:6379> CONFIG GET 'bind'
1) "bind"
2) "127.0.0.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"
- 字符串(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)
- 哈希数据(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"
- 列表数据(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"
- 集合(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"
- 有序集合(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"
- 订阅 消息
127.0.0.1:6379> SUBSCRIBE chat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chat"
3) (integer) 1
- 发布 消息 新开一个连接,通过 PUBLISH chat。
$ redis-cli
127.0.0.1:6379> PUBLISH chat "Hello world"
(integer) 1
- 备份
redis 127.0.0.1:6379> SAVE
该命令将在 redis 的安装目录中创建文件 dump.rdb。
- 恢复
将备份文件 dump.rdb 放在 redis 安装目录再启动。 目录地址:
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis"
redis-cli flushall
- 安装 redis 包
npm install redis --save
- 连接到 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();
});
- 设置字符串
redisClient.set("key1", "value1");
// 或者
redisClient.set(["key2", "value2"]);
// 或者
redisClient.set(["key3", "value3"], function() {
console.log("key set");
});
- 获取字符串
redisClient.get("key1", function(err, reply) {
console.log(reply);
redisClient.quit();
});
结果是:
value1
- 设置失效时间
client.set('key4', 'value!', 'EX', 10);
设置 10 秒后失效
- 设置哈希对象
a. 通过对象设置
client.hmset("key", {
subk1: "v1",
subk2: "v2",
subk3, "v3"
});
b. 通过<subk, v>数列设置
client.hmset("key1", "subk1", "v1", "subk2", "v2", "subk3", "v3");
- 获取哈希对象
client.hgetall("key", function (err, obj) {
console.log(obj);
});
- 创建一个发布连接
var redis = require("redis");
var pub = redis.createClient();
- 创建一个接收连接
var redis = require("redis");
var sub = redis.createClient();
- 侦听订阅消息
sub.on("message", function (channel, message) {
});
- 订阅一个消息
sub.subscribe("a channel");
- 发布一个消息
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)
Ubuntu 下面:
sudo apt install apache2-utils
- 本地测试
ab -n 1000 -c 80 http://127.0.0.1:8080/
其中 -n 1000 表示请求次数 -c 80 表示并发数
- 远程测试
ab -n 5 -c 1 http://www.sina.com.cn/