当前位置:   article > 正文

深入探究 Redis:快速高效的键值存储数据库(一文全面快速上手Redis)_键值数据库

键值数据库

Redis(Remote Dictionary Server)是一个开源的内存数据库,它提供了一个高效的键值存储系统,并支持多种数据结构,如字符串、列表、集合、哈希表等。由意大利程序员 Salvatore Sanfilippo 开发并于 2009 年首次发布,Redis 迅速成为业界热门的 NoSQL 数据库之一。作为一款功能丰富且性能出色的数据库,Redis 在许多方面都表现出色。首先,Redis 将数据存储在内存中,因此具有极快的读写速度,适合用于需要快速响应的场景;其次,Redis 支持持久化功能,可以将数据定期保存到硬盘上,保证数据的安全性;此外,Redis 还提供了丰富的数据结构和强大的操作命令,使得开发者能够轻松实现各种复杂的功能。

除此之外,Redis 还被广泛应用于缓存、会话存储、消息队列等场景,在互联网行业得到了广泛的应用。其简单易用的特点,使得开发者可以快速上手,提高开发效率。

在本篇博客中,我们将深入探讨 Redis 的原理、常用数据结构、操作命令以及一些典型的应用场景,希望能够帮助读者更好地了解和应用 Redis,提升系统性能和开发效率.

Redis的特性:

高性能, 高可用,高拓展

Redis为什么性能高:

Redis的底层其实就是一张全局哈希表,当它存储数据的时候,他会把数据存储到哈希表中

1.存储过程:

拿到key,计算出哈希值,然后将这个哈希值 模 数组的长度, 得到的结果就是存储元素的下标位置。

这里很多小伙伴不太清楚哈希表的构造,我们直接上图,简单明了:

哈希表底层是一个数组,每个数组的下标处,有一个链表,比如说我们计算出的下标值为:4,那么就会将数据存储到 4下标处的链表中, get数据的时候 依然是先将key计算出哈希值,然后模数组的长度得到下标位置,然后找到相同的key,得到value值。

很多伙伴一看,是不是和Java的HashMap底层原理非常像呢。

Redis数据结构:

String类型:

应用场景:

String类型是我们最常用的,他其实什么都可以存。比如说存一个简单的字符串,存一个数字,存一个对象(将对象序列化),存一个集合(将集合序列化)等等

上图就是最简单的操作命令,存储一个key为 chenxiaoxi value 为22。 这里我们拓展一下:

上图命令是 在redis中,对指定的key进行原子递增操作。 好 这里有个问题,我们这个数据类型不是字符串吗,为什么还能自增呢,我们做一个实验:

嗯? 我们新设置了一个 test 的key 的value 是23b 我们再进行递增的时候报错了,但是我们查看 两个key的值的类型都是String类型哇。

其实,我们 chenxiaoxi key的value值其实不是string类型 。我给大家演示一下:

我们通过 object encoding 这个命令 可以查看到 value值的底层数据结构 ,我们发现他是int类型,而test的value的底层类型结构才是String类型

记住: Redis在存储String类型的时候,会先尝试将value值进行强转,强转为,如果成功,那么他存储结构就是int类型,如果失败,它的底层结构就是string类型,但是对于我们日常开发来说,我们直接认为他是string类型就可以了,注意避免给String类型进行运算操作即可

list类型:

list类型为链表,并且是一个双向链表,可以从头部插入,也可以从尾部插入,读取的时候也可以选择从哪边读。

上图命令中 我使用了分别从头部插入命令 123 与从尾部插入命令 321 ,但是我们读取这两个key的所有数据时,他们的值 都是321 。

上图命令中,我使用了从头部读取一个数据以及从纬度读取数据,我们发现读取完毕之后,原list中读取的值会被删掉。

基于这种特性,我们就可以在很多场景下使用list类型:

  1. 消息队列

:List 可以用作简单的消息队列,通过 LPUSH 命令向队列头部添加消息,通过 RPOP 命令从队列尾部取出消息,实现先进先出 (FIFO) 的消息处理。

  1. 最新消息列表

:将最新的消息或事件存储在 List 中,通过 LRANGE 命令获取最新的消息列表,比如用于实时更新的动态消息流。

  1. 用户行为日志

:可以将用户的行为日志按时间顺序存储在 List 中,便于后续分析和统计用户活动。

  1. 任务队列

:将需要异步处理的任务存储在 List 中,然后由消费者程序从 List 中取出任务进行处理。

  1. 轮询任务

:利用 List 实现轮询机制,比如循环播放广告、轮询服务器列表等。

set类型:

Set类型就是无序集合,我们直接上命令

我存储了一个Set类型,注意看清我的存储的值的顺序,我们再次查询集合所有数据的时候,会发现查出来的集合顺序和我们存的时候的顺序不是一样的,证明了它的无序性

上面的命令我继续给Set集合中添加 chenxiaoxi字段,但是我们查询发现,他还是只有一个chenxiaoxi,因为Set集合还是不重复的。和我们java中的set集合特性是一样的。

其实很多商城业务会有抽奖需求,如果我们用日常业务来做,一般比较麻烦,但是我们用redis的set集合会非常的简单,三行命令搞定:

第一行命令,把抽奖的人放到redis中,使用set类型,第二行查询所有参与抽奖的人,第三局直接 SRANDMEMBER key count

随机抽取 coute 个用户 。 这样就直接实现了抽奖,那么如果说抽到的人就没有再次抽奖的资格,我们还有个命令

spop key count : 随机取出count个用户,并且删除。那么这样不就实现了中奖的人没有资格再抽了吗。

使用redis实现这个需求是非常非常简单的

Set类型还可以根据集合的运算实现以下业务场景:

  1. 社交网络
    • 交集:在社交网络中,可以使用交集操作来找到共同的好友或兴趣相同的用户。例如,查找两个用户共同的好友列表。
    • 并集:使用并集操作可以将两个用户的关注列表合并,从而获取他们的整体关注内容。
  1. 广告定向投放
    • 交集:广告定向投放可以利用用户的属性集合与广告主的目标人群进行交集操作,以确定最具潜在影响力的广告受众群体。
    • 并集:将不同广告受众群体的集合进行并集操作,以扩大广告覆盖范围。
  1. 电商推荐系统
    • 交集:利用用户的历史购买记录与商品标签进行交集操作,找到符合用户兴趣的商品。
    • 并集:将不同推荐策略得到的商品集合进行并集操作,提供更加综合的推荐结果。
  1. 数据分析
    • 交集:在数据分析中,可以使用交集操作来找到满足多个条件的数据子集,以便进行进一步的分析和处理。
    • 并集:将来自不同数据源的数据进行并集操作,以整合数据并进行综合分析。
Zset类型:

Zset类型就是有序的集合,它的特性是有序且不重复

上图是添加Zset集合的命令,每次添加元素的时候必须带上对应的分数,Zset是用分数来判断元素顺序

上图是查询Zset集合数据,zrange是从小到大排序, zrevrange是从大到小排序

应用场景:

  1. 排行榜

:可以使用 Zset 来实现各种类型的排行榜,比如游戏中的玩家积分排行榜、音乐平台中的歌曲播放排行榜等。Zset 的分数可以表示用户的积分或者歌曲的播放次数,成员则是对应的用户或歌曲。

  1. 时间线

:社交网络中用户的时间线(Timeline)可以使用 Zset 来实现,分数可以表示发布时间戳,成员则是对应的动态内容。

  1. 范围查找

:由于 Zset 中的成员是有序的,可以方便地进行范围查找操作。例如,可以用来实现按照距离排序的地理位置索引,或者按照价格范围查找商品等功能。

  1. 任务调度

:Zset 中的分数可以表示任务的执行时间,成员则是具体的任务内容。通过定时轮询 Zset,可以实现简单的任务调度系统。

  1. 统计与计数

:Zset 可以用来统计某个范围内的成员数量,或者实现基于分数的统计功能,比如统计某个时间段内的活跃用户数。

  1. 优先级队列

:Zset 可以用作优先级队列,分数可以表示任务的优先级,成员则是具体的任务。这样可以实现按照优先级顺序处理任务的功能。

hash类型:

Redis的Hash数据类型是一种存储键值对的数据结构。它适用于存储多个字段和值之间的映射关系,可以方便地存储和访问复杂的数据结构

特性:

  • 可以存储大量的键值对。
  • Hash的字段是唯一的,不允许重复。
  • Hash的字段和值都是字符串类型。
  • 每个Hash可以存储多个字段和值。

简单来说,可以把hash数据认为是java里面的对象,key就是对象的属性,value就是属性的值。

        我们创建一个名为chenxiaoxi的对象

同时设置了对象的属性与值,其实就是设定了hash数据类型的key和value

hgetall key : 获取hash类型的所有字段和值

hget key filed : 获取hash数据指定字段的值

hset key filed value : 设置hash类型数据指定字段的value值,如果filed已经存在,那么就会覆盖 。

基于hash数据结构的特殊性,我们可以用于以下业务场景:

  • 用户信息存储:可以将用户的各种信息(如用户名、邮箱、密码、年龄等)存储在一个Hash中,便于管理和快速查找。
  • 缓存对象属性:在缓存中存储对象的各个属性,比如商品信息(名称、价格、库存等)、文章信息(标题、作者、内容等)等。
  • 计数器:可以使用Hash来实现简单的计数器功能,比如统计网站访问次数、用户行为次数等。
  • 购物车:将用户的购物车信息(商品ID及对应数量)存储在Hash中,方便管理和操作。
  • 实时排行榜:将用户的得分或者其他指标作为字段值存储在Hash中,可以快速获取排行榜信息。
  • 配置信息存储:将系统配置信息(如数据库连接信息、缓存配置等)以Hash形式存储,方便动态修改和读取。
  • 任务队列:可以使用Hash来存储任务信息,比如任务类型、参数等,实现简单的任务队列功能。

在某些业务场景下使用hash可以直接修改对象的一个属性,便于操作,相比较使用字符串类型存储效率高很多,但也不是绝对的。

我们在使用的时候需要结合业务场景来做最优选择

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/938379
推荐阅读
相关标签
  

闽ICP备14008679号