Redis(四) 管道的使用、持久化数据

Redis(四) 管道的使用、持久化数据

 一、pipeline管道的使用

   1.通俗来说就是批量一次请求、一次批量返回,从而节省开销、提高效率。

   2.使用方式:

      2.1不集成spring,直接利用jedis客户端直接操作。

        调用方法即可,如下:

拿到连接,直接调用pipelined()方法。

 2.2集成spring,利用spring-data-redis下的redisTemplate去操作

     redisTempalate4个方法executePipelined()  参数不一样,查看源码发现,底层实现是通过RedisConnection来进行操作,通过使用方法会发现,Redis底层连接操作数据都是基于String,参数都是字节数组,基于逻辑层编辑或展现,我们需要把它进行数据格式的转化,比如转成实体bean\list等等,字节数组去转、自然需要引入序列化、反序列化,在集成的Redis中同样封装了一个RedisSerializer接口,我们使用即可。

代码如下:

 

public boolean pipelineInsert(final String key){
		try{
			final RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); 
			super.redisTemplate.executePipelined(new RedisCallback<String>() {  
		        @Override  
		        public String doInRedis(RedisConnection conn)  
		                throws DataAccessException {  
		                byte[] listName  = serializer.serialize(key);  
		                for(int i =0; i<10000; i++){
		                	conn.incr(listName);
		    	        }
		            return null;  
		        }
		    }, serializer);
		}catch(Exception e){
			logger.info("使用管道操作出错:{}",e.getMessage());
			return false;
		}
		return true;
	}

测试如下:

    test类中加入即可,注释的方法为普通方式循环1000

 

long startTime = System.nanoTime();
		p.pipelineInsert("pipeline_key");
		//c.incrString("pipeline_key", 1000);
		long endTime = System.nanoTime();
		logger.info("查询redis--pipeline操作的值:{}",c.select("pipeline_key"));
		logger.info("查询redis--pipeline操作耗时:{}",(endTime-startTime)/1000.0);

 

使用管道操作、循环递增10000 耗时

未使用管道操作、循环递增1000 耗时

详见代码的cc-redis-towpackagepipeliningtest

 

 

二、数据持久化

  方式:RDBAOF

  1.RDB方式:(通过快照的方式来完成、默认方式),

 大致原理:

     执行快照时会产生快照文件dump.rdb(可以在redis.conf中的dbfilenamedir下设置)把内存中的数据放进去,且rdb文件是压缩处理过的二进制文件比较小,便于传输;当启动redis时会自动读取数据备份的rdb文件。速率大致为 1万个字符型的key 大小为1g左右的文件载入到内存需要20-30秒。

 大致流程:

     执行快照时,Redisfork一个子进程,子进程进行快照处理吧内存中的数据写到临时的rdb文件中,原有的父进程继续处理客户端请求,当子进程写完之后,用该临时的rdb文件覆盖旧的文件,一次快照完成。


 触发条件:

      1.1 根据配置规则自动进行

          redis的安装文件夹下有一个redi.conf文件,在SNAPSHOTTING板块下


 三个条件,自动满足一个即自动进行快照。

 

      1.2 执行savebgsave命令时

         save会阻塞客户端的请求,直到快照完成,bgsave不会

 

      1.3 执行flushall 命令、或设置了主从复制

    

  2.   AOF方式(全量保存,可将每一条redis命令追加写到磁盘文件中,效率略低)

     默认没有开启,在redis.conf配置文件中修改appendonly 参数为yes即可、同样它也会生成一个默认文件appendonly.aof 可以通过appendfilename 参数值修改。

    2.1 AOF方式会记录每一条命令,所以有些无效的命令也会记录,所以设置aof的重写操作 redis.conf中有默认配置

  

1
2

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

第一行的意思是,目前的AOF文件的大小超过上一次重写时的AOF文件的百分之多少时再次进行重写,如果之前没有重写过,则以启动时AOF文件大小为依据。
第二行的意思是,当AOF文件的大小大于64MB时才进行重写,因为如果AOF文件本来就很小时,有几个无效的命令也是无伤大雅的事情。
这两个配置项通常一起使用

 

2.2同步数据到磁盘

   虽然每次执行更改数据库的内容时,AOF都会记录执行的命令,但是由于操作系统本身的硬盘缓 存的缘故,AOF文件的内容并没有真正地写入硬盘,在默认情况下,操作系统会每隔30s将硬盘缓存中的数据同步到硬盘,但是为了防止系统异常退出而导致丢 数据的情况发生,我们还可以在Redis的配置文件中配置这个同步的频率:

1
2
3

# appendfsync always
appendfsync everysec
# appendfsync no

第一行表示每次AOF写入一个命令都会执行同步操作,这是最安全也是最慢的方式;
第二行表示每秒钟进行一次同步操作,一般来说使用这种方式已经足够;
第三行表示不主动进行同步操作,这是最不安全的方式。

 

  参考:

  http://qifuguang.me/2015/10/13/Redis%E6%8C%81%E4%B9%85%E5%8C%96/


 
 

 

 

猜你喜欢

转载自tablemiao.iteye.com/blog/2266192