使用分布式缓存技术,最为关心的就是缓存的数据丢失问题。那么我们在使用redis的时候,它到底提供什么持久化策略来保证我们缓存数据不丢失。
redis提供了两种持久化方式:rdb与aof
rdb是记录一段时间内的操作,一盘的配置是一段时间内操作超过多少次就持久化。
aof可以实现每次操作都持久化。
推介使用aof。
开启aof,打开redis配置文件,找到appendonly 设置为yes
aof有3这种策略
#appendfsync always #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
#appendfsync no #完全依赖os,性能最好,持久化没保证
redis的详细配置推介http://www.cnblogs.com/kreo/p/4423362.html
接下再看看主从配置,以本机测试为主
第一步:在linux安装redis数据库作为主库 IP地址为192.168.127.129:6379
第二步:虚拟机IP地址映射到本机访问
映射之后遍可通过访问本机127.0.0.1:6380进行访问主库
第三步:在本机windows搭建redis数据库,然后进行主从配置
# 主从复制。使用 slaveof 来让一个 redis 实例成为另一个reids 实例的副本。 # 注意这个只需要在 slave 上配置。 # 主库IP、端口配置 slaveof 127.0.0.1 6380
# 如果 master 需要密码认证,就在这里设置#主库验证密码 ps:如果redis搭建在linux由于是受保护的所以主库必须设置验证密码才能进行访问 masterauth redisadmin# 当一个 slave 与 master 失去联系,或者复制正在进行的时候, # slave 可能会有两种表现: # # 1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时, # 或者数据可能是空的在第一次同步的时候 # # 2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时, # slave 都将返回一个 "SYNC with master in progress" 的错误, # slave-serve-stale-data yes # 你可以配置一个 slave 实体是否接受写入操作。 # 通过写入操作来存储一些短暂的数据对于一个 slave 实例来说可能是有用的, # 因为相对从 master 重新同步数而言,据数据写入到 slave 会更容易被删除。 # 但是如果客户端因为一个错误的配置写入,也可能会导致一些问题。 # # 从 redis 2.6 版起,默认 slaves 都是只读的。 # # Note: read only slaves are not designed to be exposed to untrusted clients # on the internet. It's just a protection layer against misuse of the instance. # Still a read only slave exports by default all the administrative commands # such as CONFIG, DEBUG, and so forth. To a limited extent you can improve # security of read only slaves using 'rename-command' to shadow all the # administrative / dangerous commands. # 注意:只读的 slaves 没有被设计成在 internet 上暴露给不受信任的客户端。 # 它仅仅是一个针对误用实例的一个保护层。 slave-read-only yes # Slaves 在一个预定义的时间间隔内发送 ping 命令到 server 。 # 你可以改变这个时间间隔。默认为 10 秒。 # repl-ping-slave-period 10 # The following option sets the replication timeout for: # 设置主从复制过期时间 # # 1) Bulk transfer I/O during SYNC, from the point of view of slave. # 2) Master timeout from the point of view of slaves (data, pings). # 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). # # It is important to make sure that this value is greater than the value # specified for repl-ping-slave-period otherwise a timeout will be detected # every time there is low traffic between the master and the slave. # 这个值一定要比 repl-ping-slave-period 大 # repl-timeout 60 # Disable TCP_NODELAY on the slave socket after SYNC? # # If you select "yes" Redis will use a smaller number of TCP packets and # less bandwidth to send data to slaves. But this can add a delay for # the data to appear on the slave side, up to 40 milliseconds with # Linux kernels using a default configuration. # # If you select "no" the delay for data to appear on the slave side will # be reduced but more bandwidth will be used for replication. # # By default we optimize for low latency, but in very high traffic conditions # or when the master and slaves are many hops away, turning this to "yes" may # be a good idea. repl-disable-tcp-nodelay no # 设置主从复制容量大小。这个 backlog 是一个用来在 slaves 被断开连接时 # 存放 slave 数据的 buffer,所以当一个 slave 想要重新连接,通常不希望全部重新同步, # 只是部分同步就够了,仅仅传递 slave 在断开连接时丢失的这部分数据。 # # The biggest the replication backlog, the longer the time the slave can be # disconnected and later be able to perform a partial resynchronization. # 这个值越大,salve 可以断开连接的时间就越长。 # # The backlog is only allocated once there is at least a slave connected. # repl-backlog-size 500mb # After a master has no longer connected slaves for some time, the backlog # will be freed. The following option configures the amount of seconds that # need to elapse, starting from the time the last slave disconnected, for # the backlog buffer to be freed. # 在某些时候,master 不再连接 slaves,backlog 将被释放。 # # A value of 0 means to never release the backlog. # 如果设置为 0 ,意味着绝不释放 backlog 。 # repl-backlog-ttl 3600 # 当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master, # 这个值越小,就越会被优先选中,但是如果是 0 , 那是意味着这个 slave 不可能被选中。 # # 默认优先级为 100。 slave-priority 100以上从库配置完毕接下来进行测试(操作redis demo上一篇博客已经给出了。下载地址:http://download.youkuaiyun.com/detail/u013294278/9915084)我们先用redis客户端进行连接到两个redis服务,清空所有数据接下来我们往主库写入10000条缓存数据执行一下代码for(int i=0;i<10000;i++){ SharedJedisUtils.set(i+"", "test_"+i, 0); } System.err.println("写入完毕.........................");
这个时候我们reload下主库看下数据缓存情况
reload之后发现主库10000条缓存数据已写入成功,那么我们再看看从库情况如何
reload之后发现从库的数据跟主库的数据一模一样。说明主从配置成功。