Nginx 连接 Redis 实现数据库操作

实现的功能:当有新的连接到达Nginx时,在redis记录连接数量。

1. redis 创建数据库

安装完成redis之后,通过set connums 0 创建数据。(redis基本使用参照官方文档即可)。

2. 更改 Nginx 源码

由于是要在新建连接时进行连接计数加一,因此需要在nginx accept新的连接时进行计数操作,首先找到 Nginx 处理新连接的函数所在文件nginx/src/event/ngx_event_accept.c,在该文件中能够找到建立连接的函数为:ngx_event_accept。在代码中添加连接redis数据库的方法以及连接计数增加的代码,新增的代码如下(省略号表示中间穿插有nginx的源码):

#include <hiredis/hiredis.h>
.........redisContext *conn  = redisConnect("127.0.0.1",6379);  //建立连接,都位于一台机器if(conn != NULL && conn->err){printf("connection error: %s\n",conn->errstr);return ;}......redisReply *reply = redisCommand(conn,"incr connums");//自增reply = redisCommand(conn,"get connums");    // 获取数值printf("%s\n",reply->str);freeReplyObject(reply);                               //释放...........redisFree(conn);                                     //释放连接

编译nginx

由于更改了nginx源码所以需要重新编译nginx,并且由于以上的信息是通过printf函数输出的,因此需要通过nginx配置文件的daemon off;选项,使得printf能够进行输出。

  1. 修改 daemon 选项
  2. 修改 Makefile 文件,进入nginx源码中,找到Makefile文件内容如下:

default: build
clean:
rm -rf Makefile objs
build:
$(MAKE) -f objs/Makefile # 可以看到makefile使用的是这个文件,因此需要去该目录下的Makefile文件中进行修改
install:
$(MAKE) -f objs/Makefile install
modules:
$(MAKE) -f objs/Makefile modules
upgrade:
/usr/local/nginx/sbin/nginx -t
kill -USR2 cat /usr/local/nginx/logs/nginx.pid
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT cat /usr/local/nginx/logs/nginx.pid.oldbin

  1. 修改 nginx/obj/Makefile,在该文件中添加-lhiredis来实现编译。 nginx/obj/Makefile文件的前几行如下:

CC = cc
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g
CPP = cc -E
LINK = $(CC)

因此第一反应便是将-lhiredis 加到 CFLAGS 后面,但是实践过后会发现,会报错如下:

而上图中圈起来的部分正是真真的错误原因,需要将-lhiredis添加到 -lz 的后面,才能真正通过编译。至于原因,应该是跟Nginx的编译方式有关,有待研究。

结果


通过浏览器访问nginx页面能实现计数的自增。

问题说明

  1. Nginx有极好的模块化编程,这种直接更改的方式无疑会破坏Nginx的模块化,因此并不推荐,此处只是作为实验。
  2. 与redis的连接创建是每次有新连接到来时创建,连接处理结束时销毁,这种方式也会对Nginx的处理性能造成破坏。
  3. 由于是初次使用,对hiredis的连接方式以及协议等方面不够了解,使用也停留在最基本的层面,后续可以研究通过异步非阻塞的方式实现redis的连接。
  4. redis的自增没有在nginx重启后置0,这可以实现也可以不实现,取决于需求。
  5. 一次连接请求会产生两次计数,应该是nginx连接建立机制的问题,后续继续研究。

Nginx 连接 Redis 实现数据库操作相关推荐

  1. Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例

    学习目标 redis 概念 下载安装 命令操作 1. 数据结构 持久化操作 使用Java客户端操作redis Redis 前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念: redis是 ...

  2. VBA连接SQL SERVER数据库操作Excel

     VBA连接SQL SERVER数据库操作Excel. Sub 按钮1_Click() Dim i As Integer, j As Integer, sht As Worksheet 'i,j为 ...

  3. Spring boot 连接Redis实现HMSET操作

    这篇文章记录使用spring-boot-starter-redis访问Redis.Redis相关的的配置文件放在Resources目录下的application.yml文件中,如下所示: spring ...

  4. idea连接sqlserver及数据库操作

    idea连接sqlserver及操作 一.在连接过程中遇到的问题: (1)数据库登录失败 (2)登录成功之后 数据库端口号怎么查看 二.代码连接数据库 ①加载驱动和连接数据库 三.数据库操作 连接详解 ...

  5. python连接sql sever_R和python连接SQL sever 数据库操作

    在R的使用中,为了方便提取数据, 我们经常要进行数据库进行操作,接下来我们尝试使用R进行连接数据. 这里我们使用R中的RODBC进行操作, 首先,我们需要先配置ODBC资源管理器 通过任务管理器或者w ...

  6. thinkphp5.0连接mysql_thinkphp5.0数据库操作

    ThinkPHP数据库处理: 1.MySQL的数据库连接 首先配置database.php文件 使用{dump(config('database));}来查看数据库的配置项 使用 {$res = Db ...

  7. medoo连接mysql_Medoo PHP数据库操作类

    Medoo是一个加速网站开发的最轻量的PHP数据库框架类!Medoo可以极大地加快你的PHP项目的开发.在进行Web开发的时候,很大一部分企业或个人都会选择使用PHP语言,而Medoo则可以起到锦上添 ...

  8. cyq.data 连接mysql_底层数据库操作类库CYQ.DATA查询

    单表查询: using (MAction action = new MAction("COMP","K3")) { //查询的字段 string colstr ...

  9. python数据库操作——连接SQLite

    python数据库操作--连接SQLite   hello!我是wakeyo_J,每天一个konwledge point,一起学python,让技术无限发散. 连接SQLite python数据库操作 ...

最新文章

  1. mysql 所有表的字段信息_mysql如何查询所有表和字段信息
  2. AI一分钟|欧盟将对Google开出天价罚单;智能家居制造商Nest并入Google;沃尔玛与微软合作挑战AWS...
  3. 在执行ab压力测试时出现socket: Too many open files (24)的解决方法
  4. 在线编译工具 Jenkins Hudson 的关系
  5. kdj超卖_三分钟学会KDJ三大买卖绝技,简单高效,把握最佳买卖点,不懂KDJ的股民值得一看!...
  6. 设计模式之_Strategy_05
  7. ArcGIS Server安装的几个问题
  8. 开发人员需要了解的有关xPaaS的一切
  9. nginx 启动命令_Nginx实战001:Window中配置使用Nginx入门
  10. 学而思“变身”乐读后宣布下架,已收家长费用“多退少不补”
  11. vue 传递 对象 路由_javascript – 如何在Vue中提交表单,重定向到新路由并传递参数?...
  12. AppWeb服务后台登陆及配置的方法解答
  13. 请求支付宝渠道报错:40006,Insufficient Permissions,ISV权限不足
  14. 服务器系统怎么安装网卡驱动,Windows7系统怎么安装8139网卡驱动
  15. 基于B_spline 的非刚性形变
  16. 服务器 战地4 无限载入,战地4卡在loading界面无限载入_战地4无限载入解决方法...
  17. 格式化代码 format.js
  18. Ubuntu通过samba winbind集成AD账号
  19. PC版QQ的“版本太旧, 无法继续使用“ 及升级后的R6030运行时错
  20. 攻防世界_难度8_happy_puzzle

热门文章

  1. windows服务器2012,ftp用File zilla连接不上是怎么回事???
  2. 如何更改linux下目录所属用户和用户组
  3. 索尼X90J和X95J区别 索尼X90J和X95J哪个好?
  4. 使用移动硬盘出现的问题总结
  5. CodeForces 140C - New Year Snowmen(数据结构)
  6. 用Python中BeautifulSoup爬取翻页式网页图片(爬取海贼王漫画)
  7. 《独行月球》火爆热映,苏州企业“渲”出宇宙级浪漫!
  8. 万字图解Java多线程
  9. Matplot 与 Pyqt5 绘图
  10. 艾司博讯:怎么看拼多多商家发货地址