一 Redis持久化机制
1.RDB持久化机制(redis默认的机制)
在指定的时间间隔内,将内存中的数据集以快照的形式写到磁盘中.
2.AOF持久化机制
以日志的形式记录服务器所处理的每一个写的操作,在在redis服务器启动之初会读取这个文件重新构建数据库; 以保证启动之后数据库中的数据是完整的
同时使用RDB和AOF
无持久化: 在(redis.conf)配置以后可以禁用(redis)的持久化功能,这样我们就可以将(redis)视为一个功能增强版的(memcache)
8.3AOF机制的优势和劣势:
AOF的优势有哪些?
1)该机制可以带来更高的数据安全性,即数据持久性,Redis中提供了3
RDB模式持久化配置: cd /usr/local/redis 进入redis的目录,vi redis.config进入配置文件 /save 将数据保存到disk服务器上
(RDB快照方式:缺省情况下,Redis会将数据集的快照dump到dump.rdb文件中,我们也可以通过配置文件来修改Redis服务器dump快照的频率在打开redis.conf文件之后,搜索save.可以看到下面信息: save 900 1 :#在900秒之后,如果至少有1个可以发生变化,则sump内存快照.)
AOF日志文件方式:
开启机制:将appendonly no 改为 appendonly yes;如果启动后会用aof方式的配置文件.
AOF同步方式配置:
appendfsync always: 每次有数据修改发生时,都会写入aof文件
appendfsync everysec :每分钟同步一次,该策略为AOF缺省策略.
appendfsync no 从不同步,高效但是数据不会被持久化.
二 Redis集群
1.主从复制集群
实现方式:选择一台redis服务器作为master节点(负责写节点),另外一台或多台服务器作为slave节点(负责读操作),
slave节点上的数据完全由master节点同步过来.
作用:降低单节点redis服务器的读写负载,将读写分离到不同的服务器.提高数据的可用性
配置方式:Master节点不要任何操作;Slave节点上配置文件redis.conf需要修改为:
slaveof <masterip> <masterport>改为 slaveof master的ip master的端口,最好让从服务器配成只读属性 slave-read-only yes
要想实现高可用即故障转移: 需要使用 keepalive; nohup表示关掉窗口,后台也不关闭.
2.数据分片(Sharding)集群
实现方式:由若干台互不相干的redis服务器组成一个集群,互相独立,
由集群的前置节点或者客户端实现将数据分散插入到集群中的各服务器上.
作用:扩大数据存储的容量,降低单台服务器负载.
本次实现方式:服务器端不需要任何配置...可以直接使用Jedis客户端进行实现
原理: jedis在存储数据的时候会计算key的哈希码值,然后%服务器的个数,然后根据余数计算要把数据存储到哪台服务器中
客户端代码: 核心API: ShardedJedisPool分片功能的Jedis连接池
注意关闭防火墙
package jedistest; import java.util.ArrayList; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool; public class ShardClusterTest { public static void main(String[] args) { //poolConfig是连接池的配置参数 GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); //shards是分片集群中所有分片服务器信息列表,JedisShardInfo是分片服务器信息 ArrayList<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); //将集群中的两台shard服务器信息封装到两个JedisShardInfo对象中 JedisShardInfo shard1 = new JedisShardInfo("192.168.2.199", 6379); JedisShardInfo shard2 = new JedisShardInfo("192.168.2.199", 6380); //将分片服务器信息对象添加到分片服务器信息列表shards中 shards.add(shard1); shards.add(shard2); //创建一个带数据分片功能的jedis连接池 ShardedJedisPool shardedJedisPool = new ShardedJedisPool(poolConfig, shards); //从连接池中获取一个(带数据分片功能的)jedis连接 ShardedJedis jedis = shardedJedisPool.getResource(); for(int i=0;i<1000;i++){ jedis.set("string-key-"+i, "1000" + i); } jedis.close(); shardedJedisPool.close(); } }