Redis(四) 管道的使用、持久化数据
一、pipeline管道的使用
1.通俗来说就是批量一次请求、一次批量返回,从而节省开销、提高效率。
2.使用方式:
2.1不集成spring,直接利用jedis客户端直接操作。
拿到连接,直接调用pipelined()方法。
2.2集成spring,利用spring-data-redis下的redisTemplate去操作
redisTempalate有4个方法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);
未使用管道操作、循环递增1000次 耗时
详见代码的cc-redis-tow下package为pipelining和test类
二、数据持久化
方式:RDB、AOF
1.RDB方式:(通过快照的方式来完成、默认方式),
大致原理:
执行快照时会产生快照文件dump.rdb(可以在redis.conf中的dbfilename、dir下设置)把内存中的数据放进去,且rdb文件是压缩处理过的二进制文件比较小,便于传输;当启动redis时会自动读取数据备份的rdb文件。速率大致为 1万个字符型的key 大小为1g左右的文件载入到内存需要20-30秒。
大致流程:
执行快照时,Redis会fork一个子进程,子进程进行快照处理吧内存中的数据写到临时的rdb文件中,原有的父进程继续处理客户端请求,当子进程写完之后,用该临时的rdb文件覆盖旧的文件,一次快照完成。
触发条件:
1.1 根据配置规则自动进行
在redis的安装文件夹下有一个redi.conf文件,在SNAPSHOTTING板块下
三个条件,自动满足一个即自动进行快照。
1.2 执行save、bgsave命令时
save会阻塞客户端的请求,直到快照完成,bgsave不会
1.3 执行flushall 命令、或设置了主从复制
2. AOF方式(全量保存,可将每一条redis命令追加写到磁盘文件中,效率略低)
默认没有开启,在redis.conf配置文件中修改appendonly 参数为yes即可、同样它也会生成一个默认文件appendonly.aof 可以通过appendfilename 参数值修改。
2.1 AOF方式会记录每一条命令,所以有些无效的命令也会记录,所以设置aof的重写操作 redis.conf中有默认配置
1 |
auto-aof-rewrite-percentage 100 |
第一行的意思是,目前的AOF文件的大小超过上一次重写时的AOF文件的百分之多少时再次进行重写,如果之前没有重写过,则以启动时AOF文件大小为依据。
第二行的意思是,当AOF文件的大小大于64MB时才进行重写,因为如果AOF文件本来就很小时,有几个无效的命令也是无伤大雅的事情。
这两个配置项通常一起使用
2.2同步数据到磁盘
虽然每次执行更改数据库的内容时,AOF都会记录执行的命令,但是由于操作系统本身的硬盘缓 存的缘故,AOF文件的内容并没有真正地写入硬盘,在默认情况下,操作系统会每隔30s将硬盘缓存中的数据同步到硬盘,但是为了防止系统异常退出而导致丢 数据的情况发生,我们还可以在Redis的配置文件中配置这个同步的频率:
1 |
# appendfsync always |
第一行表示每次AOF写入一个命令都会执行同步操作,这是最安全也是最慢的方式;
第二行表示每秒钟进行一次同步操作,一般来说使用这种方式已经足够;
第三行表示不主动进行同步操作,这是最不安全的方式。
参考:
http://qifuguang.me/2015/10/13/Redis%E6%8C%81%E4%B9%85%E5%8C%96/