1 | 内存淘汰策略分类 |
Redis事务
发表于
分类于
Redis
其实redis的事务是个假事务,没有实现原子性,
若要php支持事务,必须一起执行,其中incr会报错
$status = $redis->multi()->lPush($key1, '1123')->lPush($key2, '2123')->incr("age","age")->exec();
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
//开启事务
$redis->multi();
$redis->setex('keyTest', 60, 1);
$redis->get('keyTest');
$redis->incr('keyTest');
$redis->get('keyTest');
//执行事务
$ret = $redis->exec();
print_r($ret);
} catch (Exception $e){
echo $e->getMessage();
}
//输出
Array
(
[0] => 1
[1] => 1
[2] => 2
[3] => 2
)
取消事务
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
//先设置缓存keyTest为1
$redis->setex('keyTest', 60, 1);
//开启事务
$redis->multi();
$redis->setex('keyTest', 60, 10);
$redis->get('keyTest');
$redis->incr('keyTest');
$redis->get('keyTest');
//取消事务
$redis->discard();
$ret = $redis->get('keyTest');
var_dump($ret);
//查看keyTest
} catch (Exception $e){
echo $e->getMessage();
}
//输出
string(1) "1"
监视键,并执行事务
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
//先设置缓存keyTest为1
$redis->setex('keyTest', 60, 1);
//监视keyTest
$redis->watch(array('keyTest'));
//假设在开始监视之后,执行事务之前,keyTest被并发操作redis的其他用户修改了
$redis->setex('keyTest', 60, 10);
//开启事务
$redis->multi();
$redis->incr('keyTest');
//执行事务
$ret = $redis->exec();
var_dump($ret);
$ret = $redis->get('keyTest');
var_dump($ret);
//查看keyTest
} catch (Exception $e){
echo $e->getMessage();
}
//输出
bool(false)
string(2) "10"
redis抢购
1 | <?php |
Redis过期删除策略
发表于
分类于
Redis
定时删除;
惰性删除;
定期删除;
定时删除策略是怎么样的?
1 | 定时删除策略的做法是,在设置 key 的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行 key 的删除操作。 |
惰性删除策略是怎么样的?
1 | 惰性删除策略的做法是,不主动删除过期键,每次从数据库访问 key 时,都检测 key 是否过期,如果过期则删除该 key。 |
定期删除策略是怎么样的?
1 | 定期删除策略的做法是,每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。 |
所以, Redis 选择「惰性删除+定期删除」这两种策略配和使用,以求在合理使用 CPU 时间和避免内存浪费之间取得平衡。
Redis 是怎么实现定期删除的?
1 | 定期删除策略的做法:每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。 |
针对定期删除的流程伪代码:
1 | do { |
查找redis永不过期的key
发表于
分类于
Redis
keys *阻塞进程,消耗比较大,慎用
1 | #!/bin/bash |
Redis几种常用数据类型的数据结构
发表于
分类于
Redis
以下是redis-7版本以下适用
string
1 | int编码:当字符串长度小于等于12字节并且字符串可以表示为整数时,Redis会使用int编码。 |
hash
1 | ziplist(压缩列表):当Hash类型的元素比较少,且元素的大小比较小(小于64字节)时,Redis采用ziplist作为Hash类型的内部编码。 |
list
1 | ziplist |
set
1 | intset(整数集合):当Set类型只包含整数类型的数据,并且元素数量较少(小于512个)时,Redis会使用intset作为Set类型的内部编码。 |
zset
1 | ziplist编码:当Zset中元素个数小于128个,并且所有元素的长度都小于64字节时,Redis会使用ziplist编码存储Zset。 |
Redis 的混合持久化
发表于
分类于
Redis
1 | aof-use-rdb-preamble 选项设置为 yes,并且要同时启用 RDB 和 AOF 两种持久化 |
启用 AOF 模式
1 | 将 appendonly 设置为 yes。默认是 no。 |
启用RDB
1 | save 3600 1 # 3600秒内如果超过1个key被修改则生成 RDB |
混合持久化的优缺点
优点:
1 | 更快的启动速度:混合持久化结合了RDB的速度优势,所以Redis可以更快地重新启动,不用等待很久。 |
缺点:
1 | 稍微复杂:因为它结合了两种技术,所以处理起来比单一的 RDB 或 AOF 要复杂一点。 |
acme.sh实现域名SSL证书自动申请与更新
发表于
分类于
nginx
域名注册与解析位于阿里云
安装acme.sh
1 | curl https://get.acme.sh | sh |
这个自动安装过程完成了以下几个步骤(上面那一步默认已经执行了这个操作,如果成功了,这步省略)
1 | 拷贝sh脚本到~/.acme.sh/ |
配置阿里云解析
运行如下命令,配置阿里云api接口的key和secret,其中的值需要到阿里云控制台中去寻找。
1 | export Ali_Key="xxxxxxxxxxxx" |
这两个配置将永久保存在文件~/.acme.sh/account.conf中
为域名申请证书
运行如下命令,一键申请证书。
这一步需要在dns后台加一个泛域名的解析,也就是*
1 | acme.sh --issue --dns dns_ali -d *.example.com |
证书申请成功后,保存在~/.acme.sh/*.example.com目录下
将证书部署到nginx
运行如下命令,自动将证书部署到nginx。
比如我们要部署www域名,这个www也要在dns后台先解析,acmh只是申请一个通用证书
1 | acme.sh --install-cert -d www.example.com --key-file /etc/nginx/cert/www.example.com.key --fullchain-file /etc/nginx/cert/www.example.com.pem |
该命令中的参数将自动保存在~/.acme.sh/www.example.com目录下的www.example.com.conf文件里,定时器更新证书的时候实现自动部署。
配置nginx
1 | server { |
nginx文件服务器根据文件类型判断预览还是下载
发表于
分类于
nginx
1 | location /file { |
nginx配置访问密码
发表于
分类于
nginx
安装htpassed工具
1 | yum -y install httpd-tools |
创建用户名和密码
1 | htpasswd -c /etc/nginx/.htpasswd username |
修改nginx配置文件
1 | server { |
nginx代理mysql
发表于
分类于
nginx
之前服务器单体架构mysql是直接安装在服务器的,没有买托管,这就造成一个问题,如果想要远程连接mysql就要开启3306防火墙端口,全是恶意ip进行攻击。。。。
nginx的stream模块可以有效限制远程ip访问
1 | stream { |