Redis是什么
早期是没有Redis的,随着访问量逐渐增加,演进出了分库分表,如下
因为数据量增长和读写数据压力不断增加,MySQL从单机演进出了集群。速度很慢
引入Redis后:
🔷数据分为冷热两种。
🔷热数据:经常被访问的数据,冷数据则相反
🔷将热数据存储到内存中
Redis基本使用原理
Redis从内存中进行读写,相应速度很快,并且将数据保存到硬盘上防止重启数据丢失
单线程处理命令
如果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有了更深的理解,让我能够学习更多的知识,受益匪浅。