这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天,今天主要学习了redis基本工作原理。然后学习redis在实践案例中实用操作和特性,与这些操作特性对应的基本数据结构实现。
why
数据过大,分库分表
MySQL从单机演进成了集群
因为MySQL是要访问磁盘的。所以数据分冷热,将热数据放在Redis,存储到内存中。
Redis基本工作原理:
- RESP协议->读写内存(追加日志到AOF文件,放在磁盘中)
- RDB文件(二进制文件)存储全部数据,先读加载RDB,再看AOF中哪些未执行,从而保证状态。保证了持久化。
- 单线程处理所有操作命令,(排队处理,一定是顺序执行,分先后)
应用案例
连续签到
数据结构(关注为什么这么设置,会不会节省效率(读写),节省空间)
Key,value,expireAt()
用到了Redis的能力:
- 在原有的数据上加一,
- 在指定过期时间,过期为0.(?:如何做到)
String
- len alloc flags buf
- sds指针(向左找len,向右找buf)
- buf不够扩容,操作耗时
消息通知
ES引擎,索引
用消息通知,通知ES有一个新文章/消息
消息队列(list)/ pub
list:Redis的消息队列是如何实现的,各种各样的队列。
List数据结构:
redis:QuickList 由一个双向链表,和listpack实现。
链表节点:next,pre,listpack(data)
一个节点存多个数据,开辟一个大的内存空间,
内存空间里:32位tot-byte一共多大,16位num-element几个元素(元素等长),元素1,元素2····endbyte
计数
一个用户有多项计数需求,可通过hash实现。
数据表的有意义的统计值,直接存在redis中,同步更新
取:get keyword 得hash,再从hash key-value
写:多条类似数据,通过pipline,初始化一个pipline,然后把多条数据set到里面,(pipline里面包含三条命令),然后一次性发送到redis,减少网络传输。
多条取:hget
对某个hash某个值,也可以使用增加(HIncBy)等便解redis操作进行修改。
hash数据结构dict
槽位,单向列表拉链。计算key,然后去找槽位,然后在槽位里找(多个key存到一个槽位里面,会形成一个单项列表:拉链),当拉链很长,查找效率低,就要槽位扩容,然后拷贝。
rehash:redis在扩容hash时,保证自身可用性(分h0,h1,先扩容至h1,然后copy,在这过程中h0),将rehash过程分摊到每一个用户访问中。
直播课44:30s