跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)
前言
对于Redis而言,很多小伙伴只关注其关键的五大基础类型:string、hash、list、set、sorted set(有序集合),其实还有三种特殊类型在很多应用场景也比较适合使用,分别是:bitmap、geospatial、hyperloglog;上一篇(跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时))对五种类型进行分享,接下来结合应用场景来说说三种特殊类型的使用方式;
正文
geospatial(地理空间)
该类型在Redis3.2.0版本中加入,其本质是将经纬度通过geohash技术转换成一个值,使用sorted set将其存储;具体内部实现在这里不进行研究,这次主要说应用。
经度(longitude)、维度(latitude)小伙伴肯定不陌生(流泪,当初地理差的一批):
- 有效的经度是-180度到180度;
- 有效的纬度是-85.05112878度到85.05112878度;
该类型只有六个命令,先简单介绍一下各命令的功能和关键参数:
GEOADD:添加地理空间位置信息,即经纬度信息;
GEOADD key 经度1 维度1 member1 [经度2 维度2 member2 ...]
GEODIST:获取指定位置之间的距离,默认单位为米;
GEODIST key member1 member2 [单位]
单位可以指定,如下几种:
m:指定单位为米;
km:指定单位为千米;
mi:指定单位为英里;
ft:指定单位为英尺;
GEOHASH:返回11个字符的Geohash字符串,字符串越相似,位置越接近;一般底层调试使用的比较多。
GEOHASH key member1 [member2 ...]
GEOPOS:返回指定一个或多个位置元素的位置信息,即经纬度信息;
GEOPOS key member1 [member2 ...]
GEORADIUS:以指定的经纬度为圆心,查找指定半径范围的位置元素;
GEORADIUS key 经度 维度 半径 m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
半径后面指定一个单位,m|km|ft|mi指定其中一个;
WITHDIST:在返回查找到位置元素, 同时对应位置元素与中心之间的距离也一并返回。
WITHCOORD:将位置元素的经度和维度也一并返回。
WITHHASH:以 52 位有符号整数的形式返回, 返回位置元素经过原始 geohash 编码的有序集合分值,即一串字符串;
COUNT:代表返回位置信息的条数,类似于分页条数;
GEORADIUSBYMEMBER:指定的对应位置元素为圆心,查找指定半径范围的位置元素;GEORADIUS命令是通过指定经纬度为圆心,其他使用方式一致;
GEORADIUSBYMEMBER key member 半径 m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
命令功能及参数说明就简单说这么多(我怕说理论),欲知详情,请小伙伴去官网瞅瞅;
接下来结合应用场景进行命令实战,不然小伙伴要忍不住啦↓↓↓
应用场景实战1
绿色出行,小黄、小蓝、青桔、哈罗各种共享自行车应该已经是很多小伙伴们出行必用了吧,来,先截个哈罗的图看看:
图中显示定位附近的小车,小伙伴可以先想想,如果这个需求给自己,怎么实现?
如果用Redis,这样搞试试:
每一辆共享单车肯定有定位功能,将其定位信息(经纬度)存储到后台管理系统中,这里我们模拟定位信息存储,我们用百度地图坐标拾取器可以取得地图上任意一点的经纬度信息,如下图:
网页地址为:http://api.map.baidu.com/lbsapi/getpoint/index.html
模拟共享单车定位信息存储到后台Redis:
当我们打开手机时,App同样会通过手机进行定位,比如得到对应位置的经纬度信息为:113.768365(经度),34.724814(纬度),这样就可以指定用户的定位信息为中心,去查找附近指定半径的单车,然后将其标注在地图上:
应用场景实战2
再来一个需求,比如说微信附近的人,直播APP附近直播的播友,还有某陌附近的美女,如下图:
如果用Redis实现,同样是通过APP(比如微信)将用户的定位信息保存到后台Redis中,这里还是使用百度地图拾取器的方式取得位置信息模拟将定位信息保存在Redis:
附近餐馆、附近加油站、附近酒店同样的原理,最后关于具体的信息可以通过得到信息(比如说用户ID、共享单车标识等)去存储详细信息的数据库中查询。
bitmap
bitmap在Redis2.2.0版本加入,其并不是一种实际的数据类型,而是在字符串类型基础上定义的一组面向位的操作。因为字符串是二进制安全的blob,对应value能存储的最大长度是512 MB,即可以设置2^32个不同的位;大概的结构如下:**
**
实践出真理,看看其类型到底是不是string类型:
常用命令如下:
SETBIT:设置指定key中指定位置(offset)的值(0 或 1);
SETBIT key offset value
GETBIT:获取指定key中指定位置(offset)的值,未设置过默认返回0;
GETBIT key offset
BITCOUNT:统计指定key位置为1的数量,可以指定区间(这里的区间以字节(byte)为单位);
BITCOUNT key [start end]
BITOP:进行位运算,支持四种表达式运算: AND(交集), OR(并集), XOR(异或)和NOT(取非);
BITOP operation destkey key [key ...]
operation 可以指定对应的运算方式,运算的结果存入destkey中;
BITPOS:返回指定key中指定值的第一个位置;
BITPOS key bit [start] [end]
模拟应用场景实战:
bitmap由于存储的值只能是0或1,所以很适合两种状态的数据记录和分析,比如说是否签到,是否登录,然后通过签到记录的数据可以统计周、月、年签到数,通过登录的数据可以分析用户是否活跃;
应用场景用户签到
比如某多多连续签到送现金、运动打卡App(比如Keep)、学习打卡App或者小程序,都会有对打卡数据的统计,如下图某音极速版连续签到送积分:
如果用Redis实现,如下:
应用场景用户登录即用户活跃分析:
如下统计逻辑:
bitmap适合数据量比较大的场景,如果数据几十上千,用bitmap反而相对比较占空间,直接使用用户ID作为Key使用set存储,但是如果数据量大时,Key值所占空间比较大,比较浪费,而bitmap用512M内存就能标识40亿数据状态;当然,不介意bitmap的位数很大,设置或分析数据的时候可能会导致堵塞,所以当位数很大时,建议将其拆分为多个Key,保证分析的高效。
先休息一下,晃晃头,眨巴眨巴眼睛,然后继续往下↓↓↓
hyperloglog
先说说什么是基数?
基数(cardinal number)在数学上,是集合论中刻画任意集合大小的一个概念。两个能够建立元素间一一对应的集合称为互相对等集合。例如3个人的集合和3匹马的集合可以建立一一对应,是两个对等的集合。
百度百科
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
菜鸟教程
通俗一点就是不重复元素的个数(这是个人通俗的理解),先到这,实战再来回顾这句话;
hyperloglog是一种概率数据统计结构,适合超大数据量的基数统计,速度快,而且空间占用小,;但是统计的结果存在低于1%的误差,如果需要的是精确统计的话,使用基础类型set进行统计也不错,但当统计元素比较多时,内存占用空间会增大,毕竟用空间换精确度嘛。
和bitmap感觉很像,都适合大数据量的统计,但是bitmap还关注统计对象,比如说谁签到多少次,而hyperloglog只进行基数统计,不关注是谁进行签到;比如常听到UV统计场景,即一个页面,一个用户访问多次,也只算一次,最后只关注这个页面被多少用户访问,而不在乎是谁访问;微信公众号文章的统计也是针对用户统计的,同一个用户不管访问几次,只算一次阅读;
常用命令:
PFADD:添加元素到指定HyperLogLog;
PFADD key element [element ...]
PFCOUNT:返回指定HyperLogLog的基数估算值;
PFCOUNT key [key ...]
如果指定多个HyperLogLog ,返回它们并集近似基数,存在低于1%的误差;
PFMERGE:将多个 HyperLogLog 合并为一个 HyperLogLog ;
PFMERGE destkey sourcekey [sourcekey ...]
模拟应用场景
模拟页面UV统计,即用户访问数,不注重是谁访问:
模拟App应用市场下载数,比如某音下载量都好几亿了,这个肯定不关心是谁下载吧,只关心下载数量来衡量应用参数;
总结
先到这吧,这篇总耗时又搞了几个小时,上文中应用场景模拟只是给小伙伴提供思路,小伙伴可以根据需求进行设计;下一遍说说配置文件;
一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一起学~~~
撸文不易,莫要白瞟,三连走起~~~~
跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)的更多相关文章
- 看完这篇Redis缓存三大问题,保你面试能造火箭,工作能拧螺丝。
前言 日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题. 一旦涉及大数据量的需求,如一些商品抢购的情景,或者主页访问量瞬间较 ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了
APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了 彻底理解android中的内部存储与外部存储 存储在内部还是外部 所有的Android设备均有两个文件存储区域:"intern ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- [转帖]看完这篇文章你还敢说你懂JVM吗?
看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...
- 看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
引言 在 android 开发过程中,我们经常需要对一些手势,如:单击.双击.长按.滑动.缩放等,进行监测.这时也就引出了手势监测的概念,所谓的手势监测,说白了就是对于 GestureDetector ...
- [转帖]看完这篇文章,我奶奶都懂了https的原理
看完这篇文章,我奶奶都懂了https的原理 http://www.17coding.info/article/22 非对称算法 以及 CA证书 公钥 核心是 大的质数不一分解 还有 就是 椭圆曲线算法 ...
- MAC上的爬虫软件怎么选?看完这篇就够了
在上一篇文章:网络爬虫软件哪个好用? 中,我们介绍了目前市面上比较成熟好用的网络爬虫软件, 但是其中有些不能在MAC上使用,因此今天这篇文章我们单独介绍一下在MAC操作系统中有哪些好用的爬虫软件,给大 ...
- Mysql快速入门(看完这篇能够满足80%的日常开发)
这是一篇mysql的学习笔记,整理结合了网上搜索的教程以及自己看的视频教程,看完这篇能够满足80%的日常开发了. 菜鸟教程:https://www.runoob.com/mysql/mysql-tut ...
随机推荐
- Node.js向MongoDB中插入并查询数据
首先必须要保持Node.js与MongoDB保持连接 具体教程见:Node.js连接MongoDB数据库步骤 插入数据步骤如下 node项目文件如下:在routes文件夹下新建insert.js文件, ...
- JVM垃圾回收器前瞻
垃圾回收器的新发展 GC仍然处于飞速发展之中,目前的默认选项G1 GC在不断的进行改进,很多我们原来认为的缺点,例如串行的Full GC.Card Table扫描的低效等,都已经被大幅改进,例如, ...
- openstack核心组件——nova计算服务(7)
云计算openstack核心组件——nova计算服务(7) 一.nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 ...
- git个人常用命令
git https://www.cnblogs.com/chenwolong/p/GIT.html 添加当前目录的所有文件到暂存区 $ git add . 提交暂存区到仓库区 $ git commit ...
- hystrix文档翻译之如何使用
Hello World! 使用HystrixCommand实现“Hello World”. public class CommandHelloWorld extends HystrixCommand& ...
- JELLY技术周刊 Vol.24 -- 技术周刊 · 实现 Recoil 只需百行代码?
蒲公英 · JELLY技术周刊 Vol.24 理解一个轮子最好的方法就是仿造一个轮子,很多框架都因此应运而生,比如面向 JS 开发者的 AI 工具 Danfo.js:参考 qiankun 的微前端框架 ...
- Hibernate4.3基础知识1
一.Hibernate 开发环境搭建 4.3 1.导包 2.创建hibernate.cfg.xml配置文件 3.创建实体类 4.创建映射文件 实体类名.hbm.xml 配置文件 二.h ...
- 服务器备用远程-----Radmin客户端的操作指南(如何远程与传送文件)
一台服务器的寿命一般比较长可能会从几年到几十年,就会经历各个版本的更新与升级.再经过时间的历练后,可能windwos自带的远程连接有时候会拉胯,经常报错. 这时候就需要备选方案,有钱的单位会自己搭建堡 ...
- Java (四)APACHE Commons IO 复制文件
上一篇:Java (三)APACHE Commons IO 常规操作 例1:复制文件 1 import java.io.File; 2 import java.io.IOException; 3 4 ...
- 《Java从入门到失业》第五章:继承与多态(5.8-5.10):多态与Object类
5.8多态 上面我们了解了向上转型,即一个对象变量可以引用本类及子类的对象实例,这种现象称为多态(polymorphism).多态究竟有什么用呢?我们先学习一个知识点. 5.8.1方法重写 前面我们学 ...