柚子快报邀请码778899分享:大数据技术之
第四章 解析 Redis 配置文件 redis.conf4.1 Units 单位4.2 INCLUDES 包含4.3 GENERAL 通用4.4 SNAPSHOTTING 快照4.5 SECURITY 安全4.6 LIMITS 限制4.7 APPEND ONLY MODE 追加4.8 常见配置 redis.conf 介绍第五章 Redis 的持久化第六章 Redis 的事务第七章 Redis 的复制(Master/Slave)第八章 Redis 的 Java 客户端 Jedis
第四章 解析 Redis 配置文件 redis.conf
4.1 Units 单位
1、配置大小单位,开头定义了一些基本的度量单位,只支持 bytes(字节),不支持 bit(位数)。2、对大小写不敏感。
4.2 INCLUDES 包含
指定包含其它的配置文件,可以在同一主机上多个 Redis 实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件。include /path/to/local.conf
4.3 GENERAL 通用
daemonizepidfileport
bindtimeoutloglevellogfiledatabases
4.4 SNAPSHOTTING 快照
sava
RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件。默认save 900 1save 300 10save 60 1000015分钟内改了1次,就保存一次快照或5分钟内改了10次,就保存一次快照或1分钟内改了1万次,就保存一次快照注意:实际开发中 30 分钟保存一次快照。如果想禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串参数也可以。sava ""
stop-writes-on-bgsave-error 默认配置是yes,表示在使用bgsave命令备份的时候出现错误则停止外界写入操作,如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制。dbfilenamedir dump.rdb存储的目录,即启动redis时的目录
4.5 SECURITY 安全
具体操作如下:
4.6 LIMITS 限制
maxclients
设置 redis 同时可以与多少个客户端进行连接。默认情况下为 10000 个客户端。当你无法设置进程文件句柄限制时,redis 会设置为当前的文件句柄限制值减去 32,因为 redis 会为自身内部处理逻辑留一些句柄出来。如果达到了此限制,redis 则会拒绝新的连接请求,并且向这些连接请求方发出 “max number of clients reached” 以作回应。maxmemory 设置 redis 可以使用的内存量。一旦到达内存使用上限,redis 将会试图移除内部数据,移除规则可以通过 maxmemory-policy 来指定。如果 redis 无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么 redis 则会针对那些需要申请内存的指令返回错误信息,比如 SET、LPUSH 等。 但是对于无内存申请的指令,仍然会正常响应,比如 GET 等。如果你的 redis 是主 redis(说明你的 redis 有从 redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。maxmemory-policy •(1)volatile-lru:使用 LRU 算法移除 key,只对设置了过期时间的键 •(2)allkeys-lru:使用 LRU 算法移除 key •(3)volatile-random:在过期集合中移除随机的 key,只对设置了过期时间的键 •(4)allkeys-random:移除随机的 key •(5)volatile-ttl:移除那些 TTL 值最小的 key,即那些最近要过期的 key •(6)noeviction:不进行移除。针对写操作,只是返回错误信息,实际开发中不使用这个配置。
4.7 APPEND ONLY MODE 追加
appendonlyappendfilenameappendfsync always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好。 everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内宕机,有数据丢失,实际开发中推荐 no
4.8 常见配置 redis.conf 介绍
参数说明:
redis.conf 配置项说明如下:1. Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程 daemonize no2. 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定 pidfile /var/run/redis.pid3. 指定 Redis 监听端口,默认端口为 6379,作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口,因为 6379 在手机按键上是 MERZ 对应的号码,而 MERZ 取自意大利歌女 Alessia Merz 的名字 port 63794. 绑定的主机地址 bind 127.0.0.15.当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能 timeout 3006. 指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 verbose loglevel verbose7. 日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给 /dev/null logfile stdout8. 设置数据库的数量,默认数据库为 0,可以使用 SELECT
第五章 Redis 的持久化
RBD小结AOF小结
第六章 Redis 的事务
Redis 事务常用命令:
Redis 的事务脑图
第七章 Redis 的复制(Master/Slave)
第八章 Redis 的 Java 客户端 Jedis
测试连通性
package com.atguigu.test;import redis.clients.jedis.Jedis;public class HelloRedis { public static void main(String[] args) { Jedis jedis = new Jedis("192.168.25.102", 6379); String result = jedis.ping(); System.out.println("**********" + result); // Connection }}
五大数据类型 + 1个 key
package com.atguigu.test;import java.util.Set;import redis.clients.jedis.Jedis;public class APIRedis { public static void main(String[] args) { Jedis jedis = new Jedis("192.168.22.167", 6379); Set
事务提交
package com.atguigu.test;import redis.clients.jedis.Jedis;import redis.clients.jedis.Transaction;public class TXRedis { public boolean transMethod() throws InterruptedException { Jedis jedis = new Jedis("192.168.25.102", 6379); int balance;// 可用余额 int debt;// 欠额 int amtToSubtract = 10;// 实刷额度 jedis.watch("balance"); Thread.sleep(8000); // 停止程序一小段时间,外面先修改balance数据后看效果 balance = Integer.parseInt(jedis.get("balance")); if (balance < amtToSubtract) { jedis.unwatch(); System.out.println("The Data has been updated before you commit or balance < amtToSubtract"); return false; } else { System.out.println("***********transaction"); Transaction transaction = jedis.multi(); transaction.decrBy("balance", amtToSubtract); transaction.incrBy("debt", amtToSubtract); transaction.exec(); balance = Integer.parseInt(jedis.get("balance")); debt = Integer.parseInt(jedis.get("debt")); System.out.println("*******" + balance); System.out.println("*******" + debt); return true; } } /** * 伪代码如下: 通俗点讲,watch 命令就是标记一个键,如果标记了一个键: * * 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中重新再尝试一次。 * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减; 足够的话,就启动事务进行更新操作, * 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错, 程序中通常可以捕获这类错误再重新执行一次,直到成功。 * * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { TXRedis test = new TXRedis(); boolean retValue = test.transMethod(); System.out.println("main retValue-------: " + retValue); }}
主从复制
package com.atguigu.test;import redis.clients.jedis.Jedis;public class ReplicationRedis { public static void main(String[] args) { Jedis jedisM = new Jedis("192.168.25.102", 6379); Jedis jedisS = new Jedis("192.168.25.102", 6380); jedisS.slaveof("192.168.25.102", 6379); jedisM.set("k3", "v3"); String result = jedisS.get("k3"); System.out.println("############# result: " + result); }}
JedisPoolUtils.java
package com.atguigu.test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class JedisPoolUtils { private static volatile JedisPool jedisPool = null; private JedisPoolUtils() { } // DCL(double check lock) public static JedisPool getInstance() { if (null == jedisPool) { synchronized (JedisPoolUtils.class) { if (null == jedisPool) { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxActive(100); poolConfig.setMaxIdle(32); poolConfig.setMaxWait(100 * 1000); poolConfig.setTestOnBorrow(true); jedisPool = new JedisPool(poolConfig, "192.168.25.102", 6379); } } } return jedisPool; } public static void close(JedisPool jedisPool, Jedis jedis) { if (null != jedis) { jedisPool.returnResourceObject(jedis); } }}
JedisPoolRedis.java
package com.atguigu.test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;public class JedisPoolRedis { public static void main(String[] args) { JedisPool jedisPool = JedisPoolUtils.getInstance(); Jedis jedis = null; try { jedis = jedisPool.getResource(); jedis.set("k5", "0508good"); } catch (Exception e) { e.printStackTrace(); } finally { JedisPoolUtils.close(jedisPool, jedis); } }}
配置总结
JedisPool 的配置参数大部分是由 JedisPoolConfig 的对应项来赋值的。maxActive:控制一个 pool 可分配多少个 jedis 实例,通过 pool.getResource() 来获取;如果赋值为 -1,则表示不限制;如果 pool 已经分配了 maxActive 个 jedis 实例,则此时 pool 的状态为 exhausted。maxIdle:控制一个 pool 最多有多少个状态为 idle(空闲) 的 jedis 实例。whenExhaustedAction:表示当 pool 中的 jedis 实例都被 allocated 完时,pool 要采取的操作,默认有三种: WHEN_EXHAUSTED_FAIL --> 表示无 jedis 实例时,直接抛出 NoSuchElementException WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到 maxWait 时抛出 JedisConnectionException WHEN_EXHAUSTED_GROW --> 则表示新建一个 jedis 实例,也就说设置的 maxActive 无用maxWait:表示当 borrow 一个 jedis 实例时,最大的等待时间,如果超过等待时间,则直接抛 JedisConnectionException;testOnBorrow:在 borrow 一个 jedis 实例时,是否提前进行 validate 操作;如果为 true,则得到的 jedis 实例均是可用的;testOnReturn:在 return 给 pool 时,是否提前进行 validate 操作;testWhileIdle:如果为 true,表示有一个 idle object evitor 线程对 idle object 进行扫描,如果 validate 失败,此 object 会被从 pool 中 drop 掉;这一项只有在 timeBetweenEvictionRunsMillis 大于0时才有意义;timeBetweenEvictionRunsMillis:表示 idle object evitor 两次扫描之间要 sleep 的毫秒数;numTestsPerEvictionRun:表示 idle object evitor 每次扫描的最多的对象数;minEvictableIdleTimeMillis:表示一个对象至少停留在 idle 状态的最短时间,然后才能被 idle object evitor 扫描并驱逐;这一项只有在 timeBetweenEvictionRunsMillis 大于0时才有意义;softMinEvictableIdleTimeMillis:在 minEvictableIdleTimeMillis 基础上,加入了至少 minIdle 个对象已经在 pool 里面了。如果为 -1,evicted 不会根据 idle time 驱逐任何对象。如果 minEvictableIdleTimeMillis > 0,则此项设置无意义,且只有在 timeBetweenEvictionRunsMillis > 0 时才有意义;lifo:borrowObject 返回对象时,是采用 DEFAULT_LIFO(last in first out,即类似 cache 的最频繁使用队列),如果为 False,则表示 FIFO 队列;=================================================其中 JedisPoolConfig 对一些参数的默认设置如下:testWhileIdle=trueminEvictableIdleTimeMills=60000timeBetweenEvictionRunsMillis=30000numTestsPerEvictionRun=-1
柚子快报邀请码778899分享:大数据技术之
发表评论