加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Redis不是只有5种基本数据类型?

发布时间:2019-11-13 01:15:40 所属栏目:建站 来源:IT知识课堂
导读:口试官: 我看你简历上说在你的项目中行使了 Redis,并行使它做了缓存,你能给我先容一下 Redis 的五种根基数据范例吗? 于是说道:emmm,Redis 中有 string字符串,hash哈希,list列表,set无序荟萃,zset有序荟萃,这五种数据范例。 口试官:除了这五种基
副问题[/!--empirenews.page--]

口试官: 我看你简历上说在你的项目中行使了 Redis,并行使它做了缓存,你能给我先容一下 Redis 的五种根基数据范例吗?

于是说道:emmm,Redis 中有 string字符串,hash哈希,list列表,set无序荟萃,zset有序荟萃,这五种数据范例。

口试官:除了这五种根基数据范例你还相识过其他 Redis 提供的特另外数据范例吗?你说你用 Redis 做了缓存,好比我此刻查询用户用一个原来就不会存在的 ID 去调你接口,这样的 缓存穿透 怎样防御呢?

没步伐了硬着头皮往上怼:emm, 有相识过 bitMap,缓存穿透我没打仗过。

口试官:那你有行使过 bitMap 实现什么成果么?

口试者内心想:完了完了,这场凉了,都怪 FrancisQ ,归去找他算账。

内心已经凉凉:没有。。。

写在前面的话

着实 FrancisQ 只是一个没有介入口试过的小白,在读大三,想来岁暑期演习,以是在进修之余会写一些文章举办分享并自我总结(不为赚钱),假如认为 FrancisQ 写的还不错的话,给我点个赞哦 (#^.^#),着实我只是想早日到 LV4。虽然我尚有分享其他文章好比 SSM框架的道理理会和实现 ,MySQL 等等,假如感乐趣的也可以存眷我。

虽然列位大佬有演习岗亭的可以帮帮我哈,哈哈哈。

多余的话不多说,本日给各人带来的是 Redis 中的四种非凡的数据布局 bitmap,hyperLogLog,bloomFilter,GeoHash 。这四种数据布局着实有点相同于算法层面了,好比 GeoHash 着实就是一个 zset,bitmap 就是 string,只是行使的要领差异导致了更多的成果。

BloomFilter

先容以及场景行使

对 BloomFilter 不认识的话,对下面的图片各人必定很认识吧?别汇报我你只玩过 王者农药 。

Redis不是只有5种根基数据范例?

BloomFilter 中文名就是 布隆过滤器,作为过滤器,有没有感受很像 LOL 中布隆的 E手艺(坚不行摧) ?

布隆过滤器是一个叫 布隆 的人提出来的,它是通过一个 大型位数组和几个差异的hash函数 来实现的,我们可以把布隆过滤器领略为一个 不准确的set 。我们都知道 set 可以去重,行使 set 可以帮我们判定荟萃中是否已经存在某些元素而且可能帮我们实现去重成果。

可是,set 提供准确的去重成果的同时也给我们带来了一个更大的题目——空间耗损。

好比这个时辰我们举办网页爬虫,必要对爬过的 url 举办去重以停止爬到已经爬过的网站,假如我们行使 set 那么也就意味着我们必要将全部爬过的 url 放入荟萃中,假设一个 url 64字节,那么一亿个 url 意味着我们必要占用 6GB,十亿就是 60GB 阁下。

  • 请留意,是内存。

好比这个时辰我们要举办垃圾邮件可能垃圾短信的过滤,我们必要从数十亿个垃圾邮件列表可能垃圾电话列表中举办判定此时的邮件可能短信是否是垃圾的。假如我们此时行使 set 那么占用空间不消我多说了,也是 百GB级别 的。

上面的口试中我提到了 缓存穿透 ,用户存心哀求数据库原来就不存在的(好比ID = -1),这个时辰假如不做处理赏罚那么必定会穿透缓存去查询数据库,一个查询还好,假如几千,几万个同时进来呢?你的数据库顶得住吗?那么此时我们行使 set 举办处理赏罚,占用那么多内存空间,你认为值得吗???可能说,尚有没有更好的要领了?

上面所讲的三个典范场景,网站去重,垃圾邮件过滤,缓存穿透 ,这三个只要行使 BloomFilter 就能美满办理。

你有没有发明,上面三个场景着实对精度要求都不是很高,尤其是垃圾邮件过滤,着实无意收到几个垃圾邮件也无所谓的。像缓存穿透,也正好切合了 BloomFilter 的一个特征 他说有的不必然有,他说没有的必定没有,我说你这个 ID 在数据库不存在那就真的不存在,老子把你过滤了就是这么自信,怎么,你打我???

道理探讨

聊了这么久的观念和应用场景,是不是还对 BloomFilter 怎么能举办去重的照旧一脸懵逼? 下面我们就聊一聊 BloomFilter 的实现道理。起首给各人放一张布局图。

Redis不是只有5种根基数据范例?

个中 F、G、H 是几种 无偏 Hash 函数,底下是一个 大型的位数组,当我们向 BloomFilter 添加数据的时辰,它起首会将我们的数据(key)做屡次hash运算(这里就是FGH),每个hash运算城市获得一个不消的位数组索引下标,此时我们就将算出的几个下标的位置的值改成1就行。假如判定元素是否存在,只要 判定地址的全部索引下标的值都是1 就行了。

着实你也发明白,在 BloomFilter 中会呈现差异key所算出的下标一再了,如上图所示,这就是偏差的来历( 你可以设置初始巨细和错误率来节制偏差 )也是他说有的不必然有,他说没有的必定没有 这一特征的基础缘故起因,由于假如满是0可能存在0那么必定不存在,假如满是1也有也许是此外几个key给放进去的1。

根基行使

由于 BloomFilter 是 Redis 的扩展模块,以是必要特殊下载,你可以行使 Docker 举办拉取。安装步调我不做具体表明,你可以到它的github上进修怎么安装

安装完之后我们就可以舒畅的行使啦。

  • bf.add key element 添加
  • bf.exists key element 判定是否存在
  • bf.madd key element1 element2 ... 批量添加
  • bf.mexists key element1 element2 ... 批量判定

呼吁很简朴,你可以本身去实行。

HyperLogLog

先容以及场景行使

在 Redis 中尚有一个会存在偏差的数据布局 HyperLogLog。

我们起首思索一个场景,当老板让我们计较页面的 UV 我们该怎么办?

假如会见量不大行使 set 举办用户去重完全可以,可是会见量假若有几百万,几万万,那么就会又碰着上面提到的 挥霍空间 的题目。假如我们这个时辰有一个能 举办去重且能举办计数的数据布局就好了。

这个时辰 HyperLogLog 就闪亮登场了!它能提供不准确的去重计数方案(偏差值在 0.81% 阁下),不准确就不准确哇,UV 要你多准确?0.81%我们也能接管。最重要的是 HyperLogLog 只占用 12KB 的内存。

行使要领和场景实践

  • pfadd key element 添加
  • pfcount key 计较
  • pfmerge destkey sourcekey1 sourcekey2 ... 归并

呼吁都是 pf 开头是由于这是一个名叫 Philippe Flajolet 的传授发现的。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读