专栏首页Java艺术一道很有意思的Redis面试题,我选出了一些优质评论

一道很有意思的Redis面试题,我选出了一些优质评论

起源于我在一个短视频中分享的一道面试题,当然,这道面试题我确实在工作中用过,只是业务场景不同。

题目是:假设有这样一个需求场景,需要将所有用户的商品id存储到redis缓存,某个接口要求判断请求的商品id是否在数据库中,也就是是否在redis缓存中,请问你觉得使用哪种数据结构类型缓存商品id最合适?

这道题考察面试者:

  • redis数据结构类型的了解,能够根据业务场景使用合适的类型
  • bitmap算法,也是考察算法
  • 遇到id值很大,即超过int类型的最大值时,如何应对,即思维能力

1

某位朋友提问:

请教个问题,网上说bitmap常用来进行用户活跃度,签到的统计。它的bit位也只能存储01,为什么用bitmap能提升性能呢?

我的回答:

Set集合查询时间复杂度是O(1),但是有Hash冲突,可能带有链表的遍历,而bitmap访问相当于数组下标。

bitmap只用1bit存一个商品id,在商品id分布均匀情况下,节省的内存是存储商品id字符串的多少倍?需求场景是只需判断一个商品id是否在缓存中,那么01还不够吗?setbit key 商品id 0/1

追问:

我懂了,命令SETBIT key offset value,这里是将id作为offset使用,不同的id对应不同的位,而不是作为key使用,多谢解答[赞]。

另一位朋友作出的解答很好:

你确定bitmap一定可以?我要是没记错key范围是int,很多id都是long

我的解释:

确实[赞]。这时候就是下一个问题了。

key不是只能有一个,可以用多个key存储,这就是分桶的概念。假设第一个桶,也就是key1,用来1100000000id,那么第二个桶就可以存100000000200000000亿的id,不过是先将id减去100000000。有没有必要分桶,主要还是看商品数量到一个什么级别,以及商品id的最大值。

2

某位朋友提问:

我们项目里用户iduuid生成的14位数值,本来想存bitmap,想想还不如sql统计登陆的日志呢[泪奔]

我的回答:

非整数类型用不了这种数据类型存储,可以借用布隆过滤器插件实现,但是有误差存在,需要确保误差不会影响正常业务。

一般都是使用自增主键。id作为主键索引,使用自增主键比用uuid的插入性能高,这是索引B+树的知识点。

追问:

如果是分布式数据库用自增主键可能会有冲突吧?

我的回答:

分布式数据库可以用雪花算法等分布式 id生成算法,id可以不是自增,但最好是保持增长的,单个数据库节点的单个表的主键确保是增长的。uuid这种太随机。

提问者的自我回答:

对,因为插入时候b+数是按顺序向右扩展的。

想要理解原理,我这里推荐几篇好文,我自己也收藏了,感觉写得很好:

本文分享自微信公众号 - Java艺术(javaskill),作者:wujiuye

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mysql二阶段锁与死锁、连接池与临时表 & Redis为何缓存大批量错误数据

    这期要分享的内容,是上周我在项目中遇到的问题。我选了三个我认为比较重要的分享给大家。

    Java艺术
  • 如何优化大表分页查询的Limit性能问题?

    完成需求,不只在于速度,更要考虑质量。在规定的时间内完成需求的情况下,如果还有时间,应当想一下还能怎么优化,从性能、代码可读性、可扩展性层面考虑。进步就是这样一...

    Java艺术
  • Dubbo源码,详解dubbo协议数据包及解包过程

    RPC协议即远程进程调用协议,自己的话理解就是,让两个进程之间的调用像同进程内调用一个函数那么简单。Dubbo框架的传输层默认使用dubbo协议,这也是一种RP...

    Java艺术
  • Bypass 360主机卫士SQL注入防御(多姿势)

    在服务器客户端领域,曾经出现过一款360主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。从半年前的测试虚拟机里面,翻出了36...

    Bypass
  • 约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: PRIMARY KEY (PK) 标识该字段为该表的...

    用户1214487
  • 「数据库」sql刷题(No.6)

    Hello 各位 ,我是公号「八点半技术站」的创作者 - Bruce.D (姓氏:豆)。

    八点半的Bruce、D
  • pt-osc在线重建表导致死锁的分析及对应的优化方案

    在业务低峰通过pt-osc在线做DDL期间出现死锁,导致业务的SQL被回滚了,对应用不友好。 本案例死锁发生的场景:pt-osc拷贝最后一个chunk-siz...

    老叶茶馆
  • 浅谈python中的多线程和多进程(二)

    前文《浅谈python中的多线程和多进程》中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高运算量的任务,从中看出二者的一些区别。其中一点...

    一只羊
  • Mybatis系列第7篇:各种查询详解

    Mybatis系列目标:从入门开始开始掌握一个高级开发所需要的Mybatis技能。

    路人甲Java
  • python中查看变量内存地址的方法

    本文实例讲述了python中查看变量内存地址的方法。分享给大家供大家参考。具体实现方法如下:

    py3study

扫码关注云+社区

领取腾讯云代金券