Redis 功能入门大全和基于scala实现示例(4) -- 单机模式

《Redis 功能入门大全和基于scala实现示例(4) -- 单机模式》 redis-scala.PNG

概要

  • Redis server 基于5.0.0的stable版本
  • Client基于 Jedis 2.9.0
  • Scala 基于 2.11.X

Redis服务模式介绍

Redis服务模式包括:单机模式(也称单点模式)、主从模式、sentinel模式和集群模式。不同模式对数据操作的主体都是Redis实例,因此模式只是对Redis功能扩展,就像淘宝 APP和PC端,两者核心功能是购物,不同的模式只是为满足不同人群。

不同模式下有哪些差异?为了满足新的功能,又引入那些新的功能? scala语言如何实现模式连接池访问?我们将进行详细的说明。

本文内容:

  • 单机模式理论:如何配置、如何运行操作
  • 单机模式下线程池创建
1. 单机模式

单机模式是只创建redis的一个实例(进程)。Redis每个实例功能都相同,我们已经介绍部分功能,接下来继续补充。

  • 启动单实例模式

    Redis服务包含一系列配置,可以使用默认配置启动。默认配置文件 redis.conf。配置参数分类说明在后续总结。

    进入src目录,运行命令:

    redis-server.sh redis.conf

《Redis 功能入门大全和基于scala实现示例(4) -- 单机模式》 redis服务启动

命令行窗口弹出漂亮的redis服务器图标提示启动完成。Redis提供服务端功能,用户访问使用客户端。Jedis是我们的客户端选择。

Jedis连接Redis支持单个连接或者使用连接池来进行。2种方式差异在资源分配方式,对Redis数据访问通过Jedis对象完成。
连接池优点:创建池之后,不需要每次都生成Jedis对象,减少开销,资源的维护和控制有公共组件完成,用户减少维护量。缺点在于:需要对连接池的参数进行优化配置,否则会引起运维等问题。

开源Jedis软件进行连接池管理,那么使用scala如何现实哪?下面逐步说明:

  • scala创建连接池

    1. 连接池参数配置和创建

    Redis单机模式和主从模式连接池创建方式类似。

    使用构造函数

    public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port,
    ​ int timeout, final String password, final int database)

    trait Pool extends Log{}
    //创建 抽象特质 其它模式使用
    trait MyJedisPool extends Pool {
      def pool: JedisPool
    }
    //创建pool 配置
    class JedisPoolConf(conf: JedisPoolConfig,host: String,port: Int,timeOut: Int,password: String = "",database: Int,clientName: String)
     extends MyJedisPool{
     
      lazy private val pl = init
       def pool: JedisPool = pl
      
      def init: JedisPool = {
       //创建jedis pool
       new JedisPool(conf, host, port, timeOut, password, database/*, clientName, true*/)
      }
     //`获取jedis 连接`
      def connection: Jedis = {
        logInfo(s"connect \${pl.getNumActive}, \${pl.getNumIdle}, ${pl.getNumWaiters}")
        pl.getResource
      }
    }
    
    
    2. 创建连接池单例对象
    object RedisFactory extends LogSupport {
      def newJedisPool(conf: JedisPoolConfig,
                       host: String,
                       port: Int,
                       timeOut: Int,
                       password: String = "",
                       database: Int,
                       clientName: String): MyJedisPool = {
       val ret: JedisPoolConf = new JedisPoolConf(conf, host, port, timeOut, password, database,clientName)
        logWarning("#### RedisFactory create MyJedisPool end")
        ret
      }```
    
    3. 如何使用连接池

    网上出现大量重复创建连接池,导致系统卡死和崩溃的情况。为避免发生类似的问题:连接池一次创建,获取连接即可。本文代码使用方法:Jedis的连接池创建RedisFactory。继承RedisInterface trait后,调用connection获取Redis连接就可以调用api进行操作。

    trait RedisInterface extends LogSupport with RedisAction with RedisPara{
    
      private lazy val jedis = {
       RedisFactory.newJedisPool(masterName, sentinel,conf)
      }
    
      def connection: Jedis = {
       jedis.pool.getResource
       }
    }
    

Enjoyable

历史证明:看完点赞的童鞋,运气都不差。

往期传送门:

Redis 功能入门大全和基于scala的应用实现(1)
Redis 功能入门大全和基于scala的应用实现(2)
Redis 功能入门大全和基于scala实现示例(3)
    原文作者:小赵营
    原文地址: https://www.jianshu.com/p/bcd53334510f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞