@Humbert
2017-12-08T08:08:15.000000Z
字数 1452
阅读 1052
(filmid) : (filmname,date,director )
样式,序列化
后存入数据库, filmid
获取到(filmname,date,director)
这个元组再解析即可。序列化
将一个对象的所有信息转化成字符串的形式来存起来,之后可以通过这个字符串来还原出原来的对象。
实例
事务原子性
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
线程安全.
A和B同时向C转账10万元。如果转账操作不具有原子性,A在向C转账时,读取了C的余额为20万,然后加上转账的10万,计算出此时应该有30万,但还未来及将30万写回C的账户,此时B的转账请求过来了,B发现C的余额为20万,然后将其加10万并写回。然后A的转账操作继续——将30万写回C的余额。这种情况下C的最终余额为30万,而非预期的40万。这样就是线程不安全的。
.
要解决线程安全,可以采用给数据加锁的机制,就是设置一个标志变量,当一个线程开始修改数据的时候就加锁,别的线程此时就不能修改他了。当原来线程结束了修改之后,再把锁解开,此后其他线程又可以修改这个数据了。
.
另一个办法就是像Redis一样采用单线程的方式。这样也就保证了不会出现线程安全的问题,因为一共只有一个线程。但是这样就会导致速度变慢,Redis使用了非阻塞式IO
来提高速度。
非阻塞式IO
使用I/O多路复用的方式来实现。
处理请求的流程可以简化成三步:
* 读取请求
* 处理请求(中间包括I/O等操作)
* 返回结果
I/O多路复用把一个整个请求的流程变成以下几个状态
* 新请求等待读取请求内容 ------------------------状态1
* 请求正在处理中 -------------------------------状态2
* 请求已处理好,等待读取返回结果 ------------------状态3
每当一个新请求到来时,进程(此处是redis-server)就会把放到一个请求池中。
redis-server遍历这个请求池,根据他们的状态来做不同的事情。
*如果是状态1就会读取内容,之后去取相应的数据,这个连接的状态转变成状态2。
*如果是状态2,表明还没准备好,数据还在I/O的路上还没到。数据在I/O的路上的话,Redis/server不需要为他等待,而是继续遍历请求池。
*如果是状态3,则读取拿回来的数据,返回给请求方。
这样就保证了Redis-server不会在I/O的过程中阻塞,便大大提升了效率(一般情况下I/O是最为耗时的操作)
演示异步任务与定时任务.