详解redis的三种特殊数据类型
14天学习训练营导师课程: 郑为中《Vue和SpringBoot打造假日旅社管理系统》
努力是为了不平庸~
学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识点/题解/项目实操/遇到的bug/等等),在分享的同时加深对于知识点的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~
你可以从以下几个方面着手(不强制),或者根据自己对学习课程主题的理解创作,参考如下:
三种特殊数据类型
- Geospatial(地理位置)
- Hyperloglog(基数统计)
- BitMaps(位图)
Geospatial(地理位置)
使用经纬度定位地理坐标,底层实现原理就是用一个有序集合zset保存,所以zset命令也可以使用
命令 | 描述 |
---|---|
geoadd key longitud(经度) latitude(纬度) member(名称) [..]
|
将具体经纬度的坐标存入一个有序集合 |
geopos key member [member..]
|
获取集合中的一个/多个成员坐标 |
geodist key member1 member2 [unit]
|
返回两个给定位置之间的距离。默认以米作为单位。 |
georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count]
|
以给定的经纬度为中心, 返回集合包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。 |
GEORADIUSBYMEMBER key member radius...
|
功能与GEORADIUS相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点。 |
geohash key member1 [member2..]
|
返回一个或多个位置元素的Geohash表示。使用Geohash位置52点整数编码。 |
$ geopos china:city beijing 获取集合中的一个/多个成员坐标 获得当前定位。是一个坐标值$ geodist china:city beijing shanghai$ GEORADIUS china:city 120 30 500 km withcoord # 显示出经度和维度
$ GEORADIUS china:city 120 30 500 km withdist # 显示到中间的距离$ GEORADIUS china:city 120 30 500 km withcoord withdist count 1 # 筛选出指定的结果# 找出位于指定元素周围的其他元素
$ GEORADIUSBYMEMBER china:city shanghai 400 km # 显示在上海周围400km内的城市# 该命令将返回11个字符的geohash字符串
# 将二维的经纬度转换未一维的字符转,两个字符串越接近,相距越近。
127.0.0.1:6379> geohash china:city beijing shanghai
有效经纬度
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
指定单位的参数 unit 必须是以下单位的其中一个:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
关于GEORADIUS的参数
通过
georadius
就可以完成 附近的人功能
withcoord:带上坐标
withdist:带上距离,单位与半径单位相同
COUNT n : 只显示前n个(按距离递增排序)
- georadius
# 查询经纬度(120,30)坐标500km半径内的成员
127.0.0.1:6379> GEORADIUS china:city 120 30 500 km withcoord withdist 1) 1) "hangzhou"2) "29.4151"3) 1) "120.20000249147415"2) "30.199999888333501"
2) 1) "shanghai"2) "205.3611"3) 1) "121.40000134706497"2) "31.400000253193539"
- geohash
127.0.0.1:6379> geohash china:city yichang shanghai # 获取成员经纬坐标的geohash表示
1) "wmrjwbr5250"
2) "wtw6ds0y300"
Hyperloglog(基数统计)
Redis HyperLogLog 是用来做基数统计的算法,例如:网页的UV(一个人访问一个网站多次,但是还是算作一个人)
传统的方式:set保存 用户的id,然后可以统计set中的元素数量作为标准判断。如果保存大量的ID就会麻烦。目的是为了计数,而不是为了保存用户id
HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
仅花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。 但是会有一定的容错
- 如果允许容错,那么一定可以使用Hyperloglog !
- 如果不允许容错,就使用set或者自己的数据类型即可 !
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
其底层使用string数据类型
什么是基数?
数据集中不重复的元素的个数。
应用场景:
网页的访问量(UV):一个用户多次访问,也只能算作一个人。
传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数,Hyperloglog就能帮助我们利用最小的空间完成。
命令 | 描述 |
---|---|
PFADD key element1 [elememt2..]
|
添加指定元素到 HyperLogLog 中 |
PFCOUNT key [key]
|
返回给定 HyperLogLog 的基数估算值。 |
PFMERGE destkey sourcekey [sourcekey..]
|
将多个 HyperLogLog 合并为一个 HyperLogLog |
- PFADD–PFCOUNT
127.0.0.1:6379> PFADD myelemx a b c d e f g h i j k # 添加元素
(integer) 1
127.0.0.1:6379> type myelemx # hyperloglog底层使用String
string
127.0.0.1:6379> PFCOUNT myelemx # 估算myelemx的基数
(integer) 11
127.0.0.1:6379> PFADD myelemy i j k z m c b v p q s
(integer) 1
127.0.0.1:6379> PFCOUNT myelemy
(integer) 11
- PFMERGE
127.0.0.1:6379> PFMERGE myelemz myelemx myelemy # 合并myelemx和myelemy 成为myelemz
OK
127.0.0.1:6379> PFCOUNT myelemz # 估算基数
(integer) 17
BitMaps(位图)
使用位存储,信息状态只有 0 和 1,操作二进制位进行记录
Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。
应用场景
签到统计、状态统计,统计用户信息:活跃,登陆状态等
命令 | 描述 |
---|---|
setbit key offset value
|
为指定key的offset位设置值 |
getbit key offset
|
获取offset位的值 |
bitcount key [start end]
|
统计字符串被设置为1的bit数,也可以指定统计范围按字节 |
bitop operration destkey key[key..]
|
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。 |
BITPOS key bit [start] [end]
|
返回字符串里面第一个被设置为1或者0的bit位。start和end只能按字节,不能按位 |
- setbit–getbit
127.0.0.1:6379> setbit sign 0 1 # 设置sign的第0位为 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 设置sign的第2位为 1 不设置默认 是0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> type sign
string127.0.0.1:6379> getbit sign 2 # 获取第2位的数值
(integer) 1
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 4 # 未设置默认是0
(integer) 0
- bitcount
127.0.0.1:6379> BITCOUNT sign # 统计sign中为1的数量
(integer) 4
bitmaps的底层
设置以后能get到的值是:\xA2\x80,所以bitmaps是一串从左到右的二进制串
详解redis的三种特殊数据类型相关推荐
- Redis中三种特殊数据类型
本文来说下Redis中三种特殊数据类型 文章目录 Gerspatial地理位置 Hyperloglog基数统计 Bitmap位图 Gerspatial地理位置 一共 6 个命令: GEOADD GEO ...
- python什么是可变参数_详解Python的三种可变参数
可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中,在函数内部会自动认为是一个元组或 ...
- 详解二叉树的三种遍历方式(递归、迭代、Morris算法)
详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...
- python中什么是可变参数_详解Python的三种可变参数
详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...
- oracle dg切换步骤,详解Oracle dg 三种模式切换
oracle dg 三大模式切换 =================================== 1 最大性能模式MAXIMUM PERFORMANCE ------默认模式 ===== ...
- redis的三种特殊数据类型
三种特殊数据类型 GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作.来实现诸如附近位置.摇一 ...
- redis学习--三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap
三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存 ...
- memcpy后数据不对_详解Redis 的 5 种基本数据结构:
来源:我没有三颗心脏 一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, ...
- 详解python运行三种方式_详解python运行三种方式
方式一 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ p ...
最新文章
- 直播活动丨BMMeetup第1期:大模型Prompt Tuning技术,8场学术报告和Poster提前下载...
- 简述python程序的基本构成_(一)Python入门-2编程基本概念:01程序的构成
- 【转】Win7安装Oracle10g经验分享
- 格“物”致知:多模态预训练再次入门
- 20120621第一天_复习与测试
- Koa入门——关键知识点总结
- 超文本引用href的几种用法
- java没有这样的元素异常_java – 没有这样的元素异常?
- Winform中创建超链接,点击跳转网页
- 7-160 验证“哥德巴赫猜想” (20 分)
- LINQ-to-SQL那点事~耳目一新的partial class 和 partial method
- PHP 服务器变量 $_SERVER(转)
- 一个五年Java程序员的从业总结,献给还在迷茫中的你
- 一个学生成绩管理系统c语言,一个学生成绩管理系统C语言源代码
- Bugku杂项——旋转跳跃
- stm32f4有重映射么_stm32f4引脚重映射
- IDEA 快捷键拆解系列(五):Navigate 篇
- 【个人喜好诗词之一】归去来兮辞
- LPC2141芯片解密 芯片解密干什么
- android 广告轮播图片+视频+音频
热门文章
- 从理解开始 谈谈px rem 和 em 的区别与联系
- 华为鸿蒙公测第三期,鸿蒙OS2.0第二期第三期公测机型陆续公布麒麟980和麒麟820将登场...
- 阿里云反欺诈——风险识别
- 云桌面教学可以给学校老师和学生带来那些改变
- CH340C的ESP8266一键下载电路设计
- python 模块 导入机制 模块搜索 Python包 发布python模块或程序
- 「衣米魔兽世界怀旧服」大数据分析反外挂系统查封145个穿门账号
- 关于百度网盘提取码验证失败问题的猜想
- mobx+mobx-react
- Python 量化投资实战教程(6) — 交易平均收益率