- 博客(16)
- 收藏
- 关注
原创 计算机网络概述
所有连接到因特网的设备都叫做端系统,或者主机。端系统通过通信链路和分组交换机的网络连接在一起。通信链路包括同轴电缆、铜线、光纤和无线电频谱。分组交换机常见的是路由器和链路层交换机。在发送数据时,发送端会将数据分组,在目的端系统重新装配。端系统通过ISP接入因特网,每个ISP网络都是独立管理的,端系统,交换机等都要运行多个协议,因此因特网的标准也被制定了出来。
2024-10-06 20:58:05
821
原创 Redis的String和Hash
需要注意的是在装载因子大于1的时候,Redis允许扩容,但是AOF重写或生成RDB时就不可以扩容,为了保证不污染AOF和RDB,但是装载因子大于5,立即扩容。Hash存储键值对如果hash冲突了,就会使用拉链法避免hash冲突,这和java中的hashmap解决hash冲突的方法是一致的,但是在扩容方面,却有一些区别。Redis底层是使用C实现的,但是它并没有使用C中char* 的方法,而是自己定义了一个SDS,也就是简单字符串,先说一下char*以及它的缺点。中String类型有什么缺点。
2024-09-02 15:30:21
1022
原创 Redis6.0新特性
Redis处理网络请求从一开始和客户端建立socket连接,之后轮询所有的客户端,这些都与之前的版本是相同的。在得到返回的数据后,Redis会多线程的将数据写回socket。在普通模式下,服务端会在更改过数据后通知客户端一次,之后的更改服务端都不会告诉客户端直到再一次查询到这个数据。客户端缓存有普通模式,广播模式和重定向模式,其中普通模式和广播模式是需要使用Redis最新推出的RESP 3协议。在广播模式下,服务端会广播所有失效的信息给客户端,但是请求如果过去频繁的话对于Redis可能还会成为一种负担。
2024-08-27 23:03:52
1070
原创 Redis秒杀场景
Redis方面,因为用户请求多,但是商品少。甚至前端也可以做判断,用概率直接把一部分用户的请求不发送给后端,而是给用户展现秒杀失败。Redis如果集群达到一定数量,那么集群数量再增加,吞吐量却会降低,速度会变慢。因为集群间会通过网络通信进行信息交流,如果集群过多的话,网络通信就会过去频繁,导致集群的速度变慢。前端提前使用cdn缓存页面信息,防止客户端频繁刷新,把所有请求都落在数据库导致数据库崩掉。Redis也要保存一段时间缓存,防止购买成功的用户刷新查看进度,未购买成功的用户反复刷新查看。
2024-08-26 22:58:36
416
原创 Redis事物和主从同步
但是如果刚开始检查的时候,没有检查出错误,但是执行的时候发现错误了,这个时候就没有原子性了,下面的操作还是会执行的。如果哨兵判断Redis主库客观下线,结果其实它没有下线,它仍然在接受客户端的消息,这个时候哨兵们已经选好了新的主库,这个时候,这段时间的命令就会丢失,也就是脑裂。一致性,如原子性一样,如果Redis一开始检查出来了,就会拒绝执行事物,如果没有检查出错误,但是执行的时候发现了错误,还是会执行的。但是如果是在事物执行完毕的时候,有命令进来的话,Redis会优先执行事物中的命令。
2024-08-25 21:52:05
691
原创 Redis一些问题
CPU 内存 磁盘这三种访问的速度是由快到慢的,它们之间的容量是从小到大的,因此就有了只读缓存和读写缓存两种模式。删除掉最早访问的数据,但是有一个缺点,如果数据是每一个都进行查询的话,也是会这些数据造成污染的。大量缓存同一时刻过期,查询全到数据库,导致数据库层的压力激增,可以设置过期值不同。缓存和数据库都不存在这个数据,可以返回null值回缓存,或者用布隆过滤器。第一种是写在数据库中,然后缓存未命中则去查数据库,查到了之后再写入缓存。异步写只需要写好缓存,缓存满了之后,写进数据库就可以了。
2024-08-24 23:05:14
538
原创 Redis为什么会阻塞
CPU分为多个物理核,一个物理核分为两个逻辑核。如果要返回所有数据的时候,可以把一个整体,给分散开来,分成几部分来取出,避免造成阻塞,Keys这个命令也不可以乱用,差集并集可以返回给服务端完成,减少同一个时间所有的键值对同时过期,会引起很严重的阻塞。因为Redis删除后会有内存碎片,也有可能是Redis分配是以二进制来分配的,也会有很多内存碎片,Redis提供了自动内存碎片清理。需要避免bigKey操作,从库的话就是避免大RDB,Redis删除改成异步操作,不要让执行太慢,导致缓存进来的多,出去的少。
2024-08-23 13:57:31
530
原创 Redis实战
把key拆分成key1 key2,压缩列表可以存储一组entry,每一个entry会存储上一个entry的长度,自身长度,编码方式,自身数据,这减少了RedisObject的内存,还减少了指针的内存。如果是包含字符的话,就会用SDS,也就是简单字符串来存储,SDS中会把存储的数据最后加一个\0,还会存储使用的buf的长度,实际分配的buf的长度。GEO数据类型,专门存储地址有关的数据,可以返回范围内的数据,zset没有办法保存经纬度,GEO是依靠zset作为底层结构,使用GeoHash来编码。
2024-08-22 15:13:37
982
原创 Redis主从同步和哨兵
Redis主从同步,第一次同步的时候,会对数据进行全量同步,主库会把所有数据以RDB的形式发给从库,因为之后主库在更新数据后,都要把更新的数据发给从库,从库太多了的话就会让主线程频繁用fork,也会占用主库网络带宽,会减慢主库的速度,因此推出了主从从模式。如果主库故障,那么哨兵会执行主从切换,但是在此之前会先选出执行此操作的哨兵,会进行投票,必须到哨兵数量/2+1才可以进行主从切换,否则会休息一会重新选举。如果优先级一样,就会根据从主库那同步到的数据的多少来选,最后会从id小的从库当主库。
2024-08-21 13:52:04
762
原创 Redis核心技术
需要注意的是在装载因子大于1的时候,Redis允许扩容,但是AOF重写或生成RDB时就不可以扩容,为了保证不污染AOF和RDB,但是装载因子大于5,立即扩容。在rehash时,如果没有新的请求,也会通过定时任务的方式进行rehash
2024-08-21 11:25:32
1093
原创 深入理解协议栈的内部结构——收发和断开
如果应用程序发送的是逐行的数据,甚至发送一个个字节,那么如果协议栈一接收到数据就发送出去,那么会发送大量的小包,这会降低网络的效率。因此在连接阶段,接收方其实也会把自己接受缓存区的大小告诉发送方,发送方在每次发送完数据后都会计算接收方还有多少缓存区,如果要溢出了,那么就会更改发送包的速率。如果HTTP请求的消息太大,长度已经超过了一个网络包可以容纳的最大长度,那么发送缓冲区的数据会被以MSS的长度分成若干个网络包,然后根据套接字中记录的控制信息所对应的IP地址和端口号,然后交给IP模块来发送数据。
2024-06-23 14:39:45
2284
原创 深入理解协议栈的内部结构——创建和连接
在TCP协议的情况下,如果服务端在客户端发送数据之前出现故障,客户端会尝试建立TCP连接。如果服务端无法响应,客户端会收到连接超时错误。如果客户端在服务端发送数据之后出现故障,通常服务端会尝试重新发送数据,直到客户端确认接收。如果重发数据次数达到上限,服务端会关闭这个连接。
2024-06-21 23:39:11
2053
原创 协议栈发送消息
收发数据的客户端和服务端其实中间建立了一个管道,而这个管道是双向的,客户端既可以发送数据给服务端,服务端也可以发送数据给客户端。但是这就又有一个问题了,根本没有这个管道,那我们应该怎么建立起这个管道呢。建立管道的关键在于管道的出口和入口,这些出入口被称为套接字。我们需要先创建套接字,然后再将套接字连接起来形成管道。服务器程序一般在启动后就会自动创建套接字了,等待客户端创建套接字连接管道。客户端创建一个管道后,从该套接字延伸出管道,最后连接到服务端。
2024-06-20 20:34:26
1059
原创 用通俗易懂的话理解HTTP
HTTP协议规定了客户端和服务器之间交互的消息内容和步骤。首先客户端会向服务器发送请求信息,请求信息中包含的内容是" 对什么内容 "和" 执行什么操作"。" 对什么内容 "其实就是URI,而" 执行什么操作 "也就是方法,下面是HTTP协议的主要方法服务器会根据" 对什么内容 "和" 方法 " 来完成自己的工作,然后将响应结果放在响应消息中,响应消息的开头会有一个状态码,从中可以获取本次操作的成功与否,最常见的404便是找不到文件的错误状态码。
2024-06-18 09:52:21
975
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅