Redis缓存数据库进阶
文章平均质量分 91
Redis从入门到高级
爱晴禹
当你发现自己的能力撑不起野心时,就请安静下来学习吧!选择没有对错。你做出选择,然后把选择变成正确的。
展开
-
Redis入门与应用
1.缓存缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。一般MySQL数据库写的并发是600/s,读的2000/s,对于大型互联网项目的百万并发,根本扛不住,Redis的官方显示Redis能够单台达到10W+/s的并发。2.排行榜系统。原创 2023-07-30 15:53:07 · 84 阅读 · 1 评论 -
Redis基础数据类型之 String (基础篇)
查看所有键(支持通配符)但是这个命令请慎用,因为keys命令要把所有的key-value对全部拉出去,如果生产环境的键值对特别多的话,会对Redis的性能有很大的影响,推荐使用dbsize。keys命令会遍历所有键,所以它的时间复杂度是o(n),当Redis保存了大量键时线上环境禁止使用keys命令。dbsize命令会返回当前数据库中键的总数。原创 2023-07-30 21:14:26 · 68 阅读 · 1 评论 -
Redis基础数据类型之 Hash (基础篇)
在使用hgetall时,如果哈希元素个数比较多,会存在阻塞Redis的可能。如果只需要获取部分field,可以使用hmget,如果一定要获取全部field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。从前面的操作可以看出,String和Hash的操作非常类似,那为什么要弄一个hash出来存储。需要一条条去插入获取。原创 2023-07-30 22:20:49 · 590 阅读 · 1 评论 -
Redis基础数据类型之 List (基础篇)
列表( list)类型是用来存储多个有序的字符串,a、b、c、c、b四个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储(2^32-1)个元素(4294967295在Redis 中,可以对列表两端插入( push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。原创 2023-07-31 23:25:11 · 113 阅读 · 1 评论 -
Redis基础数据类型之 Set (基础篇)
集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合最多可以存储2的32次方-1个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。原创 2023-08-01 22:17:04 · 222 阅读 · 1 评论 -
Redis基础数据类型之 ZSet (基础篇)
有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。原创 2023-08-02 22:27:17 · 547 阅读 · 0 评论 -
Redis慢查询(进阶篇)
许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似的功能。Redis客户端执行一条命令分为如下4个部分:1、发送命令 2、命令排队 3、命令执行 4、返回结果需要注意,慢查询只统计步骤3的时间,所以没有慢查询并不代表客户端没有超时问题。原创 2023-08-12 12:25:33 · 198 阅读 · 1 评论 -
Redis的Pipeline和事务(进阶篇)
前面我们已经说过,Redis客户端执行一条命令分为如下4个部分1)发送命令2)命令排队3)命令执行4)返回结果使用Pipeline 执行了n次命令,整个过程需要1次RTT。Pipeline并不是什么新的技术或机制,很多技术上都使用过。而且RTT在不同网络环境下会有不同,例如同机房和同机器会比较快,跨机房跨地区会比较慢。redis-cli的--pipe选项实际上就是使用Pipeline机制,但绝对部分情况下,我们使用Java语言的Redis客户端中的Pipeline会更多一点。运行结果。原创 2023-08-13 13:09:00 · 894 阅读 · 1 评论 -
Redis的发布、订阅、Stream(进阶篇)
足够简单,消费消息延迟几乎为零,但是需要处理空闲连接的问题。如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候blpop和brpop或抛出异常,所以在编写客户端消费者的时候要小心,如果捕获到异常,还有重试。做消费者确认ACK麻烦,不能保证消费者消费消息后是否成功处理的问题(宕机或处理异常等),通常需要维护一个Pending列表,保证消息处理确认;不能做广播模式,如pub/sub,消息发布/订阅模型;原创 2023-08-20 18:21:17 · 1994 阅读 · 1 评论 -
Redis的Key和Value的数据结构组织(进阶篇)
为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对。一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。所以,我们常说,一个哈希表是由多个哈希桶组成的,每个哈希桶中保存了键值对数据。key和。原创 2023-08-20 18:25:18 · 242 阅读 · 1 评论 -
Redis与Lua脚本(进阶篇)
Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大,所以许多应用都选用它作为脚本语言,尤其是在游戏领域,暴雪公司的“魔兽世界”,“愤怒的小鸟”,Nginx将Lua语言作为扩展。Redis将Lua作为脚本语言可帮助开发者定制自己的Redis命令。Redis 2.6 版本通过内嵌支持 Lua 环境。也就是说一般的运用,是不需要单独安装Lua的。1、减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行;原创 2023-08-17 20:21:02 · 3217 阅读 · 1 评论 -
Redis的持久化(进阶篇)
Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。原创 2023-08-30 21:03:50 · 509 阅读 · 1 评论 -
Redis与分布式锁(进阶篇)
Redlock 只有建立在「时钟正确」的前提下,才能正常工作,如果你可以保证这个前提,那么可以拿来使用。从硬件角度来说,时钟发生偏移是时有发生,无法避免。例如,CPU 温度、机器负载、芯片材料都是有可能导致时钟发生偏移的。人为错误也是很难完全避免的。所以,Redlock尽量不用它,而且它的性能不如单机版 Redis,部署成本也高。优先考虑使用主从+ 哨兵的模式 实现分布式锁。原创 2023-09-02 18:00:03 · 284 阅读 · 0 评论 -
Redis的主从复制(进阶篇)
由于复制只能从主节点到从节点,对于从节点的任何修改主节点都无法感知,修改从节点会造成主从数据不一致。5)、对于从节点开始接收RDB快照到接收完成期间,主节点仍然响应读写命令,因此主节点会把这期间写命令数据保存在复制客户端缓冲区内,当从节点加载完RDB文件后,主节点再把缓冲区内的数据发送给从节点,保证主从之间数据一致性。4)、主节点发送RDB文件给从节点,从节点把接收的RDB文件保存在本地并直接作为从节点的数据文件,接收完RDB后从节点打印相关日志,可以在日志中查看主节点发送的数据量。原创 2023-09-06 22:02:40 · 444 阅读 · 1 评论 -
Redis的Sentinel哨兵机制(进阶篇)
当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过<quorum>个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。从字面意思也可以很容易看出主观下线是当前Sentinel节点的一家之言,存在误判的可能。原创 2023-09-11 22:01:55 · 295 阅读 · 0 评论 -
Redis集群(进阶篇)
Redis Cluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的目的。现在官方为我们提供了专有的集群方案:Redis Cluster,它非常优雅地解决了Redis集群方面的问题,因此理解应用好 Redis Cluster将极大地解放我们使用分布式Redis 的工作量。原创 2023-09-20 21:59:13 · 848 阅读 · 1 评论 -
Redis与缓存(进阶篇)
bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。字符串类型:体现在单个value值很大,一般认为超过10KB就是bigkey,但这个值和具体的OPS相关。非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多。bigkey无论是空间复杂度和时间复杂度都不太友好,下面我们将介绍它的危害。原创 2023-09-23 20:34:03 · 681 阅读 · 1 评论 -
Redis的设计与实现(进阶篇)
如果开启多线程,至少要4核的机器,且Redis实例已经占用相当大的CPU耗时的时候才建议采用,否则使用多线程没有意义。Redis不能这样,因为每一次获取系统时间戳都是一次系统调用,系统调用相对来说是比较费时间的,作为单线程的Redis承受不起,所以它需要对时间进行缓存,由一个定时任务,每毫秒更新一次时间缓存,获取时间都是从缓存中直接拿。Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。原创 2023-09-28 20:44:50 · 748 阅读 · 0 评论