redis应用
- 五种数据结构:string/list/set/hash/zset
- string是动态字符串,可以通过append追加。类似于java中的arraylist,采用的是预分配冗余空间来减少内存空间的频繁分配,当字符串小于1M时,扩容都是加倍现有空间,当大于1M时,扩容是增加1M空间,redis字符串最大是512M。
- list相当与java中的linkedlist(其实不是,ziplist和quicklist),删除和插入非常快,定位索引慢
- hash,相当于java中的hashmap,但是不同的是,值只能是字符串,而且rehash的方式不同,采用的渐进式的rehash。
- zset。底层采用跳跃列表支持随机的插入和删除
- 以下几点:
-
list/set/hash/zset如果容器不存在就创建一个进行操作
-
list/set/hash/zset如果容器中元素没有了,立即删除元素,释放内存
-
设置了过期时间,又调用set方法修改他,那么过期时间失效。
-
分布式锁。使用setnx抢占锁,使用del删除锁
-
但是如果在del之前setnx抢占成功之后程序处理失败了,会导致锁永远释放不掉,这是后就会考虑给锁加一个失效时间;但是在加锁之后立刻程序挂掉了,没有执行失效时间,那么这个锁也永远释放不了,所以在redis2.8之前,redis社区为了解决这个想到了很多办法,2.8之后,在set方法上可以同时添加一个过期时间。
-
同时获得锁并设置了过期时间,但是在过期时间失效之前,还没处理完,就会有下一个锁进来,就会处理异常,这种情况之后再考虑。
-
可重入锁,指线程在持有锁的情况下,支持同一个线程的多次加锁。
- 事务
- 把一批操作加入到队列中,执行exec方法时,全部执行,其实相当于跟其他操作隔离开,不被其他