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

embedded/2024/12/25 21:05:16/

目录

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/embedded/148409.html

相关文章

命令行音乐库管理工具Beets

什么是 Beets ? Beets 是一个音乐库管理系统和音乐文件元数据标签编辑器。它使用 MusicBrainz 数据库来自动填充音乐文件的元数据信息,并且可以通过插件系统来增加各种额外功能,比如自动下载专辑封面,歌词等。其目的是使您的音乐收…

情报信息收集能力

红队专题-Web渗透之资产思路框架知识整理 钓鱼社工 钓鱼自动化zip域名ARP欺骗快捷方式ToolsburpsuiteApp 抓包ffuf模糊测试QingScanWiresharkCloudCFEn-Decodeffffffff0xInfodirbdirmapdirsearchdnsenum使用测试常规使用使用字典文件进行dns查询子域名暴力查询部分C类IP地址IP块…

DFS入门

目录 概念应用场景基本模型例题 概念 这是一种用于遍历或搜索图(包括树,树是一种特殊的图)的算法。它从起始顶点开始,沿着一条路径尽可能深地探索下去,直到无法继续,然后回溯到前一步,继续探索其…

【恶意软件检测】一种基于API语义提取的Android恶意软件检测方法(期刊等级:CCF-B、Q2)

一种基于API语义提取的Android恶意软件检测方法 A novel Android malware detection method with API semantics extraction 摘要 由于Android框架和恶意软件的持续演变,使用过时应用程序训练的传统恶意软件检测方法在有效识别复杂演化的恶意软件方面已显不足。为…

【js】URL处理

背景 有这样子一个url,search部分的value可能包含空格,也可能是一个对象,如何正确解析这样子的url呢? search如下,?accountId144115188076933939&accountNamemock name&xxx {"accountId": "…

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成:分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

MySQL怎么导出数据库数据

MySQL导出数据库数据 主要有两种方式: 1.直接在控制台中使用以下命令 在InnoDB我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份, (基于快照实现) mysqldump --single-transaction -h localhost -uroot -p123456 数据库名 > …

ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。

在 Web 开发中,GET 和 POST 是两种常见的 HTTP 请求方法,它们有一些显著的区别。此外,datatype 参数在 jQuery 的 ajax() 请求中指定了预期的响应数据类型。接下来,我会详细解释这些问题。 1. GET 和 POST 请求的区别 GET 请求 和…