1.redis支持事务吗?
只是部分支持事务
常用的命令有:
WATCH key(keys) 监视一个或多个key,如果在事务执行之前这个或这些key被其他命令所改动,那么事务将被打断
MULTI 标记一个事务块的开始
EXEC 执行所有事务块内的命令
DISCARD 取消事务,放弃执行事务块内的所有命令
UNWATCH 取消WATCH 命令对所有 key 的监控
1:正常执行 MULTI … EXEC
2:放弃事务 DISCARD
3:全体连坐 要么全部成功,要么全部失败,命令错误
4:冤头债主 命令正确,但执行失败报错
5:watch监控:
悲观锁/乐观锁/CAS(check and set)
悲观锁:锁整张表,性能极差,但一致性很高
乐观锁:为了即保证高并发,又保证不说整张表,在每条记录后面加一个version版本号
无加塞篡改,先监控在开启MULTI,保证两笔金额变动在同一个事务内
有加塞篡改,横刀夺爱,先watch key 修改value 别人改了 那么失败了。 如果我知道别人改了,我先unwatch 在watch 在multi 然后修改 在exec提交执行
三个阶段:
1. 开启:以MULTI开始一个事务
2. 入队:将多个命令入队到事务中,找到这些命令并不会立即执行,而是放到等待执行事务队列里面
3. 执行:由EXEC命令触发事务
三个特性:单独的隔离操作:事务的所有命令都会序列化、按顺序地实行
没有隔离级别的概念:事务提交前任何指令都不会被实际执行
不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,不回滚
2.如何实现一个栈?
static class mystack
{
int mytop;
int stack[];
public mystack(int num) {
mytop=-1;
stack=new int[num];
}
/*出栈*/
void mypop()
{
mytop--;
}
/*入栈*/
void mypush(int x)
{
mytop++;
stack[mytop]=x;
}
/*判空*/
Boolean myisempty()
{
if(mytop==-1)
return true;
else
return false;
}
/*取栈顶元素*/
int mypeek()
{
int peek=stack[mytop];
return peek;
}
/*栈大小*/
int mysize()
{
return mytop+1;
}
}
public static void main(String[] args) {
mystack myStack=new mystack(20);
myStack.mypush(1);
myStack.mypush(2);
myStack.mypush(3);
myStack.mypush(4);
System.out.print("栈大小为"+myStack.mysize());
System.out.println();
for(int i=myStack.mytop;i>=0;i--)
{
int get=myStack.mypeek();
myStack.mypop();
System.out.println(get);
}
}
好多问题记不得了,记起来就继续写