redis高级

  • 一、GEO查询附近的人
  • 二、基数统计算法-HyperLogLog
  • 三、布隆过滤器
  • 四、缓存雪崩&缓存穿透
    • (一)缓存雪崩
    • (二)缓存穿透
    • (三)缓存击穿

一、GEO查询附近的人

引入

  • 我们所处的任何位置都可以用经纬度和维度拉标识,经度的范围 -180°到 180°,维度的范围为 -90° 到 90°。维度以赤道为界。赤道以南为负数,赤道以北为整数;经度以本初子午线(英国格林尼治天文台)为界,东边为正数,西边为负数。
  • Redis 在 3.2 版本中增加了 GEO 类型用于存储和查询地理位置,关于 GEO 的命令不多,主要包含以下6个:
命令 说明 语法
geoadd 添加地理位置 geoadd key longitude latitude member
geopos 查询位置信息,可看多个 geopos key member [member…]
geodist 距离统计 geodist key member1 member2 [unit]
georadius 查询某位置内的其他成员信息 geoadius key longitude latitude radius unit [WITHCOORD][WITHDIST] [COUNT [ASC/DESC]
geohash 查询位置的哈希值,可以查多个 geohash key member [member …]
zrem 删除地理位置,可以删多个 zrem key member [member …]

重点参数说明如下

  • longitude 表示经度
  • latitude 表示纬度
  • member 是为此经纬度起的名字 此命令支持一次添加一个或多个位置信息。
  • unit:统计单位
  • 1.WITHCOORD:返回满足条件位置的经纬度信息。
    2.WITHHDIST:返回满足条件位置与查询位置的直线距离。
    3.COUNT:指定返回满足条件位置的个数。
    4.[ASC/DESC]:从近到远 | 从远到近排序返回。

基础使用

  • 添加地理位置

    • 我们先用百度地图提供的经纬度查询工具,地址:http://api.map.baidu.com/lbsapi/getpoint/index.html
    • 找了以下4个地点,添加到 Redis 中
      天安门:116.404269,39.913164
      月坛公园:116.36,39.922461
      北京欢乐谷:116.499705,39.874635
      香山公园:116.193275,39.996348

      geoadd site 16.404269  39.913164 tiananmen
      geoadd site 116.36 39.922461 yuetan
      geoadd site 116.499705 39.874635 huanle
      geoadd site 116.193275 39.996348 xiangshan
      
  • 查询位置信息
    • geopos site tiananmen
  • 距离统计
    • geodist site tianan yuetan km
    • https://www.hhlink.com/经纬度(经纬度计算距离)校验结果
  • 查询某位置内的其他成员信息
    • georadius site 116.405419 39.913164 5 km
    • 此命令的意思是查询天安门(116.405419,39.913164)附近5公里范围内的成员列表。
  • 查询哈希值
    • geohash site tiananmen
  • 删除地理位置
    • zrem site xiaoming

应用场景

  • 查询附近的人、附近的地点等;
  • 计算相关的距离信息。

小结

  • GEO 是 Redis 3.2 版本中新增的功能,只有升级到 3.2+ 才能使用,GEO 本质上是基于 ZSet 实现的,这点在 Redis 源码找到相关信息,我们可以 GEO 使用实现查找附近的人 或者附近的地点,还可以用它来计算两个位置相隔的直线距离。

二、基数统计算法-HyperLogLog

基数为什么要使用 HyperLogLog?

  • 在我们实际开发的过程中,可能会遇到这样一个问题,当我们需要统计一个大型网站的独立访问次数时,该用什么什么的类型来统计?
  • 如果我们使用 Redis 中的集合来统计,当它每天有数千万级别的访问时,将会是一个巨大的问题。因为这些访问量不能被清空,我们运营人员可能会随时查看这些信息,那么随着时间的推移,这些统计数据所占用的空间会越来越大,逐渐超出我们能承受最大空间。
  • 例如,我们用 IP 来作为独立访问的判断依据,那么我们就要把每个独立 IP 进行存储,以 IP4 来计算,IP4最对需要 15 个字节来存储信息,例如:
    110.110.110.110。当有一千万独立 IP 时,所占用的空间就是 15 bit*10000000 约等于 143 MB,但这只是一个页面的统计信息,假如我们有1千万个个这样的页面,那么我们需要 1T 以上的空间来存储这些数据,而且随着 IP6 的普及,这个存储数字会越来越大,那我们就不能用集合的方式来存储了,这个时候我们需要开发新的数据类型 HyperLogLog 来做这件事了。

HyperLogLog 介绍

  • 集合保存数据,会去重,无序
  • HyperLogLog (下文简称HLL)是 Redis 2.8.9 版本添加的数据结构,它用于高性能的基数(去重)统计功能,它的缺点就是存在极低的误差率。

HLL 特点:

  • 能够使用极少的内存来统计巨量的数据,它只需要12 k 空间就能统计 2^64 的数据;
  • 统计存在一定的误差,误差率整体较低,标准误差为 0.81%;
  • 误差可以被设置辅助计算因子进行降低。

基础使用

命令 说明 使用
pfadd 添加元素,支持添加一个或多个元素至HLL结构中 pfadd key element [element …]
pfcount 统计不重复的元素,支持一个或多个 HLL 结构。 pfcount key [key…]
pfmerge 合并一个或多个 HLL 至新结构,如果已经存在新key会覆盖 pfmerge 新key 旧key [旧key…]

三、布隆过滤器

定义

  • 我们前面有讲到过 HyperLogLog 可以用来做基数统计,但它没提供判断一个值是否存在的查询方法,那我们如何才能查询一个值是否存在于海量数据之中呢?
  • 如果使用传递的方式,例如 SQL 中的传统查询,因为数据量太多,查询效率又低有占用系统的资源2,因此我们需要一个优秀的算法和功能来实现这个需求,这是我们今天要讲的——布隆过滤器。
  • 开启布隆过滤器在 Redis 中不能直接使用布隆过滤器,但我们可以通过 Redis 4.0 版本之后提供的 modules (扩展模块)的方式引入,本文提供两种方式的开启方式。

作用

  • 缓存穿透的解决方案

安装使用

  ```linux下载并安装布隆过滤器```
git clone https://github.com/RedisLabsModules/redisbloom.git
cd redisbloom
make     ## 编译,编译正常执行,会在跟目录生成一个 redisbloom.so 文件。```启动 Redis 服务器```./src/redis-server redis.conf --loadmodule ./src/modules/RedisBloom-master/redisbloom.so
## 其中–loadmodule 为加载扩展模块的意思,后面跟的是 redisbloom.so 文件的目录。
## 如果有命令提示则表名 Redis 服务器已经开启了布隆过滤器。
命令 说明 使用
bf.add 添加元素 bf.add key element
bf.madd 添加多个元素 bf.madd key element [element…]
bf.exists 判断某个元素是否存在,返回1表示存在 bf.exists key element
bf.mexists 判断多个元素是否存在,返回1表示存在 bf.exists key lement [element…]
bf.reserve 设置布隆过滤器的错误率,key得是没有创建过的 bf.reserve key 错误率 存储元素大小

错误率

  • 该错误是指在判断元素是否存在的时候,如果返回0,则里面一定没有,如果返回1,不一定有
  • 错误率越小,占用的空间就越大,200就是实际存储的值要远大于这个值准确率就会降低

四、缓存雪崩&缓存穿透

(一)缓存雪崩

定义

  • 缓存雪崩是指在短时间内,有大量缓存同时过期,导致大量的请求查询数据库,从而对数据库造成了巨大的压力,严重情况下可能导致数据库宕机的情况叫做缓存雪崩。

缓存雪崩解决方案

  • 1.随机化过期时间

    • 为了避免缓存同时过期,可在设置缓存时添加随机时间,这样就可以极大的避免大量的缓存同时失效。
  • 2.加锁排队
    • 加锁排队可以起到缓冲的作用,防止大量的请求同时操作数据库,但它的缺点是增加了系统的响应时间,降低了系统的吞吐,牺牲了一部分用户体验。

(二)缓存穿透

定义

  • 缓存穿透是指查询数据库和缓存都无数据,因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会查询数据库,这种情况就叫做缓存穿透。

缓存穿透解决方案

  • 使用过滤器

    • 我们可以使用过滤器来减少对数据库的请求,例如使用我们前面所学的布隆过滤器。
  • 缓存空结果
    • 另一种方式是我们可以把每次从数据库查询的数据都保存到缓存中,为了提高前台用户的体验(解决长时间内查询不到任何信息的情况),我们可以将空结果的缓存时间设置的短一些,例如 3-5分钟。

(三)缓存击穿

定义

  • 缓存击穿是短时间内大量用户访问一个key,即热点key,当热点key缓存失效的时候,就会有大量请求直接打在数据库上。

缓存穿透解决方案

  • 加锁限流

    • 限制访问客流。
  • 设置热点key永不过期
    • 热点key缓存一直存着,要更新的话也是在内部更新,不会过期

5redis-----------redis高级--GEO-查询附近的人、基数统计算法HLL 、布隆过滤器、缓存雪崩穿透击穿-------全栈式开发44相关推荐

  1. 使用 Redis 如何实现查询附近的人?「视频版」——面试突击 003 期

    面试问题 Redis 如何实现查询附近的人? 涉及知识点 Redis 中如何操作位置信息? GEO 底层是如何实现的? 如何在程序实现查询附近的人? 在实际使用中需要注意哪些问题? 视频答案 视频地址 ...

  2. 面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版

    这是我的第 33 篇原创文章 作者 | 王磊 (javacn666) 1 面试问题 Redis 如何实现查询附近的人? 2 相关面试问题 Redis 中如何操作位置信息? GEO 底层是如何实现的? ...

  3. Redis 缓存雪崩、击穿、穿透

    Redis 缓存雪崩.击穿.穿透 文章目录 Redis 缓存雪崩.击穿.穿透 一.Redis基础 Redis基本数据类型.操作 二.面试相关问题 1.小伙子您好,看你简历上写了你项目里面用到了Redi ...

  4. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

  5. 面试填坑之Redis无底洞(一、Redis缓存雪崩、击穿、穿透)

    Redis缓存雪崩.击穿.穿透 学习自大佬:https://blog.csdn.net/qq_35190492/article/details/102889333 https://www.cnblog ...

  6. 如何解决Redis缓存雪崩、击穿与穿透

    Redis最常用使用的场景就是作为业务系统的缓存,既然是作为缓存,那么就不免会碰到缓存常见的问题,即雪崩.击穿与穿透,什么是缓存雪崩.击穿与穿透以及如何解决这几个问题呢?今天我们一起来探讨一下! 一. ...

  7. Redis中的缓存雪崩、击穿、穿透的原因以及解决办法

    缓存雪崩.击穿.穿透一旦发生,会导致大量的请求积压到数据库层.如果请求的并发量很大,就会导致数据库宕机或是故障,这就是很严重的生产事故了. 俗话说,知己知彼,百战不殆.了解了问题的成因,我们就能够在应 ...

  8. 【redis】缓存预热雪崩穿透击穿

    [redis]缓存预热雪崩穿透击穿(上) 文章目录 [redis]缓存预热雪崩穿透击穿(上) 前言 一.面试题 二.缓存预热 三.缓存雪崩 发生原因 预防+解决 高可用: 多缓存结合: 人民币玩家 四 ...

  9. redis缓存雪崩、击穿、穿透

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.redis缓存雪崩 二.redis缓存击穿 三.redis缓存穿透 前言 主要是介绍一下redis缓存雪崩.击穿. ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——探索和设计
  2. re.split()用法详解
  3. 无意间看到Pure-Mvc记录下
  4. LeetCode Algorithm 797. 所有可能的路径
  5. c++基础学习(06)--(时间,输入输出,数据结构)
  6. LeetCode 837. 新21点(动态规划)
  7. xgboost实例_XGBoost超详细推导,终于有人讲明白了!
  8. 计算机网络——链路层之信道
  9. 在浏览器中运行java applet
  10. java 广告插件_徒手创建一个chrome扩展-屏蔽广告插件
  11. 《Android深度探索》(卷1)HAL与驱动开发 第十章心得体会
  12. grpc python stream_grpc| python 实战 grpc【h】
  13. Idea下的springboot mysql8.0等报错解决随笔
  14. 电脑右击文件夹无反应
  15. ldap 测试表设计
  16. 我在16ASPX下了一个系统是ACCESS和VS2005做的我想把那个连接数据库的'DB_16aspx'的名字改了进不了了可是?...
  17. linux目录结构全解,Linux目录结构详解(最全最详细版)
  18. Whitebox 白盒--密码算法的安全工具
  19. 【Python】input()函数用法小结
  20. JS炫彩动画效果的文字特效

热门文章

  1. 盘古开源:强化布局,算力网络建设进入“快车道”
  2. 星辰天合亮相 2023 国际金融展,软件定义存储信创方案备受瞩目
  3. java 自动下载自动搜索_必应美图下载 - 自动更换批量下载的壁纸
  4. php artisan migrate error: Laravel Base table or view already exists: 1050 Table
  5. IDEA运行后target目录中没有classes,项目没有打包
  6. 达内java学习day1
  7. jsp超市管理系统(含源码+数据库)
  8. smobiler仿饿了么app搜索页面
  9. Windows 系统上使用任务管理器查看进程的各项属性(命令行、DPI、管理员权限等)
  10. 佳能hdr_不要忘了相机自带的HDR功能_佳能 6D_数码影像评测-中关村在线