为什么redis的操作是原子性的,怎么保证原子性的?

redis的原子性指的是一个操作不可再分,操作要么成功,要么失败。
redis的操作之所以是原子性的,是因为redis是单线程的
redis本身提供的所有api都是原子性的,redis中事务其实是要保证批量操作的原子性
多个命令在并发中也是原子性吗?
不一定,将get喝set改成单命令操作,incr.使用redis事务,或者使用redis+lua==的方式实现

Redis事务

redis事务功能是通过multi、exec、discard、watch四个原语实现的
redis会将一个事务中的所有命令进行序列化,然后按顺序执行
1、redis不支持回滚操作,redis在事务失败时不进行回滚,而是继续执行余下的命令,所以redis的内部可以保持简单快速
2、在同一事务内,如果某条命令出现错误,那么其他命令则不会执行
3、在同一事务内,如果出现命令的运行错误,那么正确的命令会被执行
1)、multi命令用于开启一个事务,它总是返回ok。multi执行之后,客户端可以继续想服务器发送任意多条命令,这些命令不会立即执行,而是被放到一个队列中,当exex命令被调用时,所有队列中的命令才会被执行。
2)、exec执行所有事物块内的命令,返回事物块内所有命令的返回值,按命令执行的先后顺序排列,当操作被打断时,返回空值null
3)、通过调用discard,客户端可以情况事物队列,并放弃执行事物,并且客户端会从事物状态中退出
4)、watch命令可以为redis事物提供check-and-set(CAS)行为,可以监控一个或多个键,一旦其中有一个键被修改,之后的事物就不会执行,监控一直持续到ecex命令。