概述
脑图下载地址在文末
String字符串
Redis SDS简单动态字符串 点击查看
应用场景
分布式锁
SETNX key value
当key不存在时,将 key 的值设为 value ,返回1。若给定的 key 已经存在,则setnx不做任何动作,返回0。
当setnx返回1时,表示获取锁,做完操作以后del key,表示释放锁,如果setnx返回0表示获取锁失败,整体思路大概就是这样
计数器
SET key 0
INCR key // incr readcount::{帖子id} 每阅读一次
GET key // get readcount::{帖子id} 获取阅读量
分布式全局唯一id
生成一系列唯一的序列号。
设置序列起始值:
SET sequence "10000"
获取一个序列值:
INCR sequence
直接将返回值作为序列使用即可。
获取一批(如100个)序列值:
INCRBY sequence 100
假设返回值为N,那么[N - 99 ~ N]的数值都是可用的序列值。
常见的k-v
存储,可以应对大部分的场景
比如序列化之后的 json 或者其它文本数据。
Hash哈希
底层实现方式
HashTable哈希表
- siphash算法
ZipList压缩列表
- 哈希对象保存的所有键和值得字符串长度小于64字节
- 哈希对象保存的键值对数量小于512
常见问题
解决哈希冲突
- 使用链地址法,将相同的key使用链表连接
负载因子
- 负载因子 = 哈希表已保存节点数量 / 哈希表大小
- 是哈希表的一个重要参数,它反映哈希表的装满程度
Rehash
-
扩容
- 服务器目前没有执行 BGREWRITEAOF 或者 BGSAVE 命令,且哈希表的负载因子大于等于 1
- 服务器目前正在执行 BGSAVE 或者 BGREWRITEAOF 命令, 并且哈希表的负载因子大于等于 5
-
缩容
- 哈希表的负载因子小于 0.1 时, 程序自动开始对哈希表执行收缩操作
在执行 BGREWRITEAOF 或者 BGSAVE 命令 时,Redis 会为当前服务器进程创建一个子进程,所以在子进程存在期间,会提高执行扩容的负载因子,因为这样可以避免在子进程存在期间进行哈希表的扩容操作,从而避免不必要的内存写入操作,最大限度的节约内存,提高效率。
应用场景
- hash 类型十分适合存储对象类数据,相对于在 string 中介绍的把对象转化为 json 字符串存储,hash 的结构可以任意添加或删除‘字段名’,更加高效灵活。
List 列表
底层实现方式
- ZipList压缩列表
应用场景
- 简单的消息队列的功能
- 可以利用range命令,做基于redis的分页功能
- BLPOP/BRPOP 等待有元素弹出,实现阻塞队列
Set 集合
底层实现方式
-
intset
- 结合对象保存的所有元素都是整数值,开辟空间高效
- 集合对象保存的元素数量不超过512个
typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset;
-
hashtable
应用场景
- 好友/关注/粉丝/感兴趣的人集合
- 随机展示
- 黑名单/白名单
Sorted Set 有序集合
底层实现方式
-
ZipList压缩列表
- 有序集合保存的元素数量小于128个
- 有序集合保存的所有元素的长度小于64字节
-
SkipList 跳表
- 效率可比拟于二叉查找树
- 通过“空间来换取时间”的一个算法,通过在每个节点中增加了向前的指针,从而提升查找的效率
应用场景
- 游戏排名、微博热点话题等使用场景
最后
以上就是懦弱台灯为你收集整理的【面试】Redis 基础数据类型以及常见面试问题的全部内容,希望文章能够帮你解决【面试】Redis 基础数据类型以及常见面试问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复