
Redis
文章平均质量分 80
Redis原理剖析,从底层与实战解析Redis
不要迷恋发哥
永远不要“用战术上的勤奋,掩饰战略上的懒惰”~~~~~~一名爱好古筝的IT宅男
展开
-
Redis高并发防止秒杀超卖实战源码解决方案
1:解决思路将活动写入 redis 中,通过 redis 自减指令扣除库存。2:添加 redis 常量commons/constant/RedisKeyConstant.javaseckill_vouchers("seckill_vouchers:","秒杀券的 key"),3:添加 redis 配置类4:修改业务层废话不多说,直接上源码1:秒杀业务逻辑层@Servicepublic class SeckillService {@Resourcepriv..原创 2021-10-24 22:34:29 · 7749 阅读 · 1 评论 -
Redis面试题拆解与回答技巧
1:Redis有哪些数据结构,底层编码有哪几类?其中有序链表采用了哪些不同的编码?回答技巧①大部分面试者都能够回答出五种类型,我们可以适当扩展一下,将Redis另外的4种高级类型的用法提一下,展示出自己知识的全面性。②对于底层编码可以挑选其中一种讲解其类型的不同点和转换的条件,如果只能指出来在Redis配置文件中能够更改转换条件更好③重点将有序表中的跳跃表编码进行解释1:数据结构从上图我们可以看出,Redis基本的五大数据类型对应的底层数据结构。同时可以发现后面的四种集合类.原创 2021-09-10 15:50:44 · 189 阅读 · 0 评论 -
Redis之HyperLogLog底层原理与使用场景
1:业务场景引入HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计。①需求:要统计一个页面的访问量(PV)①方案:直接用redis计数器或者直接存数据库都可以②需求:要统计一个页面的用户访问量(UV),即:一个用户一天内如果访问多次的话,也只能算一次②方案:可能会想到用SET集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value存储对应userId③需求:假如有几千万访问量,为了统计一个访问量,要频繁创建SET集合对象。原创 2021-09-10 15:03:55 · 7485 阅读 · 0 评论 -
Redis之布隆过滤器原理与缓存穿透
1:业务场景引入1:需求①原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?解决方案1:将10亿个号码存入数据库中,进行数据库查询,准确性有了,但是速度会比较慢。解决办法二:将10亿号码放入内存中,比如Redis缓存中,这里我们算一下占用内存大小:10亿*8字节=8GB,通过内存查询,准确性和速度都有了,但是大约8gb的内存空间,挺浪费内存空间的。2:需求②接触过爬虫的,应该有这么一个需求,需要爬虫的网站千千万万,对于一个新的网站url,原创 2021-09-10 14:46:27 · 338 阅读 · 0 评论 -
Redis之BitMap数据类型分析与应用场景
1:类型引入Redis对数据保存时,通过redisObject对象来存储redisObject属性:type(数据类型)、encoding(编码方式)对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。int:当存储的字符串全是数字时,此时使用int方式来存储;embstr:当存储的字符串长度小于44个字符时,此时使用embstr方式来存储;raw:当存储的字符串长度大于44个字符时,此时使用raw方式来存储;Redis会根据保存的数据类型,原创 2021-08-16 11:35:00 · 1417 阅读 · 0 评论 -
Redis之GeoHash底层原理与实战
1:计算附近的人如上图所示,结合地球的经度与纬度。我们将地图元素的位置数据使用二维的经纬度表示。当两个元素的距离不是很远时,可以直接使用勾股定理就能算得元素之间的距离。我们平时使用的「附近的人」的功能,元素距离都不是很大,勾股定理算距离足矣。1:需求1:如果要计算「附近的人」,也就是给定一个元素的坐标,然后计算这个坐标附近的其它元素,按照距离进行排序,该如何下手?2:如果现在元素的经纬度坐标使用关系数据库 (元素 id, 经度 x, 纬度 y) 存储,你该如何计算?2:分析.原创 2021-08-09 16:04:31 · 580 阅读 · 0 评论 -
Redis之Hash数据结构底层原理
Hash类型有以下两种实现方式:1、ziplist 编码的哈希对象使用压缩列表作为底层实现2、hashtable 编码的哈希对象使用字典作为底层实现1:ziplist 编码作为底层实现ziplist 编码的哈希对象使用压缩列表作为底层实现, 每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾, 然后再将保存了值的压缩列表节点推入到压缩列表表尾。因此保存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后;先添加到哈希对象中的键值原创 2021-08-09 14:23:38 · 2548 阅读 · 0 评论 -
Redis之String数据结构底层原理
1:不同类型的存储对于不同的对象,Redis会使用不同的类型来存储。对于同一种类型type会有不同的存储形式encoding。对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。int:当存储的字符串全是数字时,此时使用int方式来存储;embstr:当存储的字符串长度小于44个字符时,此时使用embstr方式来存储;raw:当存储的字符串长度大于44个字符时,此时使用raw方式来存储;使用object encoding key可以查看key对应原创 2021-08-09 11:35:10 · 2485 阅读 · 1 评论 -
Redis之Set数据结构底层原理
Set对象编码可以是 intset 或者 hashtable1:intsetintset 编码的集合对象使用整数集合作为底层实现, 集合对象包含的所有元素都被保存在整数集合里面。 举个例子, 以下代码将创建一个intset 编码集合对象:inset 编码的numbers集合对象2:hashtable hashtable 编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象, 每个字符串对象包含了一个集合元素, 而字典的值则全部被设置为 NULL。...原创 2021-07-15 10:44:56 · 1488 阅读 · 0 评论 -
Redis之List数据结构底层原理
1:Redis链表实现的特性双端:链表节点带有 prev 和 next 指针,获取某个节点的前置节点和后置节点复杂度都是O(1)。无环:表头节点的 prev 指针和表尾节点的 next 指针都指向 NULL,对链表的访问以NULL为终点。带表头指针和表尾指针:通过list结构的 head 和 tail 指针,程序获取链表的表头节点和表尾结点的复杂度都是O(1)。带链表长度计数器:程序使用 list 结构的 len属性对 list持有的链表节点进行计数,程序获取链表中节点数量的复杂度为O(1)原创 2021-07-19 16:26:41 · 956 阅读 · 0 评论 -
Redis之ZSet数据结构底层原理
zset为有序自动去重的集合数据类型,其编码可以是 zipList或者 skipList1:ziplistziplist 编码的有序集合对象使用压缩列表作为底层实现, 每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member),而第二个元素则保存元素的分值(score)。 压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向, 而分值较大的元素则被放置在靠近表尾的方向。如果我们执行以下 ZADD 命令, 那么服务器将创建一个有序.原创 2021-07-14 16:01:50 · 2043 阅读 · 0 评论