研究了一段时间的缓存清除,说说了解的三种方式吧。
1. 原始的只增加缓存模块的,根据访问的路径一条条清除。
根据此方式要进行批量清除的话,必须在设定的缓存目录下通过自己写的程序来读取nginx文件中的配置,然后根据配置文件中的路径查找缓存文件,找到配置的缓存文件,并索引,然后根据索引的缓存路径值执行单个文件清除。
此方法,大量时间耗费在缓存文件的查找上,当文件上G的时候就很慢,文件越多速度越慢。
还有一个脚本实现方式在此 nginx-cache-purge,里面用了并行的查找相对快点,不过速度还是慢。
2.修改缓存代码,实现按域名(可以适当加路径)来缓存,这样可以快速定位到需要的文件夹中进行批量清除。
此方法,只是在缓存文件的路径前增加了一个域名目录,其他操作和第一种类似 ,这样可以大大提高速度。至少不用全局搜索。
相应的代码 在此有说明 Nginx配置缓存,按域名存放。如果增加了域名下的目录的话可能会更快一点,但是感觉会影响性能,本人测试了一下,在域名 + 5级目录的情况下一般可以正常访问,只是有时候会出现访问不了的情况,不过刷新一下就可以。不过要增加文件目录为缓存路径的话必须考虑uri中的特殊字符和linux系统文件路径长度的问题。
3.也是修改代码 生成一个group key来缓存同一类型的文件,清除的时候可以根据groupkey来缓存。
这个是一个外国人写的补丁,可以设定某个关键字来清除。可以根据需要灵活设定。相应的说明在此 Nginx cache grouped by keys 。这个配置比较灵活,可以根据需要设定,例如也可以配置一下,根据目录来缓存,但一个文件只能有一种类型的groupkey。因此要是设置了父目录为groupkey的话,再设置子目录就会根据子目录来进行groupkey。因此,可以实现的是根据每个目录来缓存,清除的时候只能一次清除一个目录的文件,要想清除整个域名下的缓存的话就得所有目录的缓存清除了。
要想即实现能一次清除整个域名下的目录又能在需要的时候清除某个一个具体目录下的文件,或清除单个文件这个有点麻烦??
可以通过修改代码实现带*通配符的指删除,先将文件移动 到一个目录后再清除 ,这样能表面上实现瞬间的清除,删除工作在后台进行着。
还有要是直接把缓存路径中的目录删除的话会对访问有影响?内存中的值会被释放?里面的红黑树会变化?