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