美文网首页
Redis 功能入门大全和基于scala实现示例(4) -- 单

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

作者: 小赵营 | 来源:发表于2019-03-31 20:05 被阅读0次
    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服务启动

    命令行窗口弹出漂亮的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)

    相关文章

      网友评论

          本文标题:Redis 功能入门大全和基于scala实现示例(4) -- 单

          本文链接:https://www.haomeiwen.com/subject/xnbrbqtx.html