Redis学习2

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可视化客户端工具


未完待续。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章