赞
踩
Redis(Remote Dictionary Server)是一个开源的内存数据库,它提供了一个高效的键值存储系统,并支持多种数据结构,如字符串、列表、集合、哈希表等。由意大利程序员 Salvatore Sanfilippo 开发并于 2009 年首次发布,Redis 迅速成为业界热门的 NoSQL 数据库之一。作为一款功能丰富且性能出色的数据库,Redis 在许多方面都表现出色。首先,Redis 将数据存储在内存中,因此具有极快的读写速度,适合用于需要快速响应的场景;其次,Redis 支持持久化功能,可以将数据定期保存到硬盘上,保证数据的安全性;此外,Redis 还提供了丰富的数据结构和强大的操作命令,使得开发者能够轻松实现各种复杂的功能。
除此之外,Redis 还被广泛应用于缓存、会话存储、消息队列等场景,在互联网行业得到了广泛的应用。其简单易用的特点,使得开发者可以快速上手,提高开发效率。
在本篇博客中,我们将深入探讨 Redis 的原理、常用数据结构、操作命令以及一些典型的应用场景,希望能够帮助读者更好地了解和应用 Redis,提升系统性能和开发效率.
高性能, 高可用,高拓展
Redis的底层其实就是一张全局哈希表,当它存储数据的时候,他会把数据存储到哈希表中
1.存储过程:
拿到key,计算出哈希值,然后将这个哈希值 模 数组的长度, 得到的结果就是存储元素的下标位置。
这里很多小伙伴不太清楚哈希表的构造,我们直接上图,简单明了:
哈希表底层是一个数组,每个数组的下标处,有一个链表,比如说我们计算出的下标值为:4,那么就会将数据存储到 4下标处的链表中, get数据的时候 依然是先将key计算出哈希值,然后模数组的长度得到下标位置,然后找到相同的key,得到value值。
很多伙伴一看,是不是和Java的HashMap底层原理非常像呢。
应用场景:
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类型为链表,并且是一个双向链表,可以从头部插入,也可以从尾部插入,读取的时候也可以选择从哪边读。
上图命令中 我使用了分别从头部插入命令 123 与从尾部插入命令 321 ,但是我们读取这两个key的所有数据时,他们的值 都是321 。
上图命令中,我使用了从头部读取一个数据以及从纬度读取数据,我们发现读取完毕之后,原list中读取的值会被删掉。
基于这种特性,我们就可以在很多场景下使用list类型:
:List 可以用作简单的消息队列,通过 LPUSH 命令向队列头部添加消息,通过 RPOP 命令从队列尾部取出消息,实现先进先出 (FIFO) 的消息处理。
:将最新的消息或事件存储在 List 中,通过 LRANGE 命令获取最新的消息列表,比如用于实时更新的动态消息流。
:可以将用户的行为日志按时间顺序存储在 List 中,便于后续分析和统计用户活动。
:将需要异步处理的任务存储在 List 中,然后由消费者程序从 List 中取出任务进行处理。
:利用 List 实现轮询机制,比如循环播放广告、轮询服务器列表等。
Set类型就是无序集合,我们直接上命令
我存储了一个Set类型,注意看清我的存储的值的顺序,我们再次查询集合所有数据的时候,会发现查出来的集合顺序和我们存的时候的顺序不是一样的,证明了它的无序性
上面的命令我继续给Set集合中添加 chenxiaoxi字段,但是我们查询发现,他还是只有一个chenxiaoxi,因为Set集合还是不重复的。和我们java中的set集合特性是一样的。
其实很多商城业务会有抽奖需求,如果我们用日常业务来做,一般比较麻烦,但是我们用redis的set集合会非常的简单,三行命令搞定:
第一行命令,把抽奖的人放到redis中,使用set类型,第二行查询所有参与抽奖的人,第三局直接 SRANDMEMBER key count
随机抽取 coute 个用户 。 这样就直接实现了抽奖,那么如果说抽到的人就没有再次抽奖的资格,我们还有个命令
spop key count : 随机取出count个用户,并且删除。那么这样不就实现了中奖的人没有资格再抽了吗。
使用redis实现这个需求是非常非常简单的
Set类型还可以根据集合的运算实现以下业务场景:
Zset类型就是有序的集合,它的特性是有序且不重复
上图是添加Zset集合的命令,每次添加元素的时候必须带上对应的分数,Zset是用分数来判断元素顺序
上图是查询Zset集合数据,zrange是从小到大排序, zrevrange是从大到小排序
应用场景:
:可以使用 Zset 来实现各种类型的排行榜,比如游戏中的玩家积分排行榜、音乐平台中的歌曲播放排行榜等。Zset 的分数可以表示用户的积分或者歌曲的播放次数,成员则是对应的用户或歌曲。
:社交网络中用户的时间线(Timeline)可以使用 Zset 来实现,分数可以表示发布时间戳,成员则是对应的动态内容。
:由于 Zset 中的成员是有序的,可以方便地进行范围查找操作。例如,可以用来实现按照距离排序的地理位置索引,或者按照价格范围查找商品等功能。
:Zset 中的分数可以表示任务的执行时间,成员则是具体的任务内容。通过定时轮询 Zset,可以实现简单的任务调度系统。
:Zset 可以用来统计某个范围内的成员数量,或者实现基于分数的统计功能,比如统计某个时间段内的活跃用户数。
:Zset 可以用作优先级队列,分数可以表示任务的优先级,成员则是具体的任务。这样可以实现按照优先级顺序处理任务的功能。
Redis的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可以直接修改对象的一个属性,便于操作,相比较使用字符串类型存储效率高很多,但也不是绝对的。
我们在使用的时候需要结合业务场景来做最优选择
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。