Redis数据类型介绍和使用

数据类型

  1. String(字符串):最基本的数据类型,可以存储任何类型的数据,如文本、数字等。
  2. Hash(哈希):用于存储字段-值对的散列集合,适用于存储对象。
  3. List(列表):按照插入顺序存储的字符串元素集合,可以在列表的两端进行插入和删除操作。
  4. Set(集合):无序、唯一的字符串元素集合,支持元素的添加、删除和集合间的交集、并集和差集等操作。
  5. Sorted Set(有序集合):与集合类似,但每个元素关联一个分数,用于进行排序和按范围查询。
  6. Bitmaps(位图):由二进制位组成的数据结构,支持位级操作,如设置、清除和计数等。
  7. HyperLogLog(基数估计):用于估计集合的基数(不重复元素数量)的算法,占用固定空间,适用于大规模唯一计数的场景。
  8. Geospatial(地理空间索引):存储地理位置信息的数据类型,支持根据位置进行查询和计算。

其中前面5种是基本数据类型,后面3种是种特殊数据结构

key层级关系

Redis 本身没有提供层级结构,但可以在键的命名约定中使用分隔符或约定来模拟层级关系。

可以使用冒号(:)作为分隔符来表示键之间的层级关系。

例如:bpm中有分用户(user)和订单(order)模块,key中带:就可以表示层级,这样更容易划分业务模块

set bpm:user 用户模块 
set bpm:order 订单模块 

可以看到bpm下有user和order

img

String(字符串)

String的常见命令

  • set:添加或者修改已经存在的一个String类型的键值对
  • get:根据key获取String类型的value
  • mset:批量添加多个String类型的键值对
  • mget:根据多个key获取多个String类型的value
  • incr:让一个整型的key自增1
  • incrby:让一个整型的key自增并指定步长,例如:incrby num2让num值自增2INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • setnx:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • setex:添加一个String类型的键值对,并且指定有效期

命令演示

批量添加键值对
mset k1 v1 k2 v2 k3 v3 k4 v4

img

批量查看键值对
 mget k1 k2 k3 k4

img

数值递增
set age 18
incr age
get age

img

setnx
setnx name curry
setnx name curry

img

Hash(哈希)

Hash类似于到Java中的HashMap结构,value是一个无序字典。

Hash的常见命令

hset key field value:添加或者修改hash类型key的field的值

hget key field:获取一个hash类型key的field的值

hmset:批量添加多个hash类型key的field的值

hmget:批量获取多个hash类型key的field的值

hgetall:获取一个hash类型的key中的所有的field和value

hkeys:获取一个hash类型的key中的所有的field

hvals:获取一个hash类型的key中的所有的value

hincrby:让一个hash类型key的字段值自增并指定步长

hsetnx:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

命令演示

hset
hset userInfo name curry
hset userInfo age 35

img

hmset
hmset userInfo no 35 sex man
hget userInfo sex

img

hgetall
 hgetall userInfo

img

List(列表)

List类似于Java中的LinkedList,可以看做是一个双向链表结构

特征也与LinkedList类似:有序、元素可以重复、插入和删除快、查询速度一般。

List的常见命令

lpush key element…:向列表左侧插入一个或多个元素

lpop key:移除并返回列表左侧的第一个元素,没有则返回nil

rpush key element…:向列表右侧插入一个或多个元素

rpop key:移除并返回列表右侧的第一个元素

lrange key star end:返回一段角标范围为内的所有元素

blpop和brpop:与lpop和Rrpop类似,只不过在没有元素时等待指定时间,而不是直接返回nil

命令演示

rpush rpush

img

查看元素

img

lpop rpop

img

img

img

Set(集合)

Set类似于Java中的HashSet,可以看做是一个value为null的HashMap,因为也是一个hash

HashSet特征:无序、元素不可重复、查找快、支持交集、并集、差集等操作

Set的常见命令

sadd key member …:向set中添加一个或多个元素

srem key member…:移除set中的指定元素

scard key:返回set中元素的个数

sismember key member:判断一个元素是否存在于set中

smembers:获取set中的所有元素

sinter key1 key2…:求key1与key2的交集

sdiff key1 key2…:求key1与key2的差集

sunlon key1 key2.:求key1和key2的并集

命令演示

sadd

sadd sst a b c d e

img

smembers

smembers sst

img

scard

sadd sst a b g h
scard sst
smembers

img

可以发现重复的元素是插入不进去的

sinter

sadd ssp a b w x
smembers sst 
smembers ssp
sinter sst ssp 

img

Sorted Set(有序集合)

SortedSet与Java中的TreeSet有些类似,SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。

SortedSet特性:可排序、元素不重复、查询速度快

Sortedset的常见命令

zadd key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值

zrem key member:删除sorted set中的一个指定元素

zscore key member:获取sorted set中的指定元素的score值

zrank key member:获取sorted set 中的指定元素的排名

zcard key:获取sorted set中的元素个数

zcount key min max:统计score值在给定范围内的所有元素的个数

zincrby key increment member:让sorted set中的指定元素自增,步长为指定的increment值

zrange key min max:按照score排序后,获取指定排名范围内的元素

zrangebyscore key min max:按照score排序后,获取指定score范围内的元素ZDIFF、ZINTER、ZUNION:求差集、交集、并集

命令演示

zadd

zadd myset 30 curry  23 james  24 kobe  3 polo

img

排名默认从0开始升序排序

zcount key min max

# 查看1到24的人数
zcount myset 1 24

img

zrange key min max

# 查找1到30的人
zrange myset 1 30 

img

位图(Bitmap)

位图(Bitmap)是一种数据结构,用于表示和操作位(0 或 1)的集合,通常使用连续的比特位(bit)来存储。在 Redis 中,位图是一种特殊的数据类型,可以用于存储和操作位级别的数据。

位图主要由 SETBIT、GETBIT、BITCOUNT 和 BITOP 等命令来进行操作。

位图的常用命令

  • SETBIT key offset value:设置位图中指定偏移量上的位值。offset 表示位图中的比特位偏移量,value 可以是 0 或 1。
  • GETBIT key offset:获取位图中指定偏移量上的位值。
  • BITCOUNT key [start end]:计算位图中指定范围内的比特位值为 1 的数量。可选参数 start 和 end 用于指定范围,如果不指定,则计算整个位图的数量。
  • BITOP operation destkey key [key …]:对一个或多个位图执行逻辑操作(如 AND、OR、XOR、NOT),并将结果存储在目标位图 destkey 中。

位图常见的应用场景

  1. 用户签到记录:
    通过位图可以方便地记录用户的签到情况。以每天一个比特位的方式,创建一个位图来表示用户是否签到。每个用户对应一个位图,其中每个比特位表示一天的签到状态。通过 SETBIT 命令设置对应日期的比特位为 1,表示用户签到;通过 GETBIT 命令检查比特位的值,可以查询用户是否签到。
  2. 在线用户统计:
    位图可以用于记录用户的在线状态。以每个用户一个比特位的方式,创建一个位图来表示用户是否在线。每个比特位表示一个用户的在线状态,比如 1 表示在线,0 表示离线。通过 SETBIT 命令设置对应用户的比特位为 1,表示用户在线;通过 GETBIT 命令检查比特位的值,可以查询用户的在线状态。使用 BITCOUNT 命令可以计算在线用户的数量。
  3. 布隆过滤器:
    布隆过滤器是一种高效的概率数据结构,用于判断一个元素是否属于某个集合。位图可以用于实现布隆过滤器。通过多个不同的位偏移量,将元素映射到位图中的多个比特位上。使用 SETBIT 命令将对应的比特位设置为 1,表示元素存在;使用 GETBIT 命令检查比特位的值,可以判断元素是否可能存在于集合中。

命令演示

SETBIT key offset value

SETBIT 命令用于设置位图(bitmap)中指定偏移量上的位值。它可以将位图中的指定位置的比特位设置为 0 或 1。

命令的基本语法如下:

SETBIT key offset value

其中:

  • key 是位图的键名。
  • offset 是比特位在位图中的偏移量。
  • value 是要设置的比特位的值,可以是 0 或 1。
SETBIT mybitmap 0 1
SETBIT mybitmap 2 1

在上面的示例中,我们首先使用 SETBIT 命令将位图 mybitmap 中偏移量为 0 的比特位设置为 1。然后,我们将偏移量为 2 的比特位也设置为 1。

请注意,位图中的比特位是按照连续的偏移量存储的,偏移量从左到右递增。因此,可以通过不同的偏移量来表示不同的比特位。

BITCOUNT key [start end]

命令的基本语法如下:

BITCOUNT key [start end]
  • key 是位图的键名。
  • start 和 end 是可选参数,用于指定要计算的比特位范围。如果不指定 start 和 end,则计算整个位图的数量。

以下是一个使用示例:

BITCOUNT mybitmap
BITCOUNT mybitmap 0 5

在上面的示例中,我们首先使用 BITCOUNT 命令计算位图 mybitmap 中所有比特位值为 1 的数量。接着,我们使用 BITCOUNT 命令计算位图中从偏移量 0 到偏移量 5 的比特位值为 1 的数量。

执行上述命令后,将返回对应的比特位值为 1 的数量。

请注意,BITCOUNT 命令是按照字节(byte)进行计数的,一个字节共包含 8 个比特位。如果指定的范围超出了位图的实际范围,命令会自动截断到位图的边

HyperLogLog(基数估计)

HyperLogLog(超级日志日志)是一种概率型数据结构,用于估计集合中不重复元素的基数(cardinality)。它的设计目标是使用固定的空间来估计大规模数据集的基数,同时提供很高的准确性和较小的内存占用。

在 Redis 中,HyperLogLog 是一种数据类型,提供了用于操作和估计基数的命令。

HyperLogLog常见命令

  • PFADD key element [element …]:将一个或多个元素添加到 HyperLogLog 中。
  • PFCOUNT key [key …]:估计指定 HyperLogLog 的基数。
  • PFMERGE destkey sourcekey [sourcekey …]:合并多个 HyperLogLog,将结果存储在目标 HyperLogLog destkey 中。

HyperLogLog 使用一些随机算法和哈希函数来实现基数估计。通过添加元素到 HyperLogLog 中,它会根据元素的哈希值来更新内部的计数器。估计基数时,HyperLogLog 会统计计数器中为零的比特位的数量,并根据这个数量来估算基数。

HyperLogLog 的估计结果是近似值,但在很多情况下具有很高的准确度。它可以用于统计网站的独立访客数量、统计广告点击数量、统计活跃用户数等场景,特别适用于需要处理大规模数据集并且对内存占用有限制的情况。

需要注意的是,HyperLogLog 在 Redis 2.8 及以上版本中可用。

HyperLogLog常见的应用场景

  1. 统计独立访客数量:
    在网站分析中,统计独立访客数量是一个常见的需求。使用 HyperLogLog 可以有效地估计独立访客的数量。每当有用户访问网站时,将用户的唯一标识(如用户ID或IP地址)添加到 HyperLogLog 中,然后使用 PFCOUNT 命令估计 HyperLogLog 的基数,即独立访客数量。
  2. 统计在线用户数:
    HyperLogLog 也可用于估计在线用户的数量。每当用户登录或注销时,将用户的唯一标识添加到 HyperLogLog 中。通过使用 PFCOUNT 命令估计 HyperLogLog 的基数,可以实时获取在线用户的近似数量。
  3. 统计广告点击数量:
    在广告分析中,统计广告点击数量是重要的指标之一。使用 HyperLogLog 可以高效地估计广告的独立点击数量。每当广告被点击时,将点击事件的唯一标识添加到 HyperLogLog 中。通过使用 PFCOUNT 命令估计 HyperLogLog 的基数,可以得到广告的近似点击数量。
  4. 统计社交网络中的活跃用户数:
    HyperLogLog 可以用于估计社交网络中的活跃用户数量。每当用户在社交网络上进行活动(如发表帖子、发表评论、点赞等),将用户的唯一标识添加到 HyperLogLog 中。通过使用 PFCOUNT 命令估计 HyperLogLog 的基数,可以获得社交网络中的活跃用户数量的近似值

Geospatial(地理空间索引)

地理空间索引(Geospatial indexing)是一种用于存储和查询地理空间数据的技术。它允许我们在地理坐标系中表示和操作数据,如点、线、多边形等,并提供高效的地理空间查询功能。

在地理空间索引中,数据通常以经度(Longitude)和纬度(Latitude)的坐标形式表示。常见的地理空间索引算法包括 R-tree、Quadtree 和 Geohash 等。

从 Redis 3.2 版本开始提供了地理空间索引的支持。Redis 使用了一种称为 Geohash 的编码方案来存储和索引地理空间数据。

Geospatial常见命令

  • GEOADD key longitude latitude member [longitude latitude member …]:将地理空间位置添加到指定的键中。
  • GEOPOS key member [member …]:获取指定地理空间位置的经纬度坐标。
  • GEODIST key member1 member2 [unit]:计算两个地理空间位置之间的距离。
  • GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]:根据指定的中心点和半径范围,获取符合条件的地理空间位置。
  • GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]:根据指定的中心点成员和半径范围,获取符合条件的地理空间位置。

通过这些命令,你可以将地理空间位置存储在 Redis 中,并执行各种地理空间查询操作,如查找附近的位置、计算距离、获取坐标等。

地理空间索引在很多应用场景中非常有用,如地理定位服务、附近的人搜索、地点推荐等。它可以帮助你更高效地存储和查询地理空间数据,并进行相关的空间分析操作。

Geospatial常见的实际应用

  1. 餐厅和商店定位:
    许多用户在寻找附近的餐厅、商店或服务时会使用地理定位功能。通过将餐厅或商店的位置信息存储在地理空间索引中,可以根据用户的当前位置提供附近的推荐结果。这使得用户能够快速找到他们所需的服务,并根据距离、评级等因素进行选择。
  2. 出行和导航应用:
    地理空间索引在出行和导航应用中起着关键作用。通过使用地理空间索引,可以查找附近的公交车站、地铁站、加油站等设施,并提供最佳的路线规划。这为用户提供了方便的导航和实时交通信息,帮助他们在城市中更轻松地出行。
  3. 物流和送货跟踪:
    物流和送货服务需要实时跟踪和管理车辆的位置。地理空间索引可以用于存储和查询车辆的位置信息,并根据需求进行最佳路线规划和调度。这样,物流公司可以更好地管理其车队,并提供准确的送货时间估计给客户。
  4. 社交媒体和位置分享:
    地理空间索引在社交媒体应用中广泛应用。用户可以共享他们的位置信息,并查找附近的朋友、活动或感兴趣的地点。这为用户提供了更多与位置相关的社交互动,例如找到附近的朋友、参加活动或发现新的地点。
  5. 地理数据分析和可视化:
    地理空间索引可用于地理数据分析和可视化。通过存储地理数据并使用地理空间索引,可以进行热点区域分析、地理相关性分析等。这对于城市规划、市场分析、地理信息系统等领域非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鱼哥赠书活动第14期:看完这本《数字化运维》掌握数字化运维方法,构建数字化运维体系

鱼哥赠书活动第14期:看完这本《数字化运维》掌握数字化运维方法,构建数字化运维体系 主要内容:读者对象:赠书抽奖规则:往期赠书福利: 数字化转型已经成为大势所趋,各行各业正朝着数字化方向转型&#xff0c…

如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问

前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问,希望大家能觉得实用! 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&am…

【数据结构】链表习题之环形链表的约瑟夫问题

👑个人主页:啊Q闻 🎇收录专栏:《数据结构》 🎉道阻且长,行则将至 前言 今天这道题目时牛客上的题目,名为环形链表的约瑟夫问题,很有趣的的一道题目 环形链表的约瑟…

申请免费域名证书

目录 背景: 域名证书是什么: 域名证书有哪些: 部署域名证书有什么用: 免费的域名证书在哪里申请: 背景: 域名是一个IP地址上的“面具” 。一个域名的目的是便于记忆和沟通的一组服务器的地址(网站&…

OpenHarmony开发知识点记录之ABI

OpenHarmony系统支持丰富的设备形态,支持多种架构指令集,支持多种操作系统内核;为了应用在各种OpenHarmony设备上的兼容性,本文定义了"OHOS" ABI(Application Binary Interface)的基础标准&#…

路由协议RIP(悄悄话)

实验要求:总部和两个分支,拓扑如下图,利用rip路由协议使得各个pc设备可以通信 RIP理解:相邻路由定期交换内部路由协议,最后达到稳定状态,如果发生网络发生变化,重复交换路由步骤直到稳定状态&a…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年,其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年,LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今,LinkedIn 在全球运营,拥有超过 3.5 亿会…

研华工控机610L学习笔记2:visualstudio与第一个C#程序

今日继续学习工控机 C# 编程相关知识: 这篇结束后我将先进行一段时间的C#的学习研究,并写一些C#的笔记 后续再更新工控机编程设计相关 目录 1、安装visualstudio: 2、创建第一个C#程序: 3、寻找C#解决方案源文件: …

梦幻西游端游全新升级瀚海游戏玩法 一单35 小白一手机没脑子实际操作 日入3000

大家好,很多人都听过抖音游戏外国投资者方案,但是大部分人做视频,收益都非常低。 今天给带来的项目是“梦幻西游端游全新升级瀚海游戏玩法,一单35,轻松日入3000”,这个项目不用去被割韭菜,我自…

IDEA | 资源文件中文乱码问题解决

问题 IDEA打开资源文件,显示乱码问题。 解决方案 1、电脑是mac,点击IDEA->【Preferences】->【Editor】->【File Encodings】 2、选择【Properties Files】中的UTF-8,并勾选Transparent native-to-ascii conversion。 3、最后点击…

P5727 【深基5.例3】冰雹猜想

【深基5.例3】冰雹猜想 - 洛谷https://www.luogu.com.cn/problem/P5727这种方法比较繁琐,预先定义固定的数组长度,很局限: public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.next…

图神经网络和图卷积网络

图神经网络要点 1. GNNs adopt a “graph-in, graph-out” architecture meaning that these model types accept a graph as input, with information loaded into its nodes, edges and global-context, and progressively transform these embeddings, without changing th…

黑马头条知识点总结

黑马头条知识点总结 文章目录 黑马头条知识点总结前言一、使用的所有技术栈二、初始化项目 2.1加密盐登录2.2网关2.3配置nginx三。文章通过freemarker生成html文件存入minio中四。内容安全阿里云接口5.使用延迟任务发布审核文章 4.9.3)redis分布式锁在工具类CacheService中添加…

HWOD:名字的漂亮度

一、题目 描述 给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的漂亮度是其所有字母漂亮度的总和 每个字母都有一个漂亮度,范围在1到26之间。没有任何两个不同字母拥有相同的漂亮度。字母忽略大小写。 给出多个字符串&#xff…

【快速解决】解决谷歌自动更新的问题,禁止谷歌自动更新,如何防止chrome自动升级 chrome浏览器禁止自动升级设置方法

目录 问题描述 解决方法 1、搜索栏搜索控制面板 2、搜索:服务 ​编辑 3、点击Windows工具 4、点击服务 ​5、禁止谷歌更新 问题描述 由于我现在需要装一个谷歌的驱动系统,但是目前的谷歌驱动系统的版本都太旧了,谷歌自身的版本又太新了…

不要盲目开抖店,这才是开店的正确流程,2024全新版教程

我是王路飞。 抖音小店和视频号小店,我更建议没有经验的新手去做抖音小店。 虽然现在抖音小店不属于是一个蓝海项目了,但它依旧是我们普通人借助抖音流量变现非常重要的一个渠道,甚至没有之一。 至于视频号小店,可以说是当下最…

如何在群晖NAS中创建FTP公网地址实现远程上传下载本地文件

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分…

全面预警 快速响应!北斗短报文+4G应急广播系统助力防灾减灾救灾

近年来,自然灾害频发,预警信息落地难,群众感知不及时,容易发生人员伤亡。 灾区交通、电力、通信中断,其他媒介无法发挥作用,救援人员经常会面临着缺乏及时有效的通信手段而造成救援延迟的困境,…

OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:实战|OpenCV实时弯道检测(详细步骤源码) 0 导读 本文主要介绍如何使用 Python 和 OpenCV实现一个实时曲线道路检测系统。 1 背景…

Collection与数据结构 数据结构预备知识(一) :集合框架与时间空间复杂度

1.集合框架 1.1 什么是集合框架 Java集合框架,又被称为容器,是定义在java.util包下的一组接口和接口实现的一些类.其主要的表现就是把一些数据放入这些容器中,对数据进行便捷的存储,检索,管理.集合框架底层实现原理其实就是各种数据结构的实现方法,所以在以后的学习中,我们会…