青训营X豆包MarsCode 技术训练营第五课 | 豆包MarsCode AI 刷题

29 阅读2分钟

Redis的应用

redis的出现:

起初只是web , server ,还有一个mysql组成,但是随后发现,做一些大量访问,时间过长,后来引入了集群,就是多个数据库分工合作,但是有时快速访问的操作的时候,mysq无法提供支持,后来引入了redis,将经常访问的数据存放到redis里面,然后将不经常用的数据放在数据库里面

redis实现原理:

客户端通过redis-client调用服务进程,然后在执行读写之前,要产生一个日志,追加到AOF文件的末尾,每次重启的时候就会去磁盘上读取AOF文件

每次先去读取RDB文件上的命令与AOF文件做一个对比,要是有没有执行的命令,那么就先执行命令

redis是一个单线程:里面的指令都是顺序执行的

连续签到实现:对key设置有效时间为24小时,要是24小时之内没有修改key那么就会失效

String在redis中的实现:

buf里面存储的就是要存储数据,刚开始会给buf分配一个内存,内存占满的时候就要对数组进行扩容,,前面flags会存储存入数据的类型,alloc里面存放的分配长度,len储存实际使用了多长

List在redis中的实现:

将消息串联成一个链表,然后放入队列中,表头的地方有一个监听器,当节点里面有数据的时候,就会对里面的数据做一个读取

Hash在redis中的实现:

哈希表里面有两个结构:一个是槽位,一个是拉链,要查找的数据会被计算,计算后变成key然后去槽位里面找对应的key,找到以后查看是否有值有的话,就返回值

起初槽位比较少的时候,会有多个数据挂在下面,但是链表长度的增加,就会对槽位进行一个扩容

rehash:将h[0]中的数据拷贝到h[1]中去,数据量较小的情况下就会很快,但是数据量较大的时候就会阻塞用户的请求

渐进式rehash:创建一个hash table,创建结束后不会直接拷贝数据,而是在访问原先的hash table的时候就会顺带做一个数据拷贝

应用:排行榜排序

zset在redis中的实现:

采用跳跃表来实现:多层单向链表复合,从最上面一条链表开始查找左右没有的话,就会向下移动,移动到下一条链表上面去查找,越向上的链表跨度越大