【Redis经典面试题三】Redis有哪些数据类型?

server/2024/12/21 23:22:06/

目录

string-toc" style="margin-left:0px;">一、string

1.1 基本命令

1.2 使用场景

场景一:微博粉丝数

场景二:存json串

二、hash

2.1 基本命令

2.2 使用场景

三、list

3.1 基本命令

3.2 使用场景

场景一:微博粉丝关注列表

场景二:存放集群服务器日志

四、set

4.1 基本命令

4.2 使用场景

场景一:存储中奖用户id

场景二:用户角色权限

五、sorted_set

5.1 基本命令

5.2 使用场景

场景一:积分排行榜

场景二:任务推送

六、GEO

6.1 基本命令

6.2 使用场景

bitmap-toc" style="margin-left:0px;">七、bitmap

7.1 基本命令

7.2 使用场景

八、HyperLogLog


Redis 中支持了多种数据类型,其中比较常用的有五种:

  1. 字符串(String)
  2. 哈希(Hash)
  3. 列表(List)
  4. 集合(Set)
  5. 有序集合(Sorted Set)

另外,Redis 中还支持一些高级的数据类型,如:Streams、Bitmap、GEO 以及 HyperLogLog。

string">一、string

1.1 基本命令

(1)添加/修改数据

set key value

(2)获取数据

get key

(3)删除数据

del key

(4)添加/修改多个数据

mset key1 value1 key2 value2...

(5)获取多个数据

mget key1 key2...

(6)获取数据字符个数(字符串长度)

strlen key

(7)追加信息到原始信息后部(如果原始信息存在就追加,否则新建)

append key value

(8)自增

incr key
incrby key increment
incrbyfloat key increment

(9)自减

decr key
decrby key increment

(10)设置过期时间

setex key seconds value

1.2 使用场景

场景一:微博粉丝数

我们都知道大V的粉丝数都是实时更新的,一会涨一个,一会掉一个。那么如果将粉丝数存在mysql中,频繁的加减很耗费性能。如果将粉丝数放入redis中,极大的缓解这种情况。

场景二:存json串

有时我们可以将用户对象序列化为json字符串,然后存到Redis中。

二、hash

2.1 基本命令

(1)添加/修改数据

hset key field value
hmset key field1 value1 [field2 value2]...

(2)获取数据

hget key field
hmget key field1 [field2]...
hgetall key

(3)删除数据

hdel key field1 [field2]

(4)获取哈希表中字段的数量(获取某key下有多少个field)

hlen key

(5)获取哈希表中是否存在指定的字段

hexists key field

(6)获取哈希表中所有字段名或字段值

hkeys key
hvals key

(7)数值增减操作

hincrby key field increment
hincrbyfloat key field increment

注意:hash没有减的操作,但我们可以使用负数来进行减的操作。

2.2 使用场景

存用户对象数据,每个用户属性(名字、年龄、生日、性别)都是一个field。

String类型存储json字符串用来存对象:适合查询多,不适合修改数据。

hash类型存储对象:适合经常修改数据。

三、list

数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。

需要的存储结构:一个存储空间保存多个数据,且通过数据可以提现进入顺序。

list类型:保存多个数据。底层使用双向链表存储结构实现。

3.1 基本命令

(1)添加/修改数据

lpush key value1 [value2]...    //向左添加
rpush key value1 [value2]...	//向右添加

(2)获取数据

lrange key start stop
lindex key index			//根据索引查询值
llen key			//返回list的长度

(3)获取并移除数据

lpop key
rpop key

(4)规定时间内获取并移除数据(阻塞)

blpop key1 [key2] timeout
brpop key1 [key2] timeout

用法:多个客户端时,客户端B使用blpop命令在时间内等待着获取,这时客户端A如果push进了数据,则客户端B直接获取。反之如果在timeout时间内,客户端A一值没有push进数据,那客户端B一只阻塞(等待)着。

3.2 使用场景

场景一:微博粉丝关注列表

在 Twitter、新浪微博、腾讯微博等社交平台中,个人用户的关注列表通常需要按照用户关注的顺序进行展示。这意味着用户最早关注的人会出现在列表的顶部。

场景二:存放集群服务器日志

比如,有4小服务器都有自己的日志,这些服务器是综合在一块工作的,结果现在出问题了,运维要看看服务器的操作日志,那总不能让运维看4份日志吧,挨个时间对比找出问题。那么解决办法就是这4台服务器的日志都往redis里存,使用list类型。这样最新产生的日志一定会在list的最开头(保证是有序的),这样运维就可以看一个redis就能轻松找出问题。

四、set

新的存储需求:存储大量数据,在查询方面提供更高的效率。

需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询。

set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的。

4.1 基本命令

(1)添加数据

sadd key member1 [member2]

(2)获取全部数据

smembers key

(3)删除数据

srem key member1 [member2]

(4)获取集合数据总量

scard key

(5)判断集合中是否包含指定数据

sismember key member

(6)求两个集合的交、并、差集

sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]

4.2 使用场景

场景一:存储中奖用户id

set结构可以用来存储在某活动中中奖的用户ID,因为有去重功能,可以保证同一个用户不会中奖两次。

场景二:用户角色权限

set结构可以用来操作用户、角色、权限的关系。

五、sorted_set

5.1 基本命令

(1)添加数据

zadd key score1 member1 [score2 member2]

(2)获取全部数据

zrange key start stop [withscores]    //按分数从小到大排。withscores代表将权重分数也一起查出来
zrevrange key start stop [withscores]  //按分数从大到小排

(3)删除数据

zrem key member [member...]

(4)按条件获取数据

zrangebyscore key min max [withscores] [limit]
zrevrangebyscore key max min [withscores]

(5)按条件删除数据

zremrangebyrank key start stop
zremrangebyscore key min max

(6)获取集合数据总量

zcard key
zcount key min max

5.2 使用场景

场景一:积分排行榜

按积分排序,用作学生成绩排行榜也可以。

场景二:任务推送

做平台开发时,有个功能是任务处理,首先给你推送的是权重比较高的任务等待你处理。处理完调用zrem命令将其移除。

六、GEO

GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。

6.1 基本命令

GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)

GEODIST:计算指定的两个点之间的距离并返回

GEOHASH:将指定member的坐标转为hash字符串形式并返回

GEOPOS:返回指定member的坐标

GEORADIUS:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。6.以后已废弃

GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2.新功能

GEOSEARCHSTORE:与GEOSEARCH功能一致,不过可以把结果存储到一个指定的key。 6.2.新功能

6.2 使用场景

比如订餐软件,当我们点击美食之后,会出现一系列的商家,商家中可以按照多种排序方式,我们此时关注的是距离,这个地方就需要使用到我们的GEO。

bitmap">七、bitmap

在Redis中,Bitmap(位图)是一种特殊的数据结构,它不是一个独立的数据类型,而是基于String类型实现的。Bitmap主要用于存储大量二进制位(0或1)的数据,这些位可以代表不同的状态或标志。

7.1 基本命令

SETBIT:向指定位置(offset)存入一个0或1

GETBIT :获取指定位置(offset)的bit值

BITCOUNT :统计BitMap中值为1的bit位的数量

BITFIELD :操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值

BITFIELD_RO :获取BitMap中bit数组,并以十进制形式返回

BITOP :将多个BitMap的结果做位运算(与 、或、异或)

BITPOS :查找bit数组中指定范围内第一个0或1出现的位置

7.2 使用场景

可以用来实现签到功能,我们可以把年和月作为bitMap的key,然后保存到一个bitMap中,每次签到就到对应的位上把数字从0变成1,只要对应是1,就表明说明这一天已经签到了,反之则没有签到。

八、HyperLogLog

Redis 在 2.8.9 版本添加了 HyperLogLog 结构(简介HLL),用于做基数统计,其使用算法HyperLogLog使得在数量级特别大的情况下占用空间很小。说白了就是在大数据量级的情况下能够在很小的空间中进行元素去重统计。Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差


http://www.ppmy.cn/server/152075.html

相关文章

Go 语言常量

Go 语言常量 概述 Go 语言中的常量是表示固定值的标识符,其值在程序运行期间不会改变。常量可以是数值、布尔值、字符串或枚举类型。在 Go 中,常量的声明和赋值是在编译时进行的,因此它们必须是编译器能够直接计算出的常量表达式。 声明常…

利器 | AppCrawler 自动遍历测试工具实践(一)

本文为霍格沃兹测试学院学院学员课程学习笔记,系统学习交流文末加群。 AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个项目,通过名字我们大概也能猜出个方向,Crawler 是爬虫的意思,App 的爬虫,遍历 App : 官方 G…

45.跳跃游戏Ⅱ python

跳跃游戏Ⅱ 题目题目描述示例 1:示例 2:提示: 题解解决方案:贪心算法提交结果 题目 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处&…

区块链与比特币:技术革命的双子星

区块链与比特币:技术革命的双子星 引言 自2008年中本聪(Satoshi Nakamoto)提出比特币的概念以来,区块链技术和数字货币已经改变了我们对金融系统、网络安全和分布式计算的理解。本文将深入探讨区块链技术及其最著名的应用——比…

WebSocket vs SSE:实时通信技术的对比与选择

一、前言 Hello,欢迎来到流穿的AI探索之路系列专栏,作为一名AI应用工程师,我会在这儿更新一些前沿技术,欢迎关注哦。 这个问题也是前不久面试时被提问的,让我对比WebSocket和SSE,说说AI产品下处理SSE请求的方法。挺有…

模型优化和迁移学习

数据获取方法 三大要素:数据、算法(神经网络)、算力 数据集分类 分类数据:图像分类,一般以目录的形式分开标注数据:目标检测和图像分割,是有标注数据的 开源数据集 免费,成本低…

ARINC429和CAN

ARINC-429:一种用于航空电子设备之间数据通信的标准格式,数据格式为:数据速率、字长和校验方式。 数据速率:ARINC429传输速率通常为12.5Kbps或100Kbps; 字长:ARINC429数据长为32位,分为五个部分&#xff1a…

基于STM32的房间湿度控制系统设计与实现(论文+源码)

1.系统总体设计 根据系统的实际应用需求,从硬件电路以及软件程序两个方面展开房间湿度控制系统设计。如图所示为系统的整体架构图。系统采用单片机作为控制器,在传感器检测模块中包括DHT11温湿度检测、有害气体浓度检测,在系统执行模块包括加…