Redis连接池

 

Redis

下载/安装/启动

  • 第一步:下载c语言的编译环境

    yum install gcc-c++

  • 创建一个redis目录 在/usr/local下面

    mkdir /usr/local/redis

  • 在redis的目录下 下载redis的安装包

    如果不能使用wget指令 安装wget

    yum -y install wget

    wget https://download.redis.io/releases/redis-5.0.7.tar.gz

  • 解压安装包 到当前目录下

    tar -zxvf redis-5.0.7.tar.gz

  • 编译 进入到redis目录中 redis-5.0.7

    make

  • 安装 执行命令后,会生成一个bin目录

    make PREFIX=/usr/local/redis install

  • 启动redis

    • 前端启动

      cd bin 进入到bin目录下

      ./redis-server 启动后会展示redis数据库的图 默认的端口号6379

      注意: 退出窗口,redis服务器也就停止了

    • 后端启动

      修改 redis.conf文件

      第一处:放开可以远程访问redis的请求 bind 127.0.0.1 -----> # bind 127.0.0.1

      第二处:放开可以远程访问redis的请求 protected-mode yes -----> protected-mode no

      第三处:允许后端启动 daemonize no ----> daemonize yes

    • 启动redis

      在bin目录下

      ./redis-server redis.conf

    • 查看redis是否启动成功

      ps -ef | grep redis

  • 使用redis客户端 登录进入测试redis数据库是否可用

    进入redis客户端指令

    ./redis-cli

    输入指令 ping 测试是否连接成功 如果成功展示“pong”

    退出redis客户端指令

    ctrl+c

  • 关闭redis服务器

    • 强制关闭

      • 先查询redis的pid值

        ps -ef | grep redis

        redis-server 的pid值

      • 使用指令 kill -9 redis的pid值

        kill -9 xxxx

  • 使用 客户端方式关闭

    ./redis-clif shutdown

     

代码演示

pom.xml文件

 <!--redis的连接jar包-->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.0</version>
            <scope>compile</scope>
        </dependency>

jedis.properties文件

#详细的jedis配置
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能保持idel的对象数
redis.pool.minIdle=10
#当池内没有返回值对象时,最大等等待时间
redis.pool.maxWaitMills=10000
# 当调用borrow Object方法时,是否进行有效检查
redis.pool.testOnBorrow=true
# 当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#空闲连接 检测线程 周期 毫秒数
redis.pool.timeBetweenEvictionRunsMillis=30000
#对于空闲连接 检测线程 每次检测的连接资源的个数 默认值为3
redis.pool.numTestPerEvictionRun=50
#redis服务器的ip
redis.ip=192.168.227.130
#端口号
redis.port=6379
JedisPoolUtil工具类
//这个是redis
public class JedisPoolUtil {
    //准备一个redis连接池对象 空的
    private static JedisPool pool=null;

    static {
        //获取配置文件
        InputStream is = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
        Properties properties = new Properties();
        try {
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }

        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(properties.getProperty("redis.pool.maxTotal")));
        config.setMinIdle(Integer.parseInt(properties.getProperty("redis.pool.maxIdle")));

        //初始化
        pool = new JedisPool(config, properties.getProperty("redis.ip"), Integer.parseInt(properties.getProperty("redis.port")));

    }

        //对外提供获取redis的连接
        public static Jedis getJedis(){
           return pool.getResource();
        }


}

接口层


//登录业务接口
public interface AdminService {

    Admin queryRegister(String username,String password);

    //登录效验查询 走redis json
    ResultObject findAdminByRedis(Admin admin);

}

接口层实现类

@Service
public class AdminServiceImpl implements AdminService {

    @Autowired
    private AdminMapper adminMapper;


    public Admin queryRegister(String username, String password) {

        return adminMapper.queryRegister(username, password);
    }

    //再调用数据库的时候,做一个业务判断
    /**
     * 先查询redis数据库 如果redis数据库存在该信息,则不走mysql数据库
     * 如果redis数据库中没有查询到信息,我们就走mysql数据库,同时会把查询到的信息存进redis中
     */
    @Override
    public ResultObject findAdminByRedis(Admin admin) {
        //先从连接池中获取redis连接对象
        Jedis jedis = JedisPoolUtil.getJedis();
        String redisAdmin = jedis.get("admin");//存储 key值 hash
        /**
         * 一个admin 对应的map值
         */
        Admin mysqlAdmin = null;
        // 一个 admin  对应的map值
        //   field      value
        // login_name  login_pwd
        if (redisAdmin==null) {

            mysqlAdmin = adminMapper.queryRegister(admin);
            //  ObjectMapper objectMapper = new ObjectMapper();
            if (mysqlAdmin != null) {
                ObjectMapper objectMapper = new ObjectMapper();
                try {
                    redisAdmin = objectMapper.writeValueAsString(mysqlAdmin);
                    jedis.set("admin", redisAdmin);
                } catch (JsonProcessingException e) {
                    e.printStackTrace();
                } finally {
                    jedis.close();
                }
                return new ResultObject(200, "helloWorld", mysqlAdmin);

            } else {
                // 201表示没有查到信息 从mysql中也没有查到信息
                return new ResultObject(201, "您的用户名和密码不匹配", null);
            }
        }else {

            System.out.println("从redis中读取到admin信息");
            System.out.println("-------"+redisAdmin);
        }
        // 200表示从redis查到信息
        return new ResultObject(200,"helloQWorld",mysqlAdmin);
    }
}

 

余下内容

  • Redis分布式缓存与本地缓存

  • Redis线程模型IO多路复用

  • SpringBoot整合Redis框架

Redis持久化机制和集群机制

  • Redis持久化原理与一致性原理

  • 使用Redis进行二进制形式存储对象

  • SpringBoot整合Redis注解开发

  • Mysql与Redis的一致性解决方案 大概有三种解决方案

  • 全量同步与增量同步实现的区别

  • RedisRDB持久化原理

  • RedisAOF持久化原理

Redis六大淘汰策略以及事务管理和过期以及key事件监听机制

  • Redi核心六大淘汰策略

  • Redis过期回调监听

  • Redis环境配置对key过期监听

  • Redis中事务策略Multi

  • Redis中的 Watch与Multi的区别

基于Redis实现分布式锁

  • Redis中为什么没有回滚事务

  • 什么是分布式锁 以及应用场景

  • Redis实现分布式锁的原理

  • 基于Redis实现获取锁代码原理

  • 基于Redis实现释放锁代码原理

  • 在使用分布式锁如果超时应该怎么解决

  • zk与Redis实现分布式锁的优缺点

  • 测试基于Redis实现分布式锁的代码实现

RedisCluster集群原理

  • 核心哨兵机制

  • Redis集群主从之分概念

  • Redis主从复制原理实现

  • 传统一主多从复制存在的缺陷?

  • 在Redis中配置一主多从关系

  • 主从复制存在哪些问题?

  • 哨兵集群架构的设计原理

  • master如何确定宕机进行重新选择

  • 配置哨兵集群高可用代码实现

  • Redis缓存穿透概念与解决方案

  • Redis缓存击穿概念与解决方案

  • Redis缓存雪崩概念与解决方案

RedisCluster扩容与搜缩以及Jedis支持集群原理

  • RedisCluster快速实现扩容原理

  • RedisCluster快速实现卡槽扩容实现原理

  • master节点宕机之后重新实现

  • RedisCluster快速实现缩容

  • RedisCluster支持集群原理

 

Nginx

概述

Nginx是一款轻量级的web服务器/反向代理服务器以及电子邮件代理服务器

是一款开源免费的web服务器,配置简单易上手

并在BSD-like协议下发行,

由俄罗斯的一位工程师设计开发的,供俄国大型的入口网站以及搜索引擎使用的

特点是:【占用内存少】、【并发能力强 】

在市场上nginx的并发能力在同类产品中网页服务器中表现较优

Nginx是一款高性能的HTTP和反向代理web服务器

同时也是一个IMAP/POP3/SMTP代理服务器

nginx问世在2014年10月4日 发布nginx的第一个版本0.1.0

它的源代码以BSD许可证的形式发布的

由于它具有高稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名世界。

在俄罗斯的网站上已经使用了很多年

据Netcraft统计,2014年 在世界上最繁忙的网站中有11.4%使用nginx作为其服务器或者代理服务器

目前世界上互联网公司 360、百度、京东、新浪、网易、腾讯、淘宝等都在使用

中国市场上大概有70%的公司都在使用它。

原因就是他占用内存少、并发能力强

nginx是由内核和模块两部分组成

其中 ,内核的设计非常的微小和简洁,完成的工作也非常的简单

仅仅通过配置文件将客户端的请求映射到一个location block(location是nginx中的一个指令,用于url匹配)

而这个location中所配置的每个指令将会启动不同的模块完成相应的工作。

在连接高并发的情况下,nginx是Apache服务器的一款不错的替代品

Nginx既可以在内部直接支持Rails和PHP程序对外提供服务,也可以支持作为Http代理服务器对外提供服务

Nginx采用C语言进行编写,不论是系统资源开销还是cpu使用效率都比同类产品性能要好的多。

作用

nginx一般情况下主要是承担负载均衡作用,充当的是反向代理服务器的角色

Nginx相对于Apache服务器的优点

tomcat apache

  • 高并发响应性能好 官方介绍 支持高达 50000/s个并发连接数的响应(静态文件)

  • 内存和CPU占用率很低, 比apache服务器低(内存 1/5, cpu 1/10)

  • 反向代理服务器性能强(可用于负载均衡) 做后期的性能优化

  • 对后端服务器有较好的健康检查机制 (心跳机制)

  • 配置代码简洁而且易上手

Nginx的工作原理

nginx是由内核 和 模块两部分组成。其中,内核的设计非常的微小和简洁,完成的工作也非常的简单

仅仅通过配置文件将客户端的请求映射到一个location block(location是nginx中的一个指令,用于url匹配)

而这个location中所配置的每个指令将会启动不同的模块完成相应的工作。

核心模块: HTTP模块 Event模块 Mail模块

基础模块: HTTP Access模块 HTTP fastCGL模块 HTTP Proxy模块 HTTP Rewrite模块

第三方模块: HTTP Request Hash模块 Notic模块 HTTP Access Key模块

nginx的高并发优势主要得益于内部采用epoll模型,相对于传统的服务器类型不一样(程序架构不同)

epoll模型是linux内核2.6才出现的,nginx采用epoll模型, 异步非阻塞

apache服务器内部采用的是select模型

  • epoll模型原理:

    epoll模型 对于事件句柄的选择不是遍历所有事件通知而是事件响应的

    也就是 句柄事件上来立马就选择出来,不需要遍历整个事件句柄链表,因此效率极高。

  • select模型原理:

    select选择句柄的时候,是遍历所有的句柄,也就是句柄有事件响应时,

    select需要遍历所有的句柄才能获取到哪些句柄上有事件通知,因此效率较低。

Nginx安装配置

开发步骤:

  • 第一步:需要在 /usr/local 下面创建nginx目录

    mkdir /usr/local/nginx

  • 第二步: 下载 nginx的安装包

    如果没有该命令 执行 yum -y install wget

    wget http://nginx.org/download/nginx-1.13.0.tar.gz

  • 第三步:解压安装包

    tar -zxvf nginx-1.13.0.tar.gz

  • 编译

    进入到nginx-1.13.0目录中

    找到一个名字叫做configure

    执行编译指令

    ./configure ----编译

  • 编译过程中出现的错误 三个错误

    • 第一个错误: C compile cc is not found 错误

      原因是因为:缺少编译环境 安装编译源码所需要的工具和库

      执行命令

      yum install gcc gcc-c++ ncurses-devel perl

    • 第二个错误: the HTTP rewrite module requires th PCRE library

      错误原因:缺少 HTTP rewrite module模块 禁用或者安装所需要的模块即可

      如果选择安装的话:

      执行指令

      yum install pcre pcre-devel

    • 第三个错误: the HTTP gzip module requires the zliblibrary 错误

      错误原因:缺少 HTTP zlib类库 我们也是选择安装该模块

      执行命令:

      yum install zlib gzip zlib-devel

  • 第四步:重新编译

    在nginx-1.13.0目录中

    执行命令

    ./configure

  • 安装nginx

    make & make install

    默认安装到 /usr/local/nginx 下面

  • 启动nginx服务

    • 查看nginx的安装目录

      cd /usr/local/nginx

      conf 配置文件

      html 网站的默认根目录

      logs 日志

      sbin 软件目录

    • 启动nginx

      cd sbin

      执行命令

      ./nginx

    • 查看nginx是否启动成功

      ps -ef | grep nginx

    • 在客户端上查看nginx是否启动成功

      输入nginx对应的虚拟机的ip号即可查看

      nginx默认端口号 80 如果启动成功 查看页面 Welcome to nginx!

  • nginx其他命令

    • 停止nginx服务器

      ./nginx -s quit 退出

      ./nginx -s stop 停止

    • 重载nginx服务器

      ./nginx -s reload ---->热部署

    • 检查nginx配置文件的情况

      ./nginx -t

    • 检查nginx环境

      ./configure

Nginx管理虚拟机

虚拟机概述

虚拟机使用的是特殊的软硬件技术,

它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,

可以具有独立的域名,具有完整的Internet服务器功能(WWW FTP Emai等)

同一台主机上的虚拟机之间是完全独立的

从网站访问者来看,每一套虚拟主机和一台独立的主机是完全一样的。

利用虚拟主机,不用为每个运行的网站提供一台单独的Nginx服务器或单独运行一组nginx进程

虚拟主机提供了在同一台服务器、同一组nginx进程上运行多个网站的功能。

Nginx的基本配置

三种配置机制

  • 基于域名的虚拟机配置

  • 基于端口号的虚拟机配置

  • 基于ip的虚拟机配置

主配置文件

nginx.conf 该文件在/usr/local/nginx/conf

主配置文件的结构

http{
    
    # 配置一个虚拟机 配置服务器
    server{  
        listen 80;                     #端口号;
        server_name  192.168.68.129;   #服务名称/域名名称/ip地址 ;
        
        # 配置默认访问项目首页的地址
        location /{
            root    html;       #根目录
            index   index.html; #默认访问首页    
        }
     }
    
    server{
        listen  #端口号;
        server_name #服务器名称;
        
        location{
            root  view #根目录
            index admin.html #默认访问首页         
        }             
    }  
}

Nginx的负载均衡

 

Nginx的三种配置

Nginx搭建tomcat集群

 

FASTDFS

MYCAT见客

shiro

dubbo

Zookeeper

消息队列RabbitMQ

 

 

 

 

 

 

 

 

 

 

 

 

 


版权声明:本文为weixin_51621893原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。