2W字!详解20道Redis经典⾯试题!(珍藏版)
⼤家好,我是捡⽥螺的⼩男孩。⾦九银⼗即将到来,整理了20道经典Redis⾯试题,希望对⼤家有帮助。
svg交互动画1. 什么是Redis?它主要⽤来什么的?
Redis,英⽂全称是Remote Dictionary Server(远程字典服务),是⼀个开源的使⽤ANSI C语⾔编写、⽀持⽹络、可基于内存亦可持久化的⽇志型、Key-Value数据库,并提供多种语⾔的API。
与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度⾮常快,每秒可以处理超过10万次读写操作。因此redis被⼴泛应⽤于缓存,另外,Redis也经常⽤来做分布式锁。除此之外,Redis⽀持事务、持久化、LUA 脚本、LRU 驱动事件、多种集⽅案。
2.说说Redis的基本数据结构类型
⼤多数⼩伙伴都知道,Redis有以下这五种基本类型:
String(字符串)
Hash(哈希)前端响应式布局
List(列表)
Set(集合)
zset(有序集合)
它还有三种特殊的数据结构类型
Geospatial
lessismore是什么牌子男装Hyperloglog
Bitmap
2.1 Redis 的五种基本数据类型
String(字符串)
简介:String是Redis最基础的数据结构类型,它是⼆进制安全的,可以存储图⽚或者序列化的对象,值最⼤存储为512M 简单使⽤举例: set key value、get key等
应⽤场景:共享session、分布式锁,计数器、限流。
内部编码有3种,int(8字节长整型)/embstr(⼩于等于39字节字符串)/raw(⼤于39个字节字符串)
C语⾔的字符串是char[]实现的,⽽Redis使⽤SDS(simple dynamic string) 封装,sds源码如下:
struct sdshdr{
unsigned int len; // 标记buf的长度
mysql面试题34道经典unsigned int free; //标记buf中未使⽤的元素个数
char buf[]; // 存放元素的坑
}
SDS 结构图如下:
Redis为什么选择SDS结构,⽽C语⾔原⽣的char[]不⾹吗?
举例其中⼀点,SDS中,O(1)时间复杂度,就可以获取字符串长度;⽽C 字符串,需要遍历整个字符串,时间复杂度为O(n) Hash(哈希)
简介:在Redis中,哈希类型是指v(值)本⾝⼜是⼀个键值对(k-v)结构
简单使⽤举例:hset key field value 、hget key field
内部编码:ziplist(压缩列表) 、hashtable(哈希表)
应⽤场景:缓存⽤户信息等。
注意点:如果开发使⽤hgetall,哈希元素⽐较多的话,可能导致Redis阻塞,可以使⽤hscan。⽽如果只是获取部分field,建议使⽤hmget。
字符串和哈希类型对⽐如下图:
List(列表)
简介:列表(list)类型是⽤来存储多个有序的字符串,⼀个列表最多可以存储2^32-1个元素。
简单实⽤举例:lpush key value [value ...] 、lrange key start end
内部编码:ziplist(压缩列表)、linkedlist(链表)
应⽤场景:消息队列,⽂章列表,
⼀图看懂list类型的插⼊与弹出:
list应⽤场景参考以下:
Set(集合)
简介:集合(set)类型也是⽤来保存多个的字符串元素,但是不允许重复元素
简单使⽤举例:sadd key element [element ...]、smembers key
modify the genes of crops内部编码:intset(整数集合)、hashtable(哈希表)
注意点:smembers和lrange、hgetall都属于⽐较重的命令,如果元素过多存在阻塞Redis的可能性,可以使⽤sscan来完成。
应⽤场景:⽤户标签,⽣成随机数抽奖、社交需求。
有序集合(zset)
简介:已排序的字符串集合,同时元素不能重复
简单格式举例:zadd key score member [score member ...],zrank key member
底层内部编码:ziplist(压缩列表)、skiplist(跳跃表)
应⽤场景:排⾏榜,社交需求(如⽤户点赞)。
2.2 Redis 的三种特殊数据类型
Geo:Redis3.2推出的,地理位置定位,⽤于存储地理位置信息,并对存储的信息进⾏操作。
HyperLogLog:⽤来做基数统计算法的数据结构,如统计⽹站的UV。
Bitmaps :⽤⼀个⽐特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps成作⼀个以⽐特位为单位的数组
3. Redis为什么这么快?
Redis为什么这么快
3.1 基于内存存储实现
s7200pcaccess下载我们都知道内存读写是⽐在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。
3.2 ⾼效的数据结构
我们知道,Mysql索引为了提⾼效率,选择了B+树的数据结构。其实合理的数据结构,就是可以让你的应⽤/程序更快。先看下Redis的数据结构&内部编码图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论