分类归档

服务器教程

服务器知识、操作系统教程、服务器常用软件等

FWQ
服务器教程
Redis缓存IO模型的演进教程示例精讲
Redis缓存IO模型的演进教程示例精讲 0浏览 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Redis缓存IO模型的演进教程示例精讲》,主要介绍了redisIO模型、演进,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了! 然而随着时间的推移,单线程越来越不满足一些应用场景了,比如针对大key删除会造成主线程阻塞的问题,redis4.0出了一个异步线程。 针对单线程由于无法利用多核cpu的特性而导致无法满足更高的并发,redis6.0也推出了多线程模式。所以说redis是单线程越来越不准确了。 事件模型 redis本身是个事件驱动程序,通过监听文件事件和时间事件来完成相应的功能。其中文件事件其实就是对socket的抽象,把一个个socket事件抽象成文件事件,redis基于Reactor模式开发了自己的网络事件处理器。那么Reactor模式是什么? 通信 思考一个问题,我们的服务器是如何收到我们的数据的?首先双方先要建立TCP连接,连接建立以后,就可以收发数据了。发送方向socket的缓冲区发送数据,等待系统从缓冲区把数据取走,然后通过网卡把数据发出去,接收方的网卡在收到数据之后,会把数据copy到socket的缓冲区,然后等待应用程序来取,这是大概的发收数据流程。 copy数据的开销 因为涉及到系统调用,整个过程可以发现一份数据需要先从用户态拷贝到内核态的socket,然后又要从内核态的socket拷贝到用户态的进程中去,这就是数据拷贝的开销。 数据怎么知道发给哪个socket 内核维护的socket那么多,网卡过来的数据怎么知道投递给哪个socket? 答案是端口,socket是一个四元组: ip(client)+ port(client)+ip(server)+port(server) 注意千万不要说一台机器的理论最大并发是65535个,除了端口,还有ip,应该是端口数*ip数 这也是为什么一台电脑可以同时打开多个软件的原因。 socket的数据怎么通知程序来取 当数据已经从网卡copy到了对应的socket缓冲区中,怎么通知程序来取?假如socket数据还没到达,这时程序在干嘛?这里其实涉及到cpu对进程的调度的问题。从cpu的角度来看,进程存在运行态、就绪态、阻塞态。 就绪态:进程等待被执行,资源都已经准备好了,剩下的就等待cpu的调度了。 运行态:正在运行的进程,cpu正在调度的进程。 阻塞态:因为某些情况导致阻塞,不占有cpu,正在等待某些事件的完成。 当存在多个运行态的进程时,由于cpu的时间片技术,运行态的进程都会被cpu执行一段时间,看着好似同时运行一样,这就是所谓的并发。当我们创建一个socket连接时,它大概会这样: sockfd = socket(AF_INET,…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis实现分布式自增ID方案对比
Redis实现分布式自增ID方案对比 收藏 学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《Redis实现分布式自增ID方案对比》,以下内容主要包含等知识点,如果你正在学习或准备学习数据库,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了! 分布式应用开发中,自增ID的生成是一个常见的需求。在单机环境下,可以使用数据库的自增主键来实现自增ID,但在分布式环境下,使用自增主键会出现重复的情况,因此需要使用其他的方案来保证自增ID的唯一性。 Redis是一款高性能的内存数据库,可以实现分布式自增ID方案。在本文中,我们将介绍三种常见的Redis实现分布式自增ID方案,并对它们进行比较,帮助开发者选择适合自己项目的方案。 基于redis incr命令 Redis提供了一个incr命令,可以对指定的key进行自增操作,并返回自增后的值。在使用incr命令生成自增ID时,可以将key设置为某个固定字符串,每次操作对这个字符串进行自增即可。 使用Redis生成分布式自增ID方案的主要代码如下: from redis import StrictRedis redis = StrictRedis(host='localhost', port=6379, db=0) def get_next_id(): return redis.incr('id_generator') 由于Redis的incr命令是原子操作,可以保证在多个客户端同时访问时,生成的ID是唯一的。 基于redis incr命令的方案非常简单,但有一个致命的缺点:ID会一直自增下去,当达到Redis的最大可用值时(默认为2^31-1),会返回错误。这意味着,如果在系统上线后长时间不重启服务,ID会不可用,这可能会导致数据丢失或数据不连续。 基于redis脚本 Lua脚本 为了避免Redis自增ID长时间不可用的问题,我们可以使用Lua脚本来控制自增ID的范围。Lua脚本可以在一个原子性操作中完成多个操作,这使得在生成自增ID时,可以根据业务需求来规定在哪个范围内生成自增ID,而不是一直自增下去。…
2024-12-01 阅读全文 →
FWQ
服务器教程
解决linux下redis数据库overcommit_memory问题
解决linux下redis数据库overcommit_memory问题 0浏览 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《解决linux下redis数据库overcommit_memory问题》,主要介绍了问题、linuxredis、overcommit memory,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了! 背景 公司的redis有时background save db不成功,通过log发现下面的告警,很可能由它引起的: [13223] 17 Mar 13:18:02.207 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis锁完美解决高并发秒杀问题
Redis锁完美解决高并发秒杀问题 0浏览 收藏 亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Redis锁完美解决高并发秒杀问题》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下高并发、秒杀、Redis锁,希望所有认真读完的童鞋们,都有实质性的提高。 场景:一家网上商城做商品限量秒杀。 1 单机环境下的锁 将商品的数量存到Redis中。每个用户抢购前都需要到Redis中查询商品数量(代替mysql数据库。不考虑事务),如果商品数量大于0,则证明商品有库存。然后我们在进行库存扣减和接下来的操作。因为多线程并发问题,我们不得不在get()方法内部使用同步代码块。这样可以保证查询库存和减库存操作的原子性。 package springbootdemo.demo.controller; /* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-13 11:19 * @notify * @version 1.0 */ import…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis中HyperLogLog的使用详情
Redis中HyperLogLog的使用详情 0浏览 收藏 怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Redis中HyperLogLog的使用详情》,涉及到RedisHyperLogLog,有需要的可以收藏一下 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是 [1,2,3,4,5,6,7],总共有7个数; 就是去重之后的数据; HyperLogLog 就是用来做去重复统计的; bitmap 在做统计时,虽然使用的是 bit 来做记录,已经很节省空间了; 但是在随着数据量快速增长的情况下,bitmap 也是很占内存空间的; 而 HyperLogLog 就不同了,HyperLogLog 的每个 key 只占用 12kb 的内存, 就可以统计 2的64 次方个基数; 而且不会随着数据量的增多而变大,就是固定的 12kb; 这是因为 HyperLogLog 每次只会根据添加的数据去计算基数,而不保存添加的数据本身; 但这也造成了一个问题,就是 HyperLogLog 基数统计的准确率不是100%,会有 0.81% 的误差; 但对于亿级数据的统计,这点误差似乎可以忽略不计; 同样的,bitmap 记录数据本身,它的计算是精确的; 所有,也可以说 HyperLogLog 是一种概率计算,但是误差是很小的。 HyperLogLog 的使用也非常简单,就3个操作api 添加元素 pfadd…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis 哨兵高模式搭建及Java代码配置
Redis 哨兵高模式搭建及Java代码配置 0浏览 收藏 在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Redis 哨兵高模式搭建及Java代码配置》,聊聊高可用、Redis哨兵,希望可以帮助到正在努力赚钱的你。 准备配置文件 # 配置文件进行了精简,完整配置可自行和官方提供的完整conf文件进行对照。端口号自行对应修改 # 后台启动的意思 daemonize yes # 端口号 port 6380 # IP绑定,redis不建议对公网开放,直接绑定0.0.0.0没毛病 bind 0.0.0.0 # redis数据文件存放的目录 dir /usr/local/redis/data # 开启AOF appendonly…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis在智能家居中的应用
Redis在智能家居中的应用 收藏 大家好,我们又见面了啊~本文《Redis在智能家居中的应用》的内容中将会涉及到等等。如果你正在学习数据库相关知识,欢迎关注我,以后会给大家带来更多数据库相关文章,希望我们能一起进步!下面就开始本文的正式内容~ Redis是一个高性能的内存数据库,在各个领域都有着广泛的应用。在智能家居领域,Redis的应用也得到了越来越多的关注和应用。 智能家居的定义是将各种家居设备连接到互联网上,并通过智能算法和用户需求,自动化控制这些设备,提高生活效率和便利度。智能家居的特点是裁剪成一个家庭物联网,各个设备进行联动与协同工作。而这种需求下,redis 的优势尤其明显。 首先,Redis是一个高性能、高并发的数据库,可以应对家庭物联网大量设备的数据传输和存储,保证设备间联动功能的实时性和可靠性。其次,Redis提供的Pub/Sub消息订阅/发布机制,可以实现设备之间的消息通信和事件触发,为智能家居的自动化功能提供支持。再次,Redis还提供了事务和持久化功能,保证数据的完整性和可靠性,即使在断电或者网络异常的情况下,也不会丢失数据。 最常见的智能家居场景就是智能音响、智能家电和智能家居安全等。其中,智能音响综合了音乐播放、智能语音控制和智能家居联动等多种功能。使用Redis的缓存功能,可以提高智能音响的响应速度和性能表现。而在智能家电方面,通过Redis的消息订阅/发布机制,多个智能家电设备可以实现联动控制,比如打开智能灯光系统和开启空调等。另外,智能家居安全系统可以通过Redis的事务机制来保证数据的完整性和可靠性,同时减少误报率和错误识别率。 除此之外,Redis还可以应用于智能家居场景中的图像和视频处理、环境监控和物品管理等方面。例如,在室内环境监控方面,可以通过Redis的存储和发布/订阅功能,实现设备数据的汇总和处理,进而实现室内的温度、湿度、二氧化碳等一系列环境参数数据的监测和控制。在物品管理方面,可以使用Redis实现智能仓库中大量物品的存储和索引,并通过其高性能的搜索和查询功能扫描库存,提高仓储效率和便利度。 综上所述,在智能家居领域,Redis的应用越来越得到广泛的重视。Redis可以帮助智能家居设备之间进行数据传输和事件触发,同时提供高性能的缓存和存储机制,为家庭物联网应用提供优质的数据处理和控制解决方案。在未来,随着智能家居领域的不断拓展和深化,Redis的应用前景必将更加广阔。 以上就是《Redis在智能家居中的应用》的详细内容,更多关于redis,应用,智能家居的资料请关注golang学习网公众号! Redis在容器编排中的应用实践 Golang中实现高效数据挖掘算法的缓存机制。
2024-12-01 阅读全文 →
FWQ
服务器教程
如何利用Redis和VB.NET开发分布式缓存更新功能
如何利用Redis和VB.NET开发分布式缓存更新功能 收藏 各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何利用Redis和VB.NET开发分布式缓存更新功能》,很明显是关于数据库的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享! 如何利用Redis和VB.NET开发分布式缓存更新功能 随着互联网的不断发展,应用程序的用户数量也在不断增加。在高并发的场景下,为了提高应用程序的性能和扩展性,我们通常会使用缓存来减轻数据库的负载。 Redis是一种高性能的内存数据存储和缓存数据库,具有高吞吐量和低延迟的特点。而VB.NET是一种方便易用的编程语言和开发工具,广泛应用于Windows平台的应用程序开发。 本文将介绍如何利用Redis和VB.NET开发分布式缓存更新功能,并通过具体的代码示例进行说明。 首先,我们需要在VB.NET项目中添加Redis的客户端库。可以通过NuGet包管理器来安装StackExchange.Redis库,该库提供了与Redis进行通信的API。 连接Redis服务器和创建Redis实例 在VB.NET中,我们可以使用StackExchange.Redis库来连接Redis服务器并创建Redis实例。以下示例代码展示了如何使用Redis连接字符串来连接到Redis服务器: Dim redisConnectionString As String = "localhost:6379" Dim redis As ConnectionMultiplexer = ConnectionMultiplexer.Connect(redisConnectionString) Dim cache As IDatabase = redis.GetDatabase()…
2024-12-01 阅读全文 →
FWQ
服务器教程
利用Redis实现分布式日志收集
利用Redis实现分布式日志收集 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《利用Redis实现分布式日志收集》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! Redis是一个高性能的内存数据库,可用于缓存、队列、分布式锁、发布/订阅等多种应用场景。 本文将介绍如何利用Redis实现分布式日志收集,其中包括: 使用Redis的List数据结构保存日志; 使用Redis的Pub/Sub(发布/订阅)功能实现分布式日志收集; 使用Python代码示例演示如何实现以上功能。 使用Redis的List数据结构保存日志 Redis的List数据结构可以保存一个有序的字符串列表。我们可以使用该功能来保存日志,其中每条日志作为一个字符串元素存储在List中。下面是一个简单的Python代码示例: import redis r = redis.Redis(host='localhost', port=6379, db=0) def log(msg): r.rpush('log', msg) 以上代码定义了一个名为log的函数,该函数将传入的msg参数插入到名为log的Redis List中。我们可以在其他程序中调用log函数来保存日志。例如: log('Hello world!') 以上代码将字符串’Hello world!’插入到名为log的Redis List中。…
2024-12-01 阅读全文 →
FWQ
服务器教程
亿级流量下的分布式锁优化方案!太好用了
亿级流量下的分布式锁优化方案!太好用了 0浏览 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《亿级流量下的分布式锁优化方案!太好用了》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 背景引入 首先,我们一起来看看这个问题的背景? 前段时间有个朋友在外面面试,然后有一天找我聊说:有一个国内不错的电商公司,面试官给他出了一个场景题: 假如下单时,用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景? 他说他当时没答上来,因为没做过没什么思路。其实我当时听到这个面试题心里也觉得有点意思,因为如果是我来面试候选人的话,应该会给的范围更大一些。 比如,让面试的同学聊一聊电商高并发秒杀场景下的库存超卖解决方案,各种方案的优缺点以及实践,进而聊到分布式锁这个话题。 因为库存超卖问题是有很多种技术解决方案的,比如悲观锁,分布式锁,乐观锁,队列串行化,Redis原子操作,等等吧。 但是既然那个面试官兄弟限定死了用分布式锁来解决库存超卖,我估计就是想问一个点:在高并发场景下如何优化分布式锁的并发性能。 我觉得,面试官提问的角度还是可以接受的,因为在实际落地生产的时候,分布式锁这个东西保证了数据的准确性,但是他天然并发能力有点弱。 刚好我之前在自己项目的其他场景下,确实是做过高并发场景下的分布式锁优化方案,因此正好是借着这个朋友的面试题,把分布式锁的高并发优化思路,给大家来聊一聊。 库存超卖现象是怎么产生的? 先来看看如果不用分布式锁,所谓的电商库存超卖是啥意思?大家看看下面的图: 这个图,其实很清晰了,假设订单系统部署两台机器上,不同的用户都要同时买10台iphone,分别发了一个请求给订单系统。 接着每个订单系统实例都去数据库里查了一下,当前iphone库存是12台。 俩大兄弟一看,乐了,12台库存大于了要买的10台数量啊! 于是乎,每个订单系统实例都发送SQL到数据库里下单,然后扣减了10个库存,其中一个将库存从12台扣减为2台,另外一个将库存从2台扣减为-8台。 现在完了,库存出现了负数!泪奔啊,没有20台iphone发给两个用户啊!这可如何是好。 用分布式锁如何解决库存超卖问题? 我们用分布式锁如何解决库存超卖问题呢?其实很简单,回忆一下上次我们说的那个分布式锁的实现原理: 同一个锁key,同一时间只能有一个客户端拿到锁,其他客户端会陷入无限的等待来尝试获取那个锁,只有获取到锁的客户端才能执行下面的业务逻辑。 代码大概就是上面那个样子,现在我们来分析一下,为啥这样做可以避免库存超卖? 大家可以顺着上面的那个步骤序号看一遍,马上就明白了。 从上图可以看到,只有一个订单系统实例可以成功加分布式锁,然后只有他一个实例可以查库存、判断库存是否充足、下单扣减库存,接着释放锁。 释放锁之后,另外一个订单系统实例才能加锁,接着查库存,一下发现库存只有2台了,库存不足,无法购买,下单失败。不会将库存扣减为-8的。…
2024-12-01 阅读全文 →