一、数据库
关系型数据库:采用关系模型来保存数据。
非关系型数据库:使用键值对存储数据。其他
数据库事务特性:
- 原子性
- 一致性
- 隔离性
- 持久性
乐观锁:觉得不会冲突,不上锁,加个标记,如果标记改了就重新取。
悲观锁:使用即上锁,效率低。
共享锁:读锁,取得锁的可以读不可以写。
排他锁:拿到锁的才可以读写。
二、redis
redis是内存数据库,kv存储,单进程单线程,将并发请求串行执行。
数据类型:String、List、Set、Sorted Set、hashes
分布式锁:setnx,getnx
redis事务,一堆命令串行执行,中间有失败的仍会执行完。没有回滚,需要自己写。
实现队列:lpush,rpop实现。队列阻塞是消费者跟不上生产速度。需要解决问题,加机器,服务降级,使用异步任务等。发布,订阅
实现计数器:有set和sortset。
持久化:快照持久化。AOF,日志文件持久化,每次操作都有记录。append成功才修改数据。
淘汰策略:
- noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
- allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
- volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
- allkeys-random: 回收随机的键使得新添加的数据有空间存放。
- volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
- volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
redis集群:
集群节点间通过pingpong机制。gossip协议通信,洪泛,向跟自己连着的节点确认。
不支持多数据库,只有0。
redis-cluster把所有物理节点映射在hash槽上,有16384个。保存kv时先把key用crc16算法算出结果再对16384取余,从而决定把数据放哪个节点。每个节点分布不同个的hash槽。
投票,master节点参与,半数以上通信超时,认为该mater节点挂掉。master有slave的话就晋升,没有的话就fail。半数master挂掉也fail。
故障转移:挂掉一个master,晋升从节点。
使用主从复制模型,每个节点有N-1个复制品。异步复制。
内存优化:尽可能使用散列表。
一致性哈希和哈希槽
一致性哈希的缓存会放在哈希环顺时针的下一台机器上,所以如果扩容,会影响到逆时针下一台机器之间的缓存数据。因为这段数据应该重定向到扩容机器上。
哈希槽直接均匀分布槽,数据跟着槽走,所以不会失效。