分类归档

服务器教程

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

FWQ
服务器教程
单线程1KB的Redis写操作有84%都是耗费在内核上
单线程1KB的Redis写操作有84%都是耗费在内核上 0浏览 收藏 IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《单线程1KB的Redis写操作有84%都是耗费在内核上》,聊聊Redis、单线程,我们一起来看看吧! 对在线真实系统进行性能监控,发现K/V存储操作并对服务器进行锁操作。(依旧是限制服务器延迟和吞吐量的主要原因) 服务器I/O 性能仍然很重要。没有一个高性能的I/O子系统是不可能有好的系统性能的。 奇怪的是, 虽然在过去10年已经看到显著改善硬件的I / O性能, 但是我们没有系统I/O性能的飞跃。 所以值得怀疑: 难道依靠标准的商业化操作系统能改善了I/O性能? 商用Linux硬件的简单I/O测试 这是Simon Peter et al 最近发表的论文的核心问题。 可能我从这篇论文中得到的针对上面那个问题(标准商用操作系统到底有没有装备这些I/O的改进?)的最有意思的答案是no:今天,主要的I/O延时障碍在操作系统内核本身。 在一项显著的实验中,他们采用商用Linux并尝试降低对商用硬件上的Redis进行简单读写的延时。 (注意, 这里的“延时”部分很重要 — 我会很快提到。通过多线程改进吞吐量是可行的,问题在于针对特殊请求的延时仍有进步空间, 尤其在数据中心的层面, 延时价值不菲。) 特别地: 他们从缆线上接收 1KB…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis如何实现分布式搜索功能
Redis如何实现分布式搜索功能 收藏 学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《Redis如何实现分布式搜索功能》,以下内容主要包含等知识点,如果你正在学习或准备学习数据库,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了! Redis是一款高性能的NoSQL数据库,其提供了丰富的功能和数据结构,包括字符串、哈希表、列表、集合和有序集合等。除此之外,Redis还提供了一些高级功能,例如发布订阅、Lua脚本和事务等。其中,Redis的分布式搜索功能非常实用,可以帮助我们快速的检索大量的数据。在这篇文章中,我们将探讨Redis如何实现分布式搜索功能,并给出具体的代码示例。 一、Redis的分布式搜索功能概述 Redis提供了两种分布式搜索功能:全文搜索和基于特定属性的扫描。这里我们先来了解一下这两种功能的概念和实现方式。 1.全文搜索 全文搜索是指在文本数据中搜索特定的字符串。在Redis中,我们可以使用Redisearch插件来实现全文搜索功能。Redisearch使用倒排索引来实现搜索,即先将每个文档拆成词项(term),再将每个词项和文档编号建立映射关系,最后将所有词项建立反向索引表。当搜索时,只需要将待查询的词项在反向索引表中查找即可。 Redisearch在搜索时支持通配符和模糊搜索,还支持“AND”和“OR”等逻辑操作。搜索结果可以按照一定规则排序,也可以指定只返回一部分结果。 2.基于属性的扫描 基于属性的扫描是指在具有多个属性的数据集合中,按照某个或某些属性筛选出符合条件的数据。在Redis中,我们可以使用RedisGears和Redisearch配合使用来实现这种功能。 RedisGears是Redis维护的一个插件,它提供了将Redis键值对转换为流(stream)的功能。我们也可以使用RedisGears创造一些流,然后使用Redisearch的“FT.AGGREGATE”命令对这些流进行聚合。聚合后可以对数据进行筛选和排序,还可以输出到Redis的其他数据结构中或者通过网络发送出去。 二、Redis的分布式搜索功能具体实现 在这里,我们以全文搜索为例,具体实现分布式搜索功能。我们将使用redisearch-py作为Python客户端,并在两个节点上模拟Redis实例。在这个例子中,我们将在两个Redis实例中分别创建一个索引并进行搜索。 1.安装依赖 安装redisearch-py库: pip install redisearch 2.构建Redis实例 首先,我们需要在两个不同的端口启动两个Redis实例。在这里我们使用Redis的官方镜像,并通过修改port参数来创建两个实例。 $ docker run -d -p 6380:6379 redis$…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis分布式锁之红锁的实现
Redis分布式锁之红锁的实现 0浏览 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Redis分布式锁之红锁的实现》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 一、问题 分布式锁,当我们请求一个分布式锁的时候,成功了,但是这时候slave还没有复制我们的锁,masterDown了,我们的应用继续请求锁的时候,会从继任了master的原slave上申请,也会成功。 这就会导致,同一个锁被获取了不止一次。 二、办法 Redis中针对此种情况,引入了的概念。 三、原理 用Redis中的多个master实例,来获取锁,只有大多数实例获取到了锁,才算是获取成功。具体的红锁算法分为以下五步: 获取当前的时间(单位是毫秒)。 使用相同的key和随机值在N个节点上请求锁。这里获取锁的尝试时间要远远小于锁的超时时间,防止某个masterDown了,我们还在不断的获取锁,而被阻塞过长的时间。 只有在大多数节点上获取到了锁,而且总的获取时间小于锁的超时时间的情况下,认为锁获取成功了。 如果锁获取成功了,锁的超时时间就是最初的锁超时时间进去获取锁的总耗时时间。 如果锁获取失败了,不管是因为获取成功的节点的数目没有过半,还是因为获取锁的耗时超过了锁的释放时间,都会将已经设置了key的master上的key删除。 四、实战 Redission就实现了红锁算法,使用的步骤如下: 1、引入maven org.redisson redisson 3.9.0 2、引入代码 Config config1 = new Config();…
2024-12-01 阅读全文 →
FWQ
服务器教程
使用Redis的五个注意事项
使用Redis的五个注意事项 0浏览 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《使用Redis的五个注意事项》,介绍一下数据库、NoSQL,希望对大家的知识积累有所帮助,助力实战开发! 下面内容来源于Quora上的一个提问,问题是使用Redis需要避免的五个问题。而回答中超出了五个问题的范畴,描述了五个使用Redis的注意事项。如果你在使用或者考虑使用Redis,可能你可以学习一下下面的一些建议,避免一下提到的问题。 1.使用key值前缀来作命名空间 虽然说Redis支持多个数据库(默认32个,可以配置更多),但是除了默认的0号库以外,其它的都需要通过一个额外请求才能使用。所以用前缀作为命名空间可能会更明智一点。 另外,在使用前缀作为命名空间区隔不同key的时候,***在程序中使用全局配置来实现,直接在代码里写前缀的做法要严格避免,这样可维护性实在太差了。 2.创建一个类似 ”registry” 的key用于标记key使用情况 为了更好的管理你的key值的使用,比如哪一类key值是属于哪个业务的,你通常会在内部wiki或者什么地方创建一个文档,通过查询这个文档,我们能够知道Redis中的key都是什么作用。 与之结合,一个推荐的做法是,在Redis里面保存一个registry值,这个值的名字可以类似于 __key_registry__ 这样的,这个key对应的value就是你文档的位置,这样我们在使用Redis的时候,就能通过直接查询这个值获取到当前Redis的使用情况了。 3.注意垃圾回收 Redis是一个提供持久化功能的内存数据库,如果你不指定上面值的过期时间,并且也不进行定期的清理工作,那么你的Redis内存占用会越来越大,当有一天它超过了系统可用内存,那么swap上场,离性能陡降的时间就不远了。所以在Redis中保存数据时,一定要预先考虑好数据的生命周期,这有很多方法可以实现。 比如你可以采用Redis自带的过期时间为你的数据设定过期时间。但是自动过期有一个问题,很有可能导致你还有大量内存可用时,就让key过期去释放内存,或者是内存已经不足了key还没有过期。 如果你想更精准的控制你的数据过期,你可以用一个ZSET来维护你的数据更新程度,你可以用时间戳作为score值,每次更新操作时更新一下score,这样你就得到了一个按更新时间排序序列串,你可以轻松地找到最老的数据,并且从最老的数据开始进行删除,一直删除到你的空间足够为止。 4.设计好你的Sharding机制 Redis目前并不支持Sharding,但是当你的数据量超过单机内存时,你不得不考虑Sharding的事(注意:Slave不是用来做Sharding操作的,只是数据的一个备份和读写分离而已)。 所以你可能需要考虑好数据量大了后的分片问题,比如你可以在只有一台机器的时候就在程序上设定一致性hash机制,虽然刚开始所有数据都hash到一台机器,但是当你机器越加越多的时候,你就只需要迁移少量的数据就能完成了。 5.不要有个锤子看哪都是钉子 当你使用Redis构建你的服务的时候,一定要记住,你只是找了一个合适的工具来实现你需要的功能。而不是说你在用Redis构建一个服务,这是很不同的,你把Redis当作你很多工具中的一个,只在合适使用的时候再使用它,在不合适的时候选择其它的方法。 英文连接: 原文链接: 今天关于《使用Redis的五个注意事项》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于redis的内容请关注golang学习网公众号! 版本声明…
2024-12-01 阅读全文 →
FWQ
服务器教程
windows 64位下redis安装教程
windows 64位下redis安装教程 0浏览 收藏 IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《windows 64位下redis安装教程》,聊聊WindowsRedis,我们一起来看看吧! 一、下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址: github下载地址: 二、安装Redis 1.这里下载的是Redis-x64-3.2.100版本,我的电脑是win7 64位,所以下载64位版本的,在运行中输入cmd,然后把目录指向解压的Redis目录。 2、启动命令 redis-server redis.windows.conf,出现下图显示表示启动成功了。 三、设置Redis服务 1、由于上面虽然启动了redis,但是只要一关闭cmd窗口,redis就会消失。所以要把redis设置成windows下的服务。 也就是设置到这里,首先发现是没用这个Redis服务的。 2、设置服务命令 redis-server –service-install redis.windows-service.conf –loglevel verbose 输入命令之后没有报错,表示成功了,刷新服务,会看到多了一个redis服务。 3、常用的redis服务命令。 卸载服务:redis-server…
2024-12-01 阅读全文 →
FWQ
服务器教程
解决Redis启动警告问题
解决Redis启动警告问题 0浏览 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《解决Redis启动警告问题》,介绍一下解决、Redis启动、警告,希望对大家的知识积累有所帮助,助力实战开发! 如果启动前不对linux内核做任何更改,那么redis启动会报出警告,共三个:如下图所示 第一个警告:The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 意思是:TCP  backlog设置值,511没有成功,因为 /proc/sys/net/core/somaxconn这个设置的是更小的128. 临时解决方法:(即下次启动还需要修改此值)…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis 异常 read error on connection 的解决方案
Redis 异常 read error on connection 的解决方案 0浏览 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Redis 异常 read error on connection 的解决方案》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 一、造成原因与场景 在接口连接 redis 时,使用了 pconnect 进行 redis 长连接,在 Redis->auth() 中抛出异常: PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection' 注:由于 php-fpm…
2024-12-01 阅读全文 →
FWQ
服务器教程
Java中使用Redis实现分布式锁
Java中使用Redis实现分布式锁 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《Java中使用Redis实现分布式锁》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! 随着互联网技术的发展,分布式系统已经成为了一个重要的话题,分布式锁也是其中一个重要的技术。在分布式系统中,通过使用分布式锁可以保证多个进程或者线程对共享资源的访问顺序和安全性。在Java中,有很多实现分布式锁的方案,其中Redis分布式锁的方案是比较常用的方式之一。 Redis是一个高性能、持久化、内存数据库,具有很好的数据结构支持和分布式特性。Redis集群模式可以方便地扩展系统的性能,同时通过基于PUB/SUB的订阅机制也可以实现分布式锁的功能。下面我们将介绍如何使用Redis实现分布式锁。 一、Redis锁的设计思路 在分布式系统中实现一个锁需要满足以下几个条件: 1、互斥:同一时间只能有一个客户端持有锁。 2、可重入:同一个客户端可以多次获取锁,需要释放相同次数的锁。 3、非阻塞:尝试获取锁失败立即返回,不会阻塞客户端线程。 4、容错:锁失效或者锁过期后要自动释放,不会造成死锁等问题。 基于以上几个条件,我们可以设计出以下的Redis锁实现方案: 1、使用SETNX命令尝试设置锁的值,如果返回1表示成功获取锁,否则表示获取锁失败。 2、使用GET命令获取锁的值,判断当前客户端是否持有锁,如果持有锁则将锁的值加1,否则返回获取锁失败。 3、使用DEL命令释放锁。 4、使用过期时间来防止死锁,锁的过期时间应该大于业务处理的时间,一般为几秒到几分钟。 二、实现分布式锁的Java代码 下面是一个使用Redis实现分布式锁的Java代码示例: import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class RedisLock {…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis的模糊查询在生产环境出现严重的性能问题
Redis的模糊查询在生产环境出现严重的性能问题 0浏览 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Redis的模糊查询在生产环境出现严重的性能问题》,主要介绍了Redis、数据库、模糊查询,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了! Redis是一个高性能高效率的key-value存储的nosql数据库,由于数据是存储在内存中,因此访问速度非常快,由于项目涉及到数据库的查询非常多,而数据变大并不是非常频繁,所以在项目中采用Redis分担大部分MySQL的压力。 在项目中实际使用我用的Redis提供的客户端连接工具包jedis,在项目中引入jedis.Jar即可。 public static Set  searchLike(String like_key) {     if(!Config.IS_BUG){          return null;     Jedis jedis = RedisApi.getJedis();     boolean is_ok = true;     try {          if (jedis == null) {             return null;          return jedis.keys(like_key);      } catch (Exception e) {          // TODO: handle exception          is_ok = false;         return null;      } finally {          close(jedis, is_ok);  每当用户登录成功之后,都会生成一个cookie,分别存在客户端和Redis数据库,cookie的key由cookie值+用户ID组成:cookie字符串+”_”+用户ID,例如用户cookie为“d9fb0ea5955fcf0a2183c5076”,用户ID为 19092,那Redis中存储的key就是 d9fb0ea5955fcf0a2183c5076_19092,最终的key-vlaue就是:  {"d9fb0ea5955fcf0a2183c5076_19092":d9fb0ea5955fcf0a2183c5076}  而在用户不断的登录成功,就不断地产生这样的记录,久而久之,会积累出非常多的无用的key,浪费redis的空间,也加重了redis查询的负担,因此想到使用Redis的模糊查询来清掉无用的cookie的key。 而Redis的客户端jedis操作是通过jedis.keys(keys)来完成的,keys可以使用通配符来匹配Redis中的key。…
2024-12-01 阅读全文 →
FWQ
服务器教程
利用Java和Redis实现实时推荐系统:如何个性化推荐数据和广告
利用Java和Redis实现实时推荐系统:如何个性化推荐数据和广告 收藏 一分耕耘,一分收获!既然都打开这篇《利用Java和Redis实现实时推荐系统:如何个性化推荐数据和广告》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新数据库相关的内容,希望对大家都有所帮助! 利用Java和Redis实现实时推荐系统:如何个性化推荐数据和广告 引言:随着互联网的快速发展,我们每天都会接触到大量的推荐内容和广告,这些内容和广告的个性化程度越高,用户的体验就越好。然而,实现个性化推荐并不是一件容易的事情,需要利用到大数据和机器学习等技术。在本文中,我们将介绍如何利用Java和Redis搭建一个实时推荐系统,以实现个性化的数据和广告推荐。 一、概述实时推荐系统是指能够根据用户的实时行为和偏好,快速地生成个性化的推荐内容和广告。Java是一种功能强大的编程语言,而Redis是一款高性能的NoSQL数据库,它们相互配合可以实现实时推荐系统。在推荐系统中,我们首先需要收集和存储用户的行为数据,然后根据这些数据进行用户画像分析和推荐算法的实时计算,最后利用Redis进行数据的存储和读取。 二、用户画像分析用户画像是指对用户的个人信息、兴趣偏好、行为习惯等进行分析和归纳,以便更好地为用户推荐内容。在Java中,我们可以使用各种算法和工具对用户的行为数据进行分析,例如使用机器学习库weka进行数据挖掘和分析。下面是一个示例代码,展示如何使用weka进行用户画像分析: import weka.core.Instances; import weka.core.converters.ArffLoader; import weka.core.converters.CSVLoader; import weka.core.converters.ConverterUtils.DataSource; import weka.clusterers.SimpleKMeans; public class UserProfiler { public static void main(String[] args) { try…
2024-12-01 阅读全文 →