1:redis是什么?
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
下面是官方的bench-mark数据:
测试完成了50个并发执行100000个请求。 设置和获取的值是一个256字节字符串。 Linux box是运行Linux
2.6,这是X3320 Xeon 2.5 ghz。 文本执行使用loopback接口(127.0.0.1)。 结果:读的速度是110000次/s,写的速度是81000次/s 。
redis数据交互的速度是远远高于普通数据库(mysql),最主要的原因是内存有着极快的随机读写速度。
数据库的增删改查都是与硬盘的随机读写速度有关。
高档的nvme的随机读写速度也就是几百兆每秒,普通的机械硬盘读随机读写仅仅有几十兆,而普通的ddr4内存的随机读写速度达到29-24gb每秒,是硬盘的上百上千倍!
**那么可能有小可爱要问了,既然基于内存的数据库那么好,都用这种数据库不行吗?**
### 1.1:内存的特点:
1:价格昂贵,容量较小:
容量方面:即便是服务器这种内存较大的设备,内存一般也不会超过500g,但是现在服务器硬盘的配置普遍都10t以上了。
价格方面:16g的ddr4内存一般要500块,而800块就可以买到一个西数4t的红盘。
2:断电易失:
内存由于和硬盘设计原理不同,在断电的情况下,数据会丢失,所以单纯用内存存储是不现实的。也因为这一点,我们需要把数据持久化到硬盘。
由于种种原因redis一般不会完全当作数据库用作数据储存,而是基于速度快的特性当作缓存在项目中使用。
2:redis事务和乐观锁:
2.1:事务:
redis可以实现事务,但是redis事务不具有原子性!!!
即便事务中有运行错误,整个事务依然可以运行!
● 开启事务:multi
● 命令列列:直接输入即可
● 执行事务:exec
● 放弃事务:discard
2.1:实现乐观锁:
乐观锁(Optimistic Locking):顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步更新数据的时候再进行加锁。
悲观锁(Pessimistic Lock):正如其名字一样,悲观锁对数据加锁持有一种悲观的态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
● 监视是否发生修改:watch
如果监视的数据发生修改则放弃操作。
3:RDB和AOF持久化:
3.1:RDB:
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
3.1:AOF:
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
4:哨兵机制:
redis服务器一般在大型项目中由集群设立,redis服务器有主从之分,那么问题来了,如果主服务器宕机了,我们怎么办。我们正常思维下会手动把存活的服务器其中一个选为主服务器,但是这样费事费力,redis提供了解决方案。
这里我们可以通过哨兵机制解决:就是通过设立独立的哨兵进程,监测各个服务区的运行情况,当多数哨兵认为主服务器宕机的情况下,通过投票选择新的主服务器
5:缓存穿透,缓存击穿和雪崩:
5.1:缓存穿透:
我们使用Redis大部分情况都是通过Key查询对应的值,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。假如有大量这样的请求,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。
5.2:缓存雪崩:
其实跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。
5.3:缓存击穿:
当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。