Redis事务的本质:命令的集合。一个事务中的所有命令都会被序列化,在事务执行过程中按顺序执行,一次性、顺序性、排他性。
Redis事务没有隔离级别的概念
命令入队不会执行,而是等待执行指令下达再按顺序执行
Redis单条命令具有原子性,但事务不保证原子性
redis的事务:
开启事务(multi)
命令入队
执行事务(exec)
multi
set k1 v1
get k1
set k2 v2
exec 事务范例
discard 取消事务
乐观锁 认为无论什么时候都不会发生问题,所以不加锁,数据更新前判断一下数据是否异常(mysql用version redis用watch)
监视 watch 监视数据的最新值,事务执行前比对是否发生变化
unwatch解除监视
jedis实例
Jedis jedis=new Jedis("127.0.0.1",6379);
JSONObject jsonObject=new JSONObject();
jsonObject.put("name","wuchao");
jsonObject.put("age", "22");
Transaction multi=jedis.multi();
multi.set("user1",jsonObject.toString());
multi.set("user2",jsonObject.toString());
try {
multi.exec();
} catch (Exception e) {
multi.discard();
} finally {
System.out.println(jedis.get("user1"));
System.out.println(jedis.get("user2"));
jedis.close();
}
redis-config解析
持久化 RDB(redis database)
父进程继续工作,fork出一个子进程生成临时RDB文件,快照写入磁盘成为正式RDB文件,会覆盖掉上一个记录
rdb保存的文件名是dump.rdb,可以在配置文件的dbfilename快照中设置
触发机制:
1.save的规则满足的情况下就会触发(例save 60 5 60秒内修改5次触发)
2.执行flushall会触发
3.退出redis会自动触发
如何恢复dump.rdb中的数据
将RDB文件放在redis的启动目录下就可以了,redis启动的时候会自动检查dump.rdb,恢复其中的数据
优点:适合大规模数据恢复,对数据的完整性要求不高
缺点:需要一定的时间间隔进行操作,如果redis意外宕机,会丢失最后一次修改的数据,
fork子进程会消耗一定的内存
AOF(Appendonly file)
以日志的形式记录每个写操作,只允许追加文件,不许修改文件,redis启动之初会读取该文件(appendonly.aof),从前到后执行其中记录的命令,重新构建数据。
配置文件中默认关闭appendonly持久化,可将appendonly选项改为yes以开启,再重启redis就生效了。如果appendonly.aof文件有错位,则redis无法启动该文件,这时可以运行redis-check-aof修复。
优点:每一次修改后同步,文件完整性有保障
每秒同步一次,可能丢失一秒的数据
从不同步,效率最高
缺点:aof文件所占空间远大于rdb文件,修复速度也比rdb慢
aof运行效率也比rdb慢,所以redis默认使用rdb持久化