后端:Redis| 青训营笔记

83 阅读3分钟

Redis是什么

早期是没有Redis的,随着访问量逐渐增加,演进出了分库分表,如下

image.png

因为数据量增长和读写数据压力不断增加,MySQL从单机演进出了集群。速度很慢
引入Redis后:
🔷数据分为冷热两种。
🔷热数据:经常被访问的数据,冷数据则相反
🔷将热数据存储到内存中

image.png

Redis基本使用原理

Redis从内存中进行读写,相应速度很快,并且将数据保存到硬盘上防止重启数据丢失

image.png

单线程处理命令

image.png

如果GET key1先到达, GET key2后到达,则先处理GET key1 命令,后处理 GET key2命令

数据结构

String

🔷可以存储字符串,数字,二进制数据
🔷通常和expire
🔷场景:存储计数,Session

list

使用场景 :消息通知

Quicklist

Quicklist由一个双向链表和listpack实现

Hash数据结构 dict

🔷ehash:rehash操作是将ht[0]中的数据,全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht[0]拷贝到ht[1]速度是较快的。数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。

🔷渐进式rehash:为避免出现这种情况,使用了rehash方案。基本原理就是,每次用户访问时都会迁移少量数据,将整个迁移过程,平摊到所有的访问用户请求过程中。

Redis事务:

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。总的来说就是Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

🔷Redis事务没有隔离级别的概念

批量操作发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。

🔷Redis不保证原子性

Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

Redis为什么不事务回滚:

多数事务失败是由语法错误或者数据结构类型错误导致的,语法错误说明在命令入队前就进行检测的,而类型错误是在执行时检测的,Redis为提升性能而采用这种简单的事务,这是不同于关系型数据库的,特别要注意区分。Redis之所以保持这样简易的事务,完全是为了保证高并发下的核心问题——性能。

数据删除策略的目标:

在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或 内存泄露

针对过期数据要进行删除的时候都有哪些删除策略呢?

🔷定时删除
🔷惰性删除
🔷定期删除

总结:

之前在只是使用了MySQL,这次学习大厂是如何使用Redis,结合具体的业务代码让我对Redis有了更深的理解,让我能够学习更多的知识,受益匪浅。