服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - 详解redis的三种特殊数据类型

详解redis的三种特殊数据类型

2023-08-09 15:12秦 羽 Redis

介绍redis的三种特殊数据类型_redis特殊数据类型

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
string

127.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的三种特殊数据类型的文章就介绍到这了,更多相关内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/qq_43585922/article/details/128125841

延伸 · 阅读

精彩推荐
  • RedisRedis中事件驱动模型示例详解

    Redis中事件驱动模型示例详解

    Redis这个数据库相信不用过多介绍了,大家应该都知道,下面这篇文章主要给大家介绍了关于Redis中事件驱动模型的相关资料,文中通过示例代码介绍的非常...

    Zhengxin Diao3022019-11-12
  • Redis基于redis实现token验证用户是否登陆

    基于redis实现token验证用户是否登陆

    这篇文章主要为大家详细介绍了基于redis实现token验证用户是否登陆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    段恩刚--Baron10102019-11-27
  • Redis详解用Redis实现Session功能

    详解用Redis实现Session功能

    本篇文章主要介绍了用Redis实现Session功能,具有一定的参考价值,小编觉得挺不错的,现在分享给大家,也给大家做个参考。 ...

    Jlins5252019-11-01
  • RedisRedis中Redisson布隆过滤器的学习

    Redis中Redisson布隆过滤器的学习

    布隆过滤器是一个非常长的二进制向量和一系列随机哈希函数的组合,可用于检索一个元素是否存在,本文就详细的介绍一下Redisson布隆过滤器,具有一定...

    我家有猫已长成6982022-10-17
  • RedisRedis批量删除KEY的方法

    Redis批量删除KEY的方法

    这篇文章主要介绍了Redis批量删除KEY的方法,本文借助了Linux xargs命令实现,需要的朋友可以参考下 ...

    junjie4622019-10-21
  • RedisRedis和Memcached的区别详解

    Redis和Memcached的区别详解

    这篇文章主要介绍了Redis和Memcached的区别详解,本文从各方面总结了两个数据库的不同之处,需要的朋友可以参考下 ...

    Redis教程网2072019-10-22
  • Redisredis-benchmark并发压力测试的问题解析

    redis-benchmark并发压力测试的问题解析

    这篇文章主要介绍了redis-benchmark并发压力测试的问题解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    king config10262021-02-26
  • Redisredis缓存一致性延时双删代码实现方式

    redis缓存一致性延时双删代码实现方式

    这篇文章主要介绍了redis缓存一致性延时双删代码实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    彼的猫4852022-08-26