nginx+redis 实现 jsp页面缓存,提升系统吞吐率

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 最近在开发的时候,发现之前APP客户端的一部分页面用的是webview交互,这些页面请求很多,打开一套试卷,将会产生100+的请求量,导致系统性能下降。于是考虑在最靠近客户端的Nginx服务器上做Redis缓存。

最近在开发的时候,发现之前APP客户端的一部分页面用的是webview交互,这些页面请求很多,打开一套试卷,将会产生100+的请求量,导致系统性能下降。于是考虑在最靠近客户端的Nginx服务器上做Redis缓存。综合了下网上对于php缓存的资料,经过一番改动,终于搭建成功。由于网上的是针对php的,而且没有说明,对于我这种完全不动运维的人来说,研究下来还是挺痛苦的。所以整理一份比较完整的,供大家参考。

以下的配置中,可能有不适合或者写的有问题的。请留言指出,谢谢!

最终缓存以后,整个项目结构图如下(图片复制的,请自动脑补充memcache为redis,php为tomcat):

 

参考文章地址:

1.srcache_nginx+redis构建缓存系统 http://www.ttlsa.com/nginx/construction-of-srcache_nginx_redis-caching-system/

2.httpsrcachemodule wiki  http://wiki.nginx.org/HttpSRCacheModule#srcache_response_cache_control

1. 安装Nginx

首先下载Nginx安装包,tar zvxf解压到/usr/local/src目录;

下载模块ngx_devel_kit,  set-misk-nginx-module,  srcache-nginx-module,  echo-nginx-module,  ngx-http-redis,  redis2-nginx-module;

将这些模块解压到/usr/local/src/modules/下面;

进入/usr/local/src/nginx-1.8.0/目录,执行如下命令:

./configure --add-module=../modules/echo-nginx-module-0.57 --add-module=../modules/ngx_http_redis-0.3.7  --add-module=../modules/ngx_devel_kit-0.2.19 --add-module=../modules/set-misc-nginx-module-0.29  --add-module=../modules/srcache-nginx-module-master --add-module=../modules/redis2-nginx-module-master

然后执行make;make install;

默认安装到/usr/local/nginx/目录中,至此安装成功;

 

2. 配置Nginx

首先在Http体中声明upstream(这个命令没有研究,只能自己猜测了下),代码如下:

upstream redis{
    server 127.0.0.1:6379;
    keepalive 512;
}

 

 server 是Redis服务器的IP+PORT,keepalive是保持的连接数,这个连接数是网上的,对于我的项目来说应该是太大了。大家自行修改。

配置Server中的location监听

 

 

复制代码
location /test/ {
    #这三个命令参考srcache 文档,http://wiki.nginx.org/HttpSRCacheModule
    srcache_store_private on;
    srcache_methods GET;
    srcache_response_cache_control off;

    #匹配自己的路径,由于Nginx不支持嵌套if,所以这么写
    if ($uri ~ /test/index\.jsp$){
        set $flag "${flag}1";
    }
    if ($arg_id ~ [0-9]+$){
        set $flag "${flag}1";
    }
    if ($flag = "011"){
        #这里我用普通的请求参数来作为缓存的键值,网上的是用MD5,但是对于更新缓存又多了操作。大家根据业务自行调整。
        set $key $arg_id;
        set_escape_uri $escaped_key $key;
        #请求过来会先查询这个
        srcache_fetch GET /redis $key;
        #过期时间
        srcache_default_expire 60;
        srcache_store PUT /redis2 key=$escaped_key&exptime=$srcache_expire;
        #添加头信息
        add_header X-Cached-From $srcache_fetch_status;
        add_header X-Cached-Store $srcache_store_status;
        add_header X-Key $key;
        set_md5 $md5key $key;
        add_header X-md5-key $md5key;
        add_header X-Query_String $query_string;
        add_header X-expire $srcache_expire;
    }
    #网上都是用fast_cgi来代理,没弄会,就用最初的了,貌似fast_cgi是apache php下用的
    proxy_pass http://192.168.1.102:8080;
}
#redis模块
location = /redis {
    internal;
    set $redis_key $args;
    redis_pass redis;
}
#redis2模块
location = /redis2 {
    internal;
 
    set_unescape_uri $exptime $arg_exptime;
    set_unescape_uri $key $arg_key;
 
    redis2_query set $key $echo_request_body;
    redis2_query expire $key $exptime;
    redis2_pass redis;
}

复制代码

 

 到这里后,配置就完成了。

 

3. 运行效果

没有做缓存状态:
memc-nginx
有做缓存状态:
memc-nginx

 

响应头信息

第一次请求:
memc-nginx
再次请求:
memc-nginx

 

运行效果明显的是X-cached-from这个头信息的变化。

 

 

4. 未解决的问题

不明白用了httpredis2为什么还要引入httpredis,查询文档后的结果是说redis2是httpredis升级版,但是wiki上说:

Also, you need both HttpRedisModule and HttpRedis2Module. The former is used in the srcache_fetch subrequest and the latter is used in the srcache_store subrequest.

也就是说两个都要。

 

另外就是对于/redis这个location里,没有redis get这样的代码,是怎么获取到返回信息的。最初自己只安装httpredsi2,用redis2_pass redis不好使。然后加入redis2_query get $redis_key,依然不好使。无奈只好按照文档上的来了。

 

 

有比较熟悉这个的大侠请留言指出,好在部署线上环境前进行优化!!谢谢!!

 

http://www.cnblogs.com/luochengqiuse/p/4677027.html

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
96
分享
相关文章
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
Redis应用—8.相关的缓存框架
Redis缓存设计与性能优化
Redis缓存设计与性能优化涵盖缓存穿透、击穿、雪崩及热点key重建等问题。针对缓存穿透,可采用缓存空对象或布隆过滤器;缓存击穿通过随机设置过期时间避免集中失效;缓存雪崩需确保高可用性并使用限流熔断组件;热点key重建利用互斥锁防止大量线程同时操作。此外,开发规范强调键值设计、命令使用和客户端配置优化,如避免bigkey、合理使用批量操作和连接池管理。系统内核参数如vm.swappiness、vm.overcommit_memory及文件句柄数的优化也至关重要。慢查询日志帮助监控性能瓶颈。
30 9
Redis,分布式缓存演化之路
本文介绍了基于Redis的分布式缓存演化,探讨了分布式锁和缓存一致性问题及其解决方案。首先分析了本地缓存和分布式缓存的区别与优劣,接着深入讲解了分布式远程缓存带来的并发、缓存失效(穿透、雪崩、击穿)等问题及应对策略。文章还详细描述了如何使用Redis实现分布式锁,确保高并发场景下的数据一致性和系统稳定性。最后,通过双写模式和失效模式讨论了缓存一致性问题,并提出了多种解决方案,如引入Canal中间件等。希望这些内容能为读者在设计分布式缓存系统时提供有价值的参考。感谢您的阅读!
130 6
Redis,分布式缓存演化之路
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
207 85
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
125 4
【赵渝强老师】基于Redis的旁路缓存架构
|
4月前
|
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
82 5
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等