辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?( 三 )
list
list 是有序列表 , 这个可以玩儿出很多花样 。
比如可以通过 list 存储一些列表型的数据结构 , 类似粉丝列表、文章的评论列表之类的东西 。
比如可以通过 lrange 命令 , 读取某个闭区间内的元素 , 可以基于 list 实现分页查询 , 这个是很棒的一个功能 , 基于 redis 实现简单的高性能分页 , 可以做类似微博那种下拉不断分页的东西 , 性能高 , 就一页一页走 。
0 开始位置 , -1 结束位置 , 结束位置为-1 时 , 表示列表的最后一个位置 , 即查看所有 。lrange mylist 0 -1比如可以搞个简单的消息队列 , 从 list 头怼进去 , 从 list 尾巴那里弄出来 。
lpush mylist 1lpush mylist 2lpush mylist 3 4 5# 1rpop mylistset
set 是无序集合 , 自动去重 。
直接基于 set 将系统里需要去重的数据扔进去 , 自动就给去重了 , 如果你需要对一些数据进行快速的全局去重 , 你当然也可以基于 jvm 内存里的 HashSet 进行去重 , 但是如果你的某个系统部署在多台机器上呢?
得基于 redis 进行全局的 set 去重 。
把两个大 V 的粉丝都放在两个 set 中 , 对两个 set 做交集 。
#-------操作一个 set-------# 添加元素 sadd mySet 1# 查看全部元素 smembers mySet# 判断是否包含某个值 sismember mySet 3# 删除某个/些元素 srem mySet 1 srem mySet 2 4# 查看元素个数 scard mySet# 随机删除一个元素 spop mySet#-------操作多个 set-------# 将一个 set 的元素移动到另外一个 setsmove yourSet mySet 2# 求两 set 的交集 sinter yourSet mySet# 求两 set 的并集 sunion yourSet mySet# 求在 yourSet 中而不在 mySet 中的元素 sdiff yourSet mySetsorted set
sorted set 是排序的 set , 去重但可以排序 , 写进去的时候给一个分数 , 自动根据分数排序 。
zadd board 85 zhangsanzadd board 72 lisi zadd board 96 wangwuzadd board 63 zhaoliu# 获取排名前三的用户(默认是升序 , 所以需要 rev 改为降序) zrevrange board 0 3# 获取某用户的排名 zrank board zhaoliu4、redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?面试官心理分析如果你连这个问题都不知道 , 上来就懵了 , 回答不出来 , 那线上你写代码的时候 , 想当然的认为写进 redis的数据就一定会存在 , 后面导致系统各种 bug , 谁来负责?
常见的有两个问题:
(1)往 redis 写入的数据怎么没了?
可能有同学会遇到 , 在生产环境的 redis 经常会丢掉一些数据 , 写进去了 , 过一会儿可能就没了 。 我的天 , 同学 , 你问这个问题就说明 redis 你就没用对啊 。 redis 是缓存 , 你给当存储了是吧?
啥叫缓存?用内存当缓存 。 内存是无限的吗 , 内存是很宝贵而且是有限的 , 磁盘是廉价而且是大量的 。 可能一台机器就几十个 G 的内存 , 但是可以有几个 T 的硬盘空间 。 redis 主要是基于内存来进行高性能、高并发的读写操作的 。
那既然内存是有限的 , 比如 redis 就只能用 10G , 你要是往里面写了 20G 的数据 , 会咋办?当然会干掉10G 的数据 , 然后就保留 10G 的数据了 。 那干掉哪些数据?保留哪些数据?当然是干掉不常用的数据 , 保留常用的数据了 。
(2)数据明明过期了 , 怎么还占用着内存?
这是由 redis 的过期策略来决定 。
面试题剖析redis 过期策略
redis 过期策略是:定期删除+惰性删除 。
所谓定期删除 , 指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key , 检查其是否过期 , 如果过期就删除 。
假设 redis 里放了 10w 个 key , 都设置了过期时间 , 你每隔几百毫秒 , 就检查 10w 个 key , 那 redis 基本上就死了 , cpu 负载会很高的 , 消耗在你的检查过期 key 上了 。 注意 , 这里可不是每隔 100ms 就遍历所有的设置过期时间的 key , 那样就是一场性能上的灾难 。 实际上 redis 是每隔 100ms 随机抽取一些key 来检查和删除的 。
推荐阅读
- 网友|面试时话都没讲就赶人走?”,杭州小伙想不通:“就因为家里拆迁了
- 北青网综合|杭州小伙想不通:“就因为家里拆迁了,面试话都没讲就赶人走?”
- 爱羽客羽毛球网|今年不会参加任何比赛,辛德胡:生命最重要
- 学艺说|艺考面试穿搭指南,各专业还有这些不同穿法!
- 辛德蕾拉华为遭川普判死日媒爆2大关键深圳也危险了
- 北京日报客户端|太狠了!男子打伤自己谎称面试被打敲诈招聘单位
- 每日桂林|曝光文化宫这家店!老板公然向面试女孩提无耻要求!爆料人:我有完整的记录!
- 辛德蕾拉共享单车如何成了出租车的竞争对手
- 爱上搞笑君|面试官是个美女,面试官问俺,开心笑话:今天去面试
- 爱做事的实习生【麦肯锡实习怎么找】腾讯面试官:请预测一下iPhone 12的全球销量?
