(15)事务
1.事务特性
ACID
原子性:强调事务的不可分割,要么全部成功,要么全部失败
一致性:事务的执行的前后,数据的完整性保持一致
持久性:一旦事务提交了或者回滚了.都要将这些操作持久化到数据库中.
隔离性:一个事务的执行不要受其他事务影响.
(16)mysql索引:hash,Btree
(18)读写分离:程序里面如何实现读写分离?
(19)Redis
spring-data-redis把jedis融入到spring中,无缝整合到spring中,对jedis中的方法(jedisCluster.命令)进行了增强,通过spring-data-redis访问redis服务器,底层还是jedis。
1)redisTemplate:所有的redis对象都封装在redisTemplate模版中了,模版提供了各种操作,异常处理以及序列化,支持发布订阅。
2)spring-data-redis针对jedis提供了如下功能:
1.连接池自动管理,提供了一个高度封装的RedisTemplate类
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据进行操作
ListOperations:针对list类型的数据进行操作
boundValueOps、boundHashOps(“index_cache”).delete(“1”);
1)数据类型
2)常用命令:set,get,del,incr(递增),decr(递减)
3)单线程?多线程?
4)setNX命令:set if Not exists
setNX可以用来实现分布式锁
setNX key value,将key的值设为value,当且仅当key不存在
5)redis持久化方式
redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式;二是Append-only file(缩写aof)的方式;三是虚拟内存方式;四是diskstore方式。
6)redis事务
Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC命令表示事务命令结束。MULTI和EXEC中的命令是一起执行的,并不能将其中一条命令的执行结果作为另一条命令的执行参数,所以这个时候就需要引进Redis事务家族中的另一成员:WATCH命令。
7)redis并发问题:
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:
1.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
2.服务器角度,利用setnx实现锁。
对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。
(20)负载策略:
1.加权轮询:
第一,如果可以把加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器。
第二,当所有后端机器都down掉时,nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态,从而导致整个前端被夯住。
2.ip hash策略: hash值既与ip有关又与后端机器的数量有关。经测试,上述算法可以连续产生1045个互异的value,这是此算法硬限制。nginx使用了保护机制,当经过20次hash仍然找不到可用的机器时,算法退化成轮询。
3.fair
fair策略是扩展策略,默认不被编译进nginx内核。它根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。
这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此须慎用。
4.通用hash、一致性hash
通用hash和一致性hash也是种扩展策略。通用hash可以以nginx内置的变量为key进行hash,一致性hash采用了nginx内置的一致性hash环,可支持memcache。