## redis 复习

### redis 特点
1. 速度快，因为数据存在内存中，类似于HashMap，HashMap的优势就是查找和操作的时间复杂度都是O(1)
2. 支持丰富数据类型，支持string，list，set，sorted set，hash
3. 支持事务，操作都是原子性，所谓的原子性就是对数据的更改要么全部执行，要么全部不执行
  - Multi-开启一个事务
  - exec-负责触发并执行事务中的所有命令
4. 丰富的特性：可用于缓存，消息，按key设置过期时间，过期后将会自动删除

### redis 提供 6种数据淘汰策略
- voltile-lru：从已设置过期时间的数据集（server.db[i].expires）中挑选最近最少使用的数据淘汰
- volatile-ttl：从已设置过期时间的数据集（server.db[i].expires）中挑选将要过期的数据淘汰
- volatile-random：从已设置过期时间的数据集（server.db[i].expires）中任意选择数据淘汰
- allkeys-lru：从数据集（server.db[i].dict）中挑选最近最少使用的数据淘汰
- allkeys-random：从数据集（server.db[i].dict）中任意选择数据淘汰
- no-enviction（驱逐）：禁止驱逐数据

### Redis是单进程单线程的
redis利用队列技术将并发访问变为串行访问，消除了传统数据库串行控制的开销

### redis的并发竞争问题如何解决
1. 客户端角度，为保证每个客户端间正常有序与Redis进行通信，对连接进行池化，同时对客户端读写Redis操作采用内部锁synchronized。
2. 服务器角度，利用setnx实现锁
   - setnx(lockkey, 1) 如果返回0，则说明占位失败；如果返回1，则说明占位成功
   - expire()命令对lockkey设置超时时间，为的是避免死锁问题。
   - 执行完业务代码后，可以通过delete命令删除key

### redis常见性能问题和解决方案


