redis
Posted KyleInJava
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis相关的知识,希望对你有一定的参考价值。
一、什么是redis
redis是nosql数据库的一种,其基于可基于内存亦可持久化的日志型、Key-Value数据库。redis相比于memcached有更丰富的数据类型,并且能够持久化。由于redis是基于内存的数据库,所以其读写性能非常强大。
由于redis是单线程的,所以redis的操作都是原子操作,是线程安全的。
二、redis有哪些用途
1、配合关系型数据库做高速缓存,缓存热点数据减少数据库io操作。
2、服务器集群中做session共享,如单点登录等。
3、当作计数器,记录某操作的次数等。命令:INCRBY
4、当作简单的队列使用,如消息队列等。
5、查询最新列表
6、做排行榜
三、ubuntu上安装和卸载redis
1、离线安装
①redis.io下载安装包redis-4.0.10.tar.gz
②使用winSCP上传到服务器
③解压缩文件得到redis-4.0.10文件夹
④进入redis-4.0.10文件夹,使用make和make install 命令安装redis
2.在线安装
①用wget http://download.redis.io/releases/redis-4.0.10.tar.gz 命令获取redis安装包,然后像离线方式一样去安装。
②用sudo apt-get install redis-server来自动安装redis,不建议这种方式,有可能不是最新的版本。这种方式下redis执行文件在/usr/bin目录下
3.卸载redis
①卸载redis apt-get remove redis
②清除配置 apt-get remove --purge redis
③删除usr/local/bin中的redis相关执行文件(手动下载安装包安装)
④ 删除 /usr/bin 中的redis相关执行文件(自动安装)
⑤删除 /var/log/redis 下的redis日志文件
⑥删除 /var/lib/redis/ 下的文件
⑦删除 /etc/redis/ 下的内容
四、redis的启动、重启与关闭
①启动:
可以先将redis.conf文件复制一份出来修改,然后执行复制出来的配置文件,这样比较保险,以免改错配置文件
修改修改复制出来的redis.conf,将daemonize no 改为yes,否则启动后无法执行命令行
执行命令redis-server redis.conf 来启动redis,使用redis-cli命令进入命令行后输入ping 返回pong则启动成功,
如果要显示中文需用命令 redis-cli --raw,如果是启动特定的端口则是redis-cli -p 6380, redis-cli -h ip -p port
如果要永久设置redis密码,需修改配置文件requirepass
②重启:
再次执行redis-server命令就能重启
③关闭
关闭命令行工具redis-cli shutdown
关闭redis后台Pkill redis-server
kill -9 XXX 来杀死进程关闭redis-server
五、redis配置文件解析 1 -- 绑定主机IP,默认值为127.0.0.1 2 bind 127.0.0.1
3 4 -- 监听端口,默认为6379 5 port 6379 6 7 -- 是否开启保护模式,如果要外网可以访问,则一定要设置为no,并将bind 127.0.0.1 注释掉
8 protected-mode yes 9 10 -- 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 11 -- 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值, 12 -- 默认是511,而Linux的默认参数值是128。 13 tcp-backlog 511 14 15 -- 在客户端空闲N秒后关闭连接,如果为0,表示禁用 16 timeout 0 17 18 -- 单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态, 19 避免服务器一直阻塞,默认300秒 20 tcp-keepalive 300 21 22 -- 是否以后台进程的方式运行redis 23 daemonize yes 24 25 26 supervised no 27 28 29 -- 以后台进程方式运行redis,则需要指定pid 文件 30 pidfile /var/run/redis_6379.pid 31 32 -- 指定日志级别 notice | debug | verbose | warning 33 loglevel notice 34 35 -- 指定日志文件名称,如果没有是空字符串,表示redis输出到标准输出 36 logfile "" 37 38 -- 数据库的数量,默认使用的数据库是0,可以通过SELECT命令选择一个 39 databases 16 40 41 -- 是否总是显示logo 42 always-show-logo yes 43 44 -- 设置redis进行数据库镜像的频率 45 -- 900秒内至少1个key值改变(则进行数据库保存--持久化) 46 save 900 1 47 -- 300秒内至少10个key值改变(则进行数据库保存--持久化) 48 save 300 10 49 -- 60秒内至少10000个key值改变(则进行数据库保存--持久化) 50 save 60 10000 51 52 -- 持久化出现错误后,是否依然进行继续进行工作 53 stop-writes-on-bgsave-error yes 54 55 -- 使用压缩rdb文件,rdb文件压缩使用LZF压缩算法, 56 -- yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间 57 rdbcompression yes 58 59 -- 是否校验rdb文件,更有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。 60 rdbchecksum yes 61 62 -- dbfilenamerdb文件名称 63 dbfilename dump.rdb 64 65 -- dir 数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录 66 dir ./ 67 68 -- 当前redis作为slave时,其master的ip和端口 69 slaveof <masterip> <masterport> 70 71 -- 如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。 72 -- masterauth就是用来配置master的密码,这样可以在连上master后进行认证。 73 masterauth 74 75 -- 当从节点失去连接或者复制正在进行,从节点有2种运行方式: 76 -- yes: 继续响应客户端的请求 77 -- no: 出去INFO和SLAVEOF命令之外的任何请求都会返回一个错误 78 slave-serve-stale-data yes 79 80 -- 从服务器是否只读 81 slave-read-only yes 82 83 84 -- 是否使用socket方式复制数据。 85 -- 目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。 86 -- 有2种方式: 87 -- disk:master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。 88 -- socket: master创建一个新的进程,直接把rdb文件以socket的方式发给slave 89 -- disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。 90 repl-diskless-sync no 91 92 -- 当使用socket复制数据启用的时候,socket复制的延迟时间,如果设置成0表示禁用 93 repl-diskless-sync-delay 5 94 95 96 -- 是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no 97 -- 即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。 98 -- 但是这也可能带来数据的延迟。默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。 99 repl-disable-tcp-nodelay no 100 101 -- 从节点优先级 102 slave-priority 100 103 104 105 106 lazyfree-lazy-eviction no 107 lazyfree-lazy-expire no 108 lazyfree-lazy-server-del no 109 slave-lazy-flush no 110 111 -- 是否以appendonly模式作为持久化方式 112 -- 默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。 113 -- 但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。 114 -- Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。 115 appendonly no 116 117 -- AOF 文件名称 118 appendfilename "appendonly.aof" 119 120 -- aof持久化策略的配置 121 -- no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。 122 -- always表示每次写入都执行fsync,以保证数据同步到磁盘。 123 -- everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。 124 appendfsync everysec 125 126 -- 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间, 127 -- no-appendfsync-on-rewrite字段设置为默认设置为no,如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no, 128 -- 这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入, 129 -- 默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。 130 no-appendfsync-on-rewrite no 131 132 133 -- AOF自动重写配置 134 -- 当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。 135 -- 当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。 136 auto-aof-rewrite-percentage 100 137 138 -- 设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写 139 auto-aof-rewrite-min-size 64mb 140 141 -- 是否redis在启动时可以加载被截断的AOF文件 142 aof-load-truncated yes 143 144 -- 混合 RDB-AOF 持久化格式 145 -- Redis 4.0 新增了 RDB-AOF 混合持久化格式,这是一个可选的功能,在开启了这个功能之后, 146 -- AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容,其中 RDB 格式的内容用于记录已有的数据, 147 -- 而 AOF 格式的内存则用于记录最近发生了变化的数据, 这样 Redis 就可以同时兼有 RDB 持久化和 AOF 持久化的优点 148 -- —— 既能够快速地生成重写文件, 也能够在出现问题时, 快速地载入数据。 149 aof-use-rdb-preamble no 150 151 -- 集群开关,默认是不开启集群模式 152 cluster-enabled yes 153 154 -- 集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息 155 cluster-config-file 156 157 -- 集群节点相互连接的超时时间 158 cluster-node-timeout 10000 159 160 -- 在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。 161 -- 该参数就是用来判>断slave节点与master断线的时间是否过长。判断方法是: 162 -- 比较slave断开连接的时间和(node-timeout *slave-validity-factor) + repl-ping-slave-period 163 -- 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移 164 -- 可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作 165 -- 如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节 166 cluster-slave-validity-factor 10 167 168 -- 当一定比例的键空间没有被覆盖到(就是某一部分的哈希槽没了,有可能是暂时挂了),集群就停止处理任何查询炒作。 169 -- 如果该项设置为no,那么就算请求中只有一部分的键可以被查到,一样可以查询(但是有可能会查不全) 170 cluster-require-full-coverage yes 171 172 -- 主节点需要的最小从节点数,只有达到这个数,主节点失败时,它从节点才会进行迁移 173 cluster-migration-barrier 1 174 175 lua-time-limit 5000 176 177 178 -- 执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒。注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。 179 slowlog-log-slower-than 10000 180 181 -- 当一个新的命令被写进日志的时候,最老的那个记录会被删掉。这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存 182 slowlog-max-len 128 183 184 -- 延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。 185 -- 只记录大于等于下边设置的值的操作。0的话,就是关闭监视。默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置。 186 latency-monitor-threshold 0 187 188 189 notify-keyspace-events "" 190 191 -- 数据量小于等于list-max-ziplist-entries用ziplist,大于list-max-ziplist-entries用list 192 list-max-ziplist-size -2 193 194 195 list-compress-depth 0 196 197 -- 数据量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set 198 set-max-intset-entries 512 199 200 -- 数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset 201 zset-max-ziplist-entries 128 202 203 -- value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset 204 zset-max-ziplist-value 64 205 206 -- value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense) 207 hll-sparse-max-bytes 3000 208 209 -- hash table是一种高效的数据结构,被广泛的用在key-value存储中,Redis的dict其实就是一个典型的hash table实现。 210 -- rehash是在hash table的大小不能满足需求,造成过多hash碰撞后需要进行的扩容hash table的操作,其实通常的做法确实是建立一个额外的hash table, 211 -- 将原来的hash table中的数据在新的数据中进行重新输入,从而生成新的hash表。redis的 rehash包括了lazy rehashing和active rehashing两种方式 212 -- lazy rehashing:在每次对dict进行操作的时候执行一个slot的rehash 213 -- active rehashing:每100ms里面使用1ms时间进行rehash。 214 -- 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。 215 -- 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。 216 activerehashing yes 217 218 -- 参数限制分配的缓冲区的大小,防止内存无节制的分配 219 -- redis server以单进程的方式处理接收到的请求,而redis完成请求有些工作比较慢,比如网络IO和磁盘IO等比较慢的操作。 220 -- redis为了提高处理客户端请求的响应时间,做了很多优化。比如网络io和磁盘io是异步完成、使用后台进程完成bgsave和bgrewriteaof工作,在server端为客户提供读buffer等等。 221 -- client buffer是在server端实现的一个读取缓冲区。redis server在接收到客户端的请求后,把影响结果写入到client buffer中,而不是直接发送给客户端。 222 -- server把结果写入到client buffer中后,继续处理客户端的其他请求。这样异步处理方式使redis server不会因为网络原因阻塞其他请求的处理 223 -- 在客户端与server进行的交互中,每个连接都会与一个buffer关联,此buffer用来队列化亟待被client接受的响应信息. 224 -- 如果client不能及时的消费响应信息,那么buffer将会被不断积压而给server带来内存压力.如果buffer中积压的数据达到阀值,将会导致连接被关闭,buffer被移除." 225 -- 普通客户端 226 client-output-buffer-limit normal 0 0 0 227 -- 从节点作为客户端 228 client-output-buffer-limit slave 256mb 64mb 60 229 -- 发布与订阅的客户端 230 client-output-buffer-limit pubsub 32mb 8mb 60 231 232 -- redis执行任务的频率为1s除以hz 233 -- 默认情况下,“hz”设置为10。当Redis空闲时,提高该值将使用更多的CPU, 234 -- 但同时,当有许多密钥同时到期时,将使Redis响应更灵敏,而超时可以更精确地处理。 235 hz 10 236 237 -- 在AOF重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。 238 -- 这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值 239 aof-rewrite-incremental-fsync yes
六、redis命令
Redis 命令参考
七、java操作redis数据库
1、如果出现拒绝链接的情况,修改配置文件或者查看防火墙
将配置文件 redis.conf 中 bind 127.0.0.1注释掉,将protected-mode yes 改为no
2.简单的操作redis
①导入jar包 redis-2.9.0.jar,commons-pool2-2.4.2.jar
②编写代码
public class TestRedis { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1",6379);//默认端口为6379 jedis.auth("12345");//设置了redis密码,所以连接的时候需要验证密码 System.out.println("链接成功"); System.out.println(jedis.ping()); System.out.println("===="); Set<String> keys = jedis.keys("*"); System.out.println(keys); jedis.close(); } }
结果:
链接成功
PONG
====
[aa, bb, cc, dd, qq, set, set2, myname, 80074567, kyle, sortset, name, age]
③使用连接池来操作redis
public static void main(String[] args) { JedisPoolConfig config = new JedisPoolConfig(); // 连接池的配置对象 config.setMaxTotal(100); // 设置最大连接数 config.setMaxIdle(10); // 设置最大空闲连接数 JedisPool jedisPool = new JedisPool(config,"127.0.0.1"); Jedis jedis=jedisPool.getResource(); // 获取连接 jedis.auth("12345"); // 设置密码 jedis.set("name", "kyle"); // 设置值 String value=jedis.get("name"); // 获取值 System.out.println(value); jedis.close(); }
八、结合spring框架使用
①导包:jedis-2.9.0.jar,commons-pool2-2.4.2.jar,spring-data-redis-1.6.0.RELEASE.jar
②配置redis.properties
#redis服务器ip redis.hostName=127.0.0.1 #端口 redis.port=6379 #密码 redis.password=12345 #客户端超时时间单位是毫秒 redis.timeout=15000 #是否使用连接池 redis.usePool=true #缓存过期时间(秒) redis.expiration=3000 #最大空闲数 redis.maxIdle=6 #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal redis.maxActive=600 #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性 redis.maxTotal=1000 #连接的最小空闲时间 默认1800000毫秒(30分钟) redis.minEvictableIdleTimeMillis=300000 #每次释放连接的最大数目,默认3 redis.numTestsPerEvictionRun=3 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 redis.timeBetweenEvictionRunsMillis=60000 #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 redis.testOnBorrow=true #在空闲时检查有效性, 默认false redis.testWhileIdle=true
③在applicationContext.xml文件中配置redis
<!-- 集成redis --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxTotal}"></property> <property name="maxIdle" value="${redis.maxIdle}"></property> <property name="testOnBorrow" value="${redis.testOnBorrow}"></property> <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"></property> <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"></property> <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"></property> </bean> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy"> <property name="poolConfig" ref="jedisPoolConfig"></property> <property name="hostName" value="${redis.hostName}"></property> <property name="port" value="${redis.port}"></property> <property name="password" value="${redis.password}"></property> <property name="timeout" value="${redis.timeout}"></property> <property name="usePool" value="${redis.usePool}"></property> </bean> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory"></property> <property name="keySerializer" > <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer" > <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" /> </property> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/> </property> <!-- 开启事务 --> <property name="enableTransactionSupport" value="true"></property> </bean>
④编写redisCacheUtil工具类,进行处理(下面是简单版,附件中会有详细版,不保证正确)
package com.myproject.utils; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; @Component public class RedisCacheUtil{ @Autowired private RedisTemplate<String,Object> redisTemplate; public void set(String key,Object value){ ValueOperations<String,Object> operation = redisTemplate.opsForValue(); operation.set(key,value); } public Object get(String key){ ValueOperations<String,Object> operation = redisTemplate.opsForValue(); return operation.get(key); } public void setList(String key,List<Object> dataList){ ListOperations<String, Object> listOperation = redisTemplate.opsForList(); if (null != dataList && dataList.size() > 0) { listOperation.leftPushAll(key, dataList); } } public List<Object> getCacheList(String key){ ListOperations<String,Object> listOperation = redisTemplate.opsForList(); List<Object> resultList = listOperation.range(key, 0, -1); return resultList; } public void setCacheSet(String key,Set<Object> dataSet){ BoundSetOperations<String, Object> setOperation = redisTemplate.boundSetOps(key); Iterator<Object> it = dataSet.iterator(); while (it.hasNext()) { setOperation.add(it.next()); } } public Set<Object> getCacheSet(String key){ BoundSetOperations<String, Object> setOperation = redisTemplate.boundSetOps(key); return setOperation.members(); } public void setCacheMap(String key,Map<String,Object> dataMap){ HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash(); hashOperations.putAll(key, dataMap); } public Map<String, Object> getCacheMap(String key){ HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash(); return hashOperations.entries(key); } }
九、redis的主从复制配置,如果有多个senstinel配置多个senstinel.conf就行
1、redis的主从复制比较简单,只需要修改redis.conf 中 slaveof IP port ,设置为主redis的IP和端口就行。如果是在一台电脑上设置,只需要复制几份redis.conf,并修改对应的端口和pidfile即可。如果主redis设置了密码,则还需要修改从reids的配置文件,设置masterauth 连接密码。但是这样配置实用性不大,当master挂掉之后,slave只能等待master重新启动,不然还是用不了。
2、使用哨兵sentinel来进行监控就能解决上面提出的问题。Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决。哨兵会不停的监控着每个redis,如果有服务器出现问题,还可以向管理员发送消息,同时如果master出现问题, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。当以前的master修复后,会变为slave。
3.配置文件sentinel.conf
#Sentinel实例的端口号 port 26379 #Sentinel 实例的目录 dir /tmp #日志文件 logfile /var/log/redis/redis-server.log #后台执行 daemonize yes #3.2里的参数,是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码 和bind,可以开启。否 则最好关闭,设置为no。 protected-mode no #格式:sentinel <option_name> <master_name> <option_value>;这一行代表sentinel监控的master的名字叫做mymaster,地址为127.0.0.1:6379, #行尾最后的一个2代表什么意思呢?我们知道,网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了, #当sentinel集群式,解决这个问题的方法就变得很简单,只需要多个sentinel互相沟通来确认某个master是否真的死了, #这个2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。 sentinel monitor mymaster 127.0.0.1 6379 1 #sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。 #而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,默认单位是毫秒,默认30秒。 sentinel down-after-milliseconds mymaster 3000 #在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。 #可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。 sentinel parallel-syncs mymaster 1 #failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。默认180秒,即3minutes. sentinel failover-timeout mymaster 180000 #设置连master和slaves验证密码,在监控redis实例时很有用 #sentinel auth-pass mymaster xxxxxxx #发生切换之后执行的一个自定义脚本:如发邮件、vip切换等 #sentinel notification-script <master-name> <script-path> #发生切换之后执行的一个自定义脚本:如发邮件、vip切换等 #sentinel client-reconfig-script T1 /opt/bin/notify.py
十、redis集群配置
1、redis.conf中需要额外修改如下配置 (不需要制定slaveof)
cluster-enabled yes //开启集群 把注释#去掉 cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002 cluster-node-timeout 5000 //请求超时 设置5秒够了
2.安装ruby,由于scr目录下的edis-trib.rb 无法直接执行,所以需要安装ruby。
命令:sudo apt-get install ruby, apt-get install rubygems, gem install redis(用 gem 这个命令来安装 redis接口)
3.启动所有的redis
4.执行命令:redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002,即可自动完成redis集群和主从的配置