众所周知,在redis中的数据类型有String(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)五种。但在这5种之外还有高级数据类型。

今天和大家介绍下常用的高级数据类型:

1、HyperLogLog。

Redis中的HyperLogLog是用来做基数(数据集中不重复元素的数量就是基数)统计的算法。因为HyperLogLog只会计算输入元素的基数,不会存储元素本身,所以不能像其他数据类型一样,返回输入的各个元素。(版本2.8.9加入的)

特点:在输入元素的数量或体积非常大的时候,计算基数所需的空间总是固定的(空间很小)。

下面实际演示HyperLogLog

1)、PFADD

命令:PFADD key element[element ...] 添加指定元素到HyperLogLog中。有元素添加就返回1,没有就返回0。如下图:

2)、PFCOUNT

命令:PFCOUNT key[key ...]返回给定的HyperLogLog的基数估算值。如果多个HyperLogLog则返回基数估算值之和(注意多个HyperLogLog 在redis集群中的同一个solt上才能返回基数,不在同一个solt上会报错)。如下图:

3)、PFMERGE

命令:PFMERGE mergekey sourcekey[sourcekey ...]将多个HyperLogLog合并为一个HyperLogLog(mergekey 合并后的key,sourcekey需要合并的key),注意多个HyperLogLog 在redis集群中的同一个solt上才能合并,不在同一个solt上会报错。如下图:

解决这个异常(CROSSSLOT Keys in request don't hash to the same slot):只需要合并或同时返回的多个HyperLogLog在同一个solt上就能解决问题了。redis提供了一种特定的标签{},这个{}内的字符串才参与计算hash solt。如下图:

从上图可以看出PFCOUNT 返回多个HyperLogLog和PFMERGE将多个HyperLogLog合并都可以了

应用场景:实现记录网站每天访问的独立IP数量、系统的有多少用户访问、直播间的观看人数等。

2、GEO

redis在3.2版本里面添加了一个对地理位置(GEO)的支持。

下面具体介绍下:

1)、GEOADD

命令:GEOADD key longitude latitude member [ longitude latitude member ...]添加指定的地理空间位置到指定的key中。如下图:

2)、GEODIST

命令:GEODIST key member1 member2 [unit]返回给定两个位置之间的距离。如果有一个位置不存在就返回空值,unit是单位参数,其值为 m(米)、km(千米)、mi(英里)、ft(英尺)中的一个。如下图:

3)、GEOPOS

命令:GEOPOS key member [member ...] 从key里返回所有给定位置,返回一个有经度和纬度组成的一个二维数组。如下图:

4)、GEOHASH

命令:GEOHASH key member [member ...]返回元素的经纬度编码字符串。如下图:

5)、GEOREDIUS

命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]以给定经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素。单位可以使用m(米)、km(千米)、mi(英里)、ft(英尺)中的一个。如下图:

在给定以下可选项时,命令就会返回额外的信息:

WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离一起返回。如下图:

WITHCOORD:将位置元素的经纬度一起返回。如下图:

WITHHASH: 返回位置元素经过原始 GEOHASH编码的有序集合分值。如下图:

ASC/DESC:ASC按中心的位置,从近到远的方式返回位置元素,DESC按中心的位置,从远到近的方式返回位置元素,如下图:

COUNT:默认情况时返回所有的位置元素,但使用了COUNT选项,获取前X个匹配的元素。注意:使用COUNT选项获取少量元素,但执行速度不会因减少获取的元素而加快。如下图:

6)、GEORADIUSBYMEMBER

命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]和GEORADIUS命令一样,都是返回指定范围内的元素,有一点不同,这个命令是设置位置元素为中心点。如下图:

3、Bitmaps

bitmaps严格来说并不是一种新的数据类型,而是基于字符串位操作的集合,由于字符串是二进制安全的,并且最长可支持512M,所以它们可以用来存储2的32次方(512 * 1024 * 1024 * 8 )不同位的数据。

在介绍之前先了解下字母abc的二进制ASCII码如下:

a---01100001

b---01100010

c---01100011

下面具体介绍下:

1)、SETBIT /GETBIT

命令:SETBIT key offset value 对key所存储的字符串值,设置指定偏移量上的位(bit),value只能是1或者0。若key不存在时,自动生成一个新的字符串值,并返回0,否则指定偏移量原来存储的位。

命令:GETBIT key offset 获取key指定偏移量上的位(bit)。若offset比字符串值的长度大,或者key不存在时,返回0,否则返回字符串值偏移量上的位(bit)

实际操作下:给(bitkey)设置abc,从上面abc对应的二进制ASCII码。可知道bitkey 一共有24位,具体如下:01100001 01100010 01100011。从左往右,偏移量从0开始到23。获取偏移量为10,15,23的值 1,0,1,如下图:

执行命令:setbit bitkey 6 1,将偏移量为6的位设置为1 ,那bitkey为01100011 01100010 01100011,转成字符串就是cbc。如下图:

执行命令:setbit bitkey 23 0,将偏移量为第23的位 设置为0 ,那bitkey为01100011 01100010 01100010,转成字符串就是cbb。如下图:

2)、BITCOUNT

命令:bitcount key [start] [end] 计算给定字符串中,被设置为1的比特位的数量(可通过start或end参数,让计数只在特定的位上进行)。若key不存在,当成空字符串处理,返回0,否则返回被设置为1的位的数量。注:start和end是一个字节,一个字节为8位如下图:

3)、BITOP

命令:bitop operation destkey key [key……]对一个或多个保存二进制位的字符串key进行位元操作(and(与)、or(或)、not(非)、xor(异或) 四种操作),并将结果保存到destkey上。除了not操作外,其他操作都可以接受一个或多个key作为输入,not只能接受一个key作为输入。

注意:(1)、当bitop处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看做0,空的key也被看做是包含0的字符串序列。(2)、保存到destkey的字符串的长度,和输入key中最长的字符串长度相等。

and(与)操作:先给{bit}:key1 和{bit}:key2 分别赋值a,b。然后执行命令:bitop and {bit}:keys {bit}:key1 {bit}:key2,看下执行结果。如下图

or(或)操作:执行命令bitop or {bit}:key3 {bit}:key1 {bit}:key2,看下执行结果。如下图

not(非)操作:执行命令bitop not {bit}:key4 {bit}:key1,看下执行结果。如下图:

xor(异或)操作:执行命令bitop xor {bit}:key5 {bit}:key1 {bit}:key2,看下执行结果。如下图:

4)、BITPOS

命令:bitpos key bit [start] [end] 返回字符串里面第一个被设置为1或者0的bit位。如key为空字符或者0字节的字符串,那么将返回-1。注:start和end是一个字节,一个字节为8位。如下图:

应用场景:系统记录用户的登录情况、用户在线情况等。

注:在面试的时候,被问到redis的数据类型的时候,除了回答5种基础数据类型外,这三种高级数据类型,也可以回答一下。说不定能增加面试官对你印象。

今天的内容就到这里了,有什么不对的,欢迎大家在评论区中指出!

数据类型_分享redis中除5种基础数据类型以外的高级数据类型相关推荐

  1. redis zset转set 反序列化失败_关于Redis中的五种数据结构,要知其然知其所以然...

    Redis作为Nosql的代表,想必大家已经再熟悉不过了,除了作为缓存来使用,Redis还提供了其他很多有用的功能,例如可作为消息队列.分布式锁.不隆过滤器.限流等功能使用.今天先来说一说redis作 ...

  2. bootstraptable获取所有数据_关于Redis中的五种数据结构,要知其然知其所以然

    Redis作为Nosql的代表,想必大家已经再熟悉不过了,除了作为缓存来使用,Redis还提供了其他很多有用的功能,例如可作为消息队列.分布式锁.不隆过滤器.限流等功能使用.今天先来说一说redis作 ...

  3. 图解Redis中的9种数据结构(高级面试,必备)

    如图所示,Redis中提供了9种不同的数据操作类型,他们分别代表了不同的数据存储结构. 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型,也是最简单的一种类型 ...

  4. lsdyna如何设置set中的node_list_Redis 系列教程(二)Redis中的五种数据类型

    上篇文章我们介绍了如何在Linux中安装Redis,本文我们来了解下Redis中的五种数据类型. 五大数据类型介绍 redis 中的数据都是以 key/value 的形式存储的,五大数据类型主要是指 ...

  5. redis数据类型_认识Redis与Redis的数据类型

    本文作为Redis的入门教程,旨在让大家对Redis有一个概念性和整体性的认识,并且可以快速上手,为深入Redis打下基础. 文章概要: 1. Redis的介绍 2. Redis与其他数据库的对比 3 ...

  6. redis 读取mysql数据类型_认识Redis与Redis的数据类型

    本文作为Redis的入门教程,旨在让大家对Redis有一个概念性和整体性的认识,并且可以快速上手,为深入Redis打下基础. 文章概要: 1. Redis的介绍 2. Redis与其他数据库的对比 3 ...

  7. php redis type,redis中的几种常用基础对象介绍

    一:前言 redis中有几种常用的基础对象,如string.hash.list.set.zset等,下面我们就来介绍下他们的底层实现数据结构与常见应用场景和特点. 二:redisobject 源码位置 ...

  8. 当前没有可用的服务器_调研Redis高可用两种方案

    导读:Redis是被广泛使用的基础软件之一.对于工程师和,架构师,运维人员来说,了解Redis的高可用方案和背后的原理,是必备的基础知识.本文作者深入分析了Redis高可用的方方面面,并且做了有效总结 ...

  9. 简述python中的几种数据类型,简单介绍Python中的几种数据类型

    简单介绍Python中的几种数据类型 python 里面分为 基本数据类型 和 复合数据类型 基本数据类型包括:数值 字符串 布尔 和 none 复合数据类型包括:列表 元组 字典 和集合怎么算是深情 ...

最新文章

  1. 关于inline函数
  2. System.currentTimeMills()显示系统当前时间
  3. 怎么设置php的css颜色代码,CSS的文本字体颜色如何设置
  4. Java基础:int和Integer的区别
  5. 截取数组中的第i个元素,并返回截取后的结果
  6. 移动硬盘WINPE启动盘安装方法图解
  7. python连续小波变换_连续小波变换CWT(2)
  8. noip冲刺计划(no regrets,no fear)
  9. SLAM算法实习生-实习面试准备篇(1)
  10. PS批量给图片加水印
  11. Android应用开发--MP3音乐播放器界面设计(1)
  12. JS在数组对象中添加新字段
  13. ETL工具Informatica开发流程 综合应用 电信通话计费系统开发项目案例10
  14. Flutter开发(1)—— Dart vs Swift
  15. C语言求1000以内的所有水仙花数
  16. python文本文件读取失败_Python 读取文本文件编码错误解决方案(未知文本文件编码情况下解决方案)...
  17. 互联网黑话生成器(一款能熟练应用“赋能、抓手、闭环、沉淀、打通”等词汇的文章生成器)
  18. 如何修改计算机设备的登录名称
  19. 新手用降低转速来解决显卡风扇噪音大的问题(有图有真相)
  20. JavaScript:递归输出 输入的数(输入12345,输出12345)

热门文章

  1. 【Socket网络编程】4.tcp和udp的客户端和服务端收发流程
  2. c# partial class 的用法
  3. Java Web系列:Spring MVC基础
  4. 空间金字塔Spatial Pyramid的BOW和Pyramid HOG的多核
  5. 玩转CSDN博客之自定义博客栏目,根据需要定制栏目
  6. 程序员必知必会之maillist篇
  7. 深度学习(二十六)Network In Network学习笔记-ICLR 2014
  8. OpenCV提取图像颜色直方图
  9. 编程之美-判断两个链表是否相交方法整理
  10. C++命名空间namespace