redis面试

redis优化建议:
1.尽量使用短的key:简短的同时,见名知其意思
2.避免使用key*:这个key*是阻塞的,使用scan
3.存在redis前可以对数据压缩
4.设置key有效期:对于临时数据(短信校验码),过了有效期Redis就会自动清除
5.选择回收策略
maxmemory-policy 六种方式 :
volatile-lru:只对设置了过期时间的key进行LRU(默认值)
allkeys-lru : 是从所有key里 删除 不经常使用的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的
noeviction : 永不过期,返回错误
6.使用bit位级操作或者byte字节级操作
7.尽可能使用hashes存储
8.当业务场景不需要持久化时,关闭所有持久化。

 

redis IO多路复用

IO多路复用:
IO多路复用是一种同IO模型,这里的io通常指的就是网络io,多路是指多个网络链接,复用指的复用一个或少量线程。
通常使用select,poll,epoll三个系统函数去实现
以select 函数为例
1.用户线程调用select,将fd_set从用户空间 拷贝到内核空间
2.在内核空间会对fd_set进行遍历一边,检查 是否有就绪的socket的描述符,如果没有将进入休眠等待可读写描述符唤醒,或者超时。返回
3.内核返回select的结果,即就绪的文件描述符数量。
4.用户拿到就绪文件描述符的数量后,再对fd_set进行遍历,找出就绪的文件描述符
5.用户线程对就绪的文件描述符进行读写操作。

Redis底层数据结构

Redis String 数据结构:
String底层数据结构用SDS进行存储的,在C语言中,字符串标准形式是以空字符串\0作为结束符的,但是C语言在获取字符串长度的时候时间复杂是O(n),redis是单线程,这是承受不了的。

SDS数据结构与C语言原始字符串结构相比对了头部信息结构,里面存储了数组长度,数组容量,可以直接获取字串长,时间复杂度O(1)
String 的编码方式有3种,int,embStr,raw,当存储的字符串是数字用int,当存储字符串长度小于44个字符串,使用embstr,大于44使用raw类型。
sds的优势:
1.具有len属性,可以在O(1)的复杂度内获取长度
2.避免了频繁的内存分配,C语言原生追加字符串时,内存会重新分配,而SDS采用的是预分配的方式来减少内存分配,当追加内容,如果剩余空间足够放下,无需分配,不足则重新分配,其还有扩容策略:字符串小于1M每次分配len*2,大于1m只多分配1m空间,比较灵活
3.避免了缓存区溢出,C语言的字符串内存是由编码者自己分配的,内存分配不足会发生缓存溢出,而sds修改函数在修改前会判断内存,进行动态分配。
4.二进制安全:原始C语言字串是通过\0判断是否已经字符串结尾了。如果某些情况下,图片或者视频等二进制文件中存在\0等就会出现问题,而sds是通过len进行判断的。

 

 

Redis List数据结构:底层有linkedList,zipList,qucklist三种存储方式。
1.当列表对象中的元素的长度较小或者数量较少时,采用ziplist来存储。当列表中元素的长度较大或者数量较多的时候,会使用双向链表存储。
2.双向链表便于在两端进行push和pop,复杂多较低,但是内存碎片化严重
3.ziplist存储在一块连续的内存上,所以存储效率很高。但是它不利于修改操作,插入和删除需要频繁的申请和释放内存。当ziplist很长时可能导致大量拷贝。
4.quciklist由ziplist和 linkedlist组成的混合体,它将linkedlist按段分,每一段使用ziplist来紧凑存储。

 

 

Redis set 数据结构:
set底层有两种数据结构一种是intset,一种是hash,
当存入的value为整数且数据量不大时,使用intset进行存储 ,否则使用hash结构存储
intset的数据结构包含三个属性,enconding编码格式,length数组长度,contents数组内容,从小到大排序,不包含重复
intset可以根据value进行升级,这样就可以根据元素的大小选择编码方式,节省内存。缺点是不支持降级

 

 

Redis zset 数据结构:
zset底层有两种数据结构,一种是ziplist在[score,value]键值对数量少于128个,每个元素 长度小于64个字节的时候使用
否则使用跳表和hash.
hash用来存储value到score的映射,这样就可以在o(1)时间内找到score
skiplist每个节点存储的值是[score,value]对

 

 

Redis Hash 数据结构:
hash底层使用了两种数据结构,一种是zip适用于数据量较小,value较小的时候
反之使用dict字典结构,字典结构里面包含了两张hash表

 

Redis为什么是单线程的

https://www.cnblogs.com/tuyang1129/p/12822501.html

posted on 2021-11-18 10:16  云中哥  阅读(61)  评论(0编辑  收藏  举报

导航