本贴最后更新于 1116 天前,其中的信息可能已经天翻地覆
Redis 支持哪些数据类型
- string
- list
- set
- hash
- zset(sorted set)
list 和 set 数据类型的区别
- list 有序,set 无序
- list 可以有重复元素,set 不能有重复元素
用 Redis 实现分布式锁的关键点
- 加锁用 setnx key thread_id expire 10s,其中:只有 key 不存在时才加锁,实现锁的基本定义,value 中放占用锁的线程 ID,用于解锁时校验,同时设置超时时间,防止代码出问题导致锁一直不释放,一般超时时间要远大于正常程序执行时间;
- 解锁用 lua 脚本,保证解锁操作的原子性,先判断 key 的 value 是不是当前线程 ID,如果不是,则返回,如果是,才解锁;
zset 的底层数据结构
- 当元素少,且 zset 总大小比较小的时候,底层用的是 ziplist,压缩列表,压缩列表占用内存少,但插入和查询元素时只能遍历,复杂度为 O(n),在元素少时比较好;
- 当元素超过一个阈值或大小超过一个阈值时,底层会转成 skiplist,跳表,跳表占用内存比压缩列表多,但插入和查询元素时复杂度为 O(logn),性能更好,且相比于红黑树,跳表实现更简单,这也是 redis 选择跳表的原因之一。
Redis 过期键的清理策略
- Redis 有两种清理策略:惰性清理和定期清理;
- 惰性清理是指在查询元素时先检查元素是否过期,如果过期了,就删除元素并返回不存在;
- 定期清理是指后台定期启动子线程去执行清理过期键的逻辑,并且清理时会采用随机抽取元素,检查是否过期,如果过期,则清理,同时,检查这次抽取的元素过期比例,如果比例大于某个阈值,则继续清理过程,如果小于阈值,则停止清理。
为什么要使用两种清理策略
- 惰性清理对 cpu 友好,对内存不友好,如果只使用惰性清理,可能会浪费内存;
- 定期清理对内存友好,对 cpu 不友好;如果只使用定期清理,可能会导致清理时 redis 反应慢,甚至卡死;
- 两种策略结合,可以在保证清理逻辑不影响业务使用的同时,避免过期键占用过多内存。
-
面试
-
Redis
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。
286
引用
•
248
回帖
•
49
关注
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于