概要
- 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提供服务端功能,用户访问使用客户端。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
历史证明:看完点赞的童鞋,运气都不差。
往期传送门:
网友评论