redis管道(pipeline)
redis的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java的客户端(jedis)中是可以使用的。
测试发现:
1:使用管道方式,插入1000条数据耗时37毫秒
Pipeline pipelined = jedis.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
pipelined.set("test"+i, "test"+i);
}
pipelined.sync();
System.out.println(System.currentTimeMillis() - start );
2:不使用管道方式,插入1000条数据耗时328毫秒
long
start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
jedis.set("test"+i, "test"+i);
}
System.out.println(System.currentTimeMillis() -start);
redis任务队列
可以使用list的lpush和rpop实现,左进右出。brpop命令也可以弹出最后一个元素,如果集合为空,会等待有新元素,
并弹出
brpop 有两个参数,一个是监听的list 一个是超时时间,如果集合中没有元素会等待,但超过超时时间停止等待
brpop list 0 代表永不超时
任务优先级队列
同时监听三个list
例 brpoplist1 list2 list3 0 优先级是递减的
redis持久化(persistence)
redis支持两种方式的持久化,可以单独使用或者结合起来使用。
第一种:RDB方式 (默认)
第二种:AOF方式
redis持久化之RDB
rdb方式的持久化是通过快照完成的,当符合一定条件时redsi会自动将内存中的所有数据进行快照并存储到硬盘上。
默认存储在redis根目录的dump.rdb文件中。
rdb是redis默认采用的持久化方式,配置信息在配置文件redis.conf中
save 900 1:表示900秒内至少一个键被更改则进行快照。
save 300 10
save 60 10000
手动执行save或者bgsave命令让redis执行快照。
两个命令的区别在于,save是由主进程进行快照操作,会阻塞其它请求。bgsave会通过fork子进程进行快照操作。
redis实现快照的过程:
1.redis使用fork函数复制一份当前进程的副本(子进程)
2.父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
3.当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成
文件修复命令:redis-check-dump
rdb的优缺点
优点:由于存储的有数据快照文件,恢复数据很方便。
缺点:会丢失最后一次快照以后更改的所有数据。
redis持久化之AOF
aof方式的持久化是通过日志文件的方式。默认情况下redis没有开启aof,可以通过参数appendonly参数开启。
appendonly yes
aof文件的保存位置和rdb文件的位置相同,都是dir参数设置的,默认的文件名是appendonly.aof,可以通过
appendfilename参数修改
appendfilename appendonly.aof
aof日志文件重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
手动执行bgrewriteaof进行重写
redis写命令同步的时机
appendfsync always 每次都会执行
appendfsync everysec 默认 每秒执行一次同步操作(推荐)
appendfsync no不主动进行同步,由操作系统来做,30秒一次
文件修复:redis-check-aof
动态切换redis持久方式,从 RDB 切换到 AOF(支持Redis 2.2及以上)
CONFIG SET appendonly yes
CONFIG SET save ""(该命令可选,将save参数置空了,代表不进行RDB方式持久化)
redis优化
精简键名和键值
键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名。
键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/female、right/wrong)
当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能
内部编码优化(了解)
redis为每种数据类型都提供了两种内部编码方式,在不同的情况下redis会自动调整合适的编码方式。
SLOWLOG
slowlog-log-slower-than 它决定要对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的命令进行记录
slowlog-max-len 它决定 slowlog 最多能保存多少条日志
RedisClient -- redis可视化客户端工具
未完待续。。。