作者文章

fwq

FWQ
服务器教程
Redis数据库的使用场景介绍(避免误用Redis)
Redis数据库的使用场景介绍(避免误用Redis) 收藏 在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Redis数据库的使用场景介绍(避免误用Redis)》,聊聊使用场景、Redis数据库,希望可以帮助到正在努力赚钱的你。 Redis 是目前 NoSQL 领域的当红炸子鸡,它象一把瑞士军刀,小巧、锋利、实用,特别适合解决一些使用传统关系数据库难以解决的问题。但是 Redis 不是银弹,有很多适合它解决的问题,但是也有很多并不适合它解决的问题。另外,Redis 作为内存数据库,如果用在不适合的场合,对内存的消耗是很可观的,甚至会让系统难以承受。 我们可以对系统存储使用的数据以两种角度分类,一种是按数据的大小划分,分成大数据和小数据,另一种是按数据的冷热程度划分,分成冷数据和热数据,热数据是指读或写比较频繁的数据,反之则是冷数据。 可以举一些具体的例子来说明数据的大小和冷热属性。比如网站总的注册用户数,这明显是一个小而热的数据,小是因为这个数据只有一个值,热是因为注册用户数随时间变化很频繁。再比如,用户最新访问时间数据,这是一个量比较大,冷热不均的数据,大是数据的粒度是用户级别,每一个用户都有数据,如果有一千万用户,就意味着有一千万的数据,冷热不均是因为活跃用户的最新访问时间变化很频繁,但是可能有很大一部非活跃用户访问时间长时间不会发生变化。 大体而言,Redis 最适合处理的是小而热,而且是写频繁,或者读写都比较频繁的热数据。对于大而热的数据,如果其它方式很难解决问题,也可以考虑使用 Redis 解决,但是一定要非常谨慎,防止数据无限膨胀。原因如下: 首先,对于冷数据,无论大小,都不建议放在 Redis 中。Redis 数据要全部放在内存中,资源宝贵,把冷数据放在其中实在是一种浪费,冷数据放在普通的存储比如关系数据库中就好了。 其次,对于热数据,尤其是写频繁的热数据,如果量比较小,是最适合放到 Redis 中的。比如上面提到的网站总的注册用户数,就是典型的 Redis 用做计数器的例子。再比如论坛最新发表列表,最新报名列表,可以控制数量在几百到一千的规模,也是典型的 redis 做最新列表的使用方式。 另外,对于量比较大的热数据(或者冷热不均数据),使用…
2025-05-10 阅读全文 →
FWQ
服务器教程
基于redis+lua进行限流的方法
基于redis+lua进行限流的方法 收藏 IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《基于redis+lua进行限流的方法》,聊聊限流、redislua,我们一起来看看吧! 1,首先我们redis有很多限流的算法(比如:令牌桶,计数器,时间窗口)等,但是都有一定的缺点,令牌桶在单项目中相对来说比较稳定,但是在分布式集群里面缺显的不那么友好,这时候,在分布式里面进行限流的话,我们则可以使用redis+lua脚本进行限流,能抗住亿级并发 2,下面说说lua+redis进行限流的做法开发环境:idea+redis+lua第一:打开idea的插件市场,然后搜索lua,点击右边的安装,然后安装好了,重启即可 第二:写一个自定义限流注解 package com.sport.sportcloudmarathonh5.config; import java.lang.annotation.*; /** * @author zdj * @version 1.0.0 * @description 自定义注解实现分布式限流 */ @Target(value = ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis中Bloomfilter布隆过滤器的学习
Redis中Bloomfilter布隆过滤器的学习 收藏 在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Redis中Bloomfilter布隆过滤器的学习》,聊聊布隆过滤器、RedisBloom、filter,希望可以帮助到正在努力赚钱的你。 1.概念 ​ 布隆过滤器是一个高空间利用率的概率性数据结构,主要目的是节省内存空间以及判断一个元素是否存在于一个集合中(存在误判的情况),可以理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率(控制参数:error_rate-误判率 initial_size-初始容量) ​ error_rate越小,越精确,需要的空间越大 ​ initial_size越大,越精确,当实际数量超出这个数值时,误判率会上升 布隆过滤器可以判断某个数据一定不存在,但是无法判断一定存在 2.guava实现 2.1.依赖 com.google.guava guava 19.0 2.2.初始化布隆过滤器 //初始化布隆过滤器,放入到spring容器里面 @Bean public MyBloomFilter initBloomFilterHelper() {…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis集群方案
Redis集群方案 收藏 本篇文章给大家分享《Redis集群方案》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。 前段时间搞了搞Redis集群,想用做推荐系统的线上存储,说来挺有趣,这边基础架构不太完善,因此需要我们做推荐系统的自己来搭这个存储环境,就自己折腾了折腾。公司所给机器的单机性能其实挺给力,已经可以满足目前的业务需求,想做redis集群主要有以下几点考虑:     1、扩展性,scale-out,以后数据量变得很大之后,不至于推到重来,redis虽然可以开启虚拟内存功能,单机也能提供超过物理内存上限的容量,但频繁在内存和硬盘间swap页会大大降低其性能,有点儿违背redis的设计初衷。     2、redis是一个单线程io复用的结构,无法有效利用服务器的多核结构,如果能在一台多核机器起多个redis进程,共同提供服务,效率会更高一些。     3、主从,数据备份和容灾。。 因此计划做的redis集群希望可以实现以下功能:     1、data sharding,支持数据切片。     2、主从备份,主节点写数据,主和从都提供读请求服务,并且支持主从自动切换。     3、读请求做负载均衡。     4、更好地,支持节点failover,数据自动迁移。 下面是前后经历的一个过程: 【第一步】尝试官方方案    肯定想去查看一下redis的官方集群方案,但是很遗憾,官方对cluster的声明如下: Unfortunately Redis Cluster…
2025-05-10 阅读全文 →
FWQ
服务器教程
在Redis中如何保存时间序列数据详解
在Redis中如何保存时间序列数据详解 收藏 怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《在Redis中如何保存时间序列数据详解》,涉及到redis时间、序列,有需要的可以收藏一下 UserID, Type, TimeStamp 我之前做过的一个物联网项目的数据存取需求,和这个很相似。我们需要周期性地统计近万台设备的实时状态,包括设备ID、压力、温度、湿度,以及对应的时间戳: DeviceID, Pressure, Temperature, Humidity, TimeStamp 这些与发生时间相关的一组数据,就是时间序列数据。这些数据的特点是没有严格的关系模型,记录的信息可以表示成键和值的关系(例如,一个设备ID对应一条记录),所以,并不需要专门用关系型数据库(例如MySQL)来保存。而Redis的键值数据模型,正好可以满足这里的数据存取需求。Redis基于自身数据结构以及扩展模块,提供了两种解决方案。 这节课,我就以物联网场景中统计设备状态指标值为例,和你聊聊不同解决方案的做法和优缺点。 俗话说,“知己知彼,百战百胜”,我们就先从时间序列数据的读写特点开始,看看到底应该采用什么样的数据类型来保存吧。 时间序列数据的读写特点 在实际应用中,时间序列数据通常是持续高并发写入的,例如,需要连续记录数万个设备的实时状态值。同时,时间序列数据的写入主要就是插入新数据,而不是更新一个已存在的数据,也就是说,一个时间序列数据被记录后通常就不会变了,因为它就代表了一个设备在某个时刻的状态值(例如,一个设备在某个时刻的温度测量值,一旦记录下来,这个值本身就不会再变了)。 所以,这种数据的写入特点很简单,就是插入数据快,这就要求我们选择的数据类型,在进行数据插入时,复杂度要低,尽量不要阻塞。看到这儿,你可能第一时间会想到用Redis的String、Hash类型来保存,因为它们的插入复杂度都是O(1),是个不错的选择。但是,我在第11讲中说过,String类型在记录小数据时(例如刚才例子中的设备温度值),元数据的内存开销比较大,不太适合保存大量数据。 那我们再看看,时间序列数据的“读”操作有什么特点。 我们在查询时间序列数据时,既有对单条记录的查询(例如查询某个设备在某一个时刻的运行状态信息,对应的就是这个设备的一条记录),也有对某个时间范围内的数据的查询(例如每天早上8点到10点的所有设备的状态信息)。 除此之外,还有一些更复杂的查询,比如对某个时间范围内的数据做聚合计算。这里的聚合计算,就是对符合查询条件的所有数据做计算,包括计算均值、最大/最小值、求和等。例如,我们要计算某个时间段内的设备压力的最大值,来判断是否有故障发生。 那用一个词概括时间序列数据的“读”,就是查询模式多。 弄清楚了时间序列数据的读写特点,接下来我们就看看如何在Redis中保存这些数据。我们来分析下:针对时间序列数据的“写要快”,Redis的高性能写特性直接就可以满足了;而针对“查询模式多”,也就是要支持单点查询、范围查询和聚合计算,Redis提供了保存时间序列数据的两种方案,分别可以基于Hash和Sorted Set实现,以及基于RedisTimeSeries模块实现。 接下来,我们先学习下第一种方案。 基于Hash和Sorted Set保存时间序列数据 Hash和Sorted…
2025-05-10 阅读全文 →
FWQ
服务器教程
详解Redis中key的命名规范和值的命名规范
详解Redis中key的命名规范和值的命名规范 收藏 本篇文章给大家分享《详解Redis中key的命名规范和值的命名规范》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。 数据库中得热点数据key命名惯例 表名:主键名:主键值:字段名 例如 user:id:0001:name 例如 user:id:0002:name 例如 order:id:s2002:price 上面的key对应的值则可以是 存放的方式 key value 优点 单独的key:value形式 order:id:s2002:price 2000 方便简单的操作,例如incr自增或自减 json格式 user:id:0001 {id:0001,name:”张三”} 方便一次性存和取数据,但是不方便更新数据 redis 缓存 key常量命名规则示例…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis及Ubuntu14下搭建SSDB主从环境
Redis及Ubuntu14下搭建SSDB主从环境 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Redis及Ubuntu14下搭建SSDB主从环境》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 在工作中接触到了Redis,Redis是一个非常高效的key-value的数据库,在项目中广泛使用,但是redis很明显的缺点是对于内存的处理,在项目上线之初,必须对内存规划合理,否则很容易出现内存爆了的现象,一般较合理的内存大小为电脑物理内存的3/5。 Redis提供了多种数据类型,我经常使用的为String 、Hash、List、Set、Sorted Set,基本能满足项目对于数据类型的要求。我们使用的是Redis的Java客户端,提供了一系列针对Redis命令对应的api。redis的持久化提供了多种策略,但我们没有去做持久化,自己研究了下,AOF方式感觉是最可靠的,原理和Mysql的二进制日志很类似,也是将操作信息记录下来写到文件,从服务器去读取日志并执行操作。 在平常内网开发中可能经常需要调整数据存储细节,所以如果之前的数据依然驻留在内存中,会导致很多功能无法正常运行,所以在调整细节之后,需要对Redis数据库Flushdb操作。 Redis与Ssdb在某些场景很适合使用,比如某些数据在数据库中只能残留2分钟,类似YY频道T人,固定几分钟后才能进来,就可以使用setex key seconds value命令,之后判断是否过期可以通过exists key 命令。 Redis常用命令网站: 涵盖了redis的命令及demo。 在搭Ssdb前说Redis,因为Ssdb很好的兼容了Redis的API。是Redis的很好替代品。 Ssdb相对于Redis来说有很多优点:是Redis数据库的100倍容量,可以存储几十亿的数据量。相对Redis来说,占用内存很少。所以自己也去下载了ssdb,以下是ssdb搭建的过程。 环境:ubuntu14  虚拟机A: 192.168.1.251  虚拟机B: 192.168.1.252  网关: 192.168.1.1  我的两台虚拟机是分别装在不同的物理机上,但都采用的是桥接方式,ip地址都是在同一个ip段。 在两台虚拟机下分别都在线安装下ssdb。 wget–no-check-certificatehttps://github.com/ideawu/ssdb/archive/master.zip unzipmaster cdssdb-master make…
2025-05-10 阅读全文 →
FWQ
服务器教程
如何通过redis减库存的秒杀场景实现
如何通过redis减库存的秒杀场景实现 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《如何通过redis减库存的秒杀场景实现》,介绍一下redis减库存,希望对大家的知识积累有所帮助,助力实战开发! Redis扣库存,主要目的是减少对数据库的访问,之前的减库存,直接访问数据库,读取库存,当高并发请求到来的时候,大量的读取数据有可能会导致数据库的崩溃。 大家可以先读一下《秒杀系统设计》对整体的秒杀流程有个了解之后,在来读一下这篇文章。 本文只是解决秒杀系统中的一个场景即数据预加载,即把库存数据事先加载到缓存,然后通过缓存来更新库存。 使用思路: 系统初始化的时候,将商品库存加载到Redis 缓存中保存。 收到请求的时候,先在Redis中拿到该商品的库存值,进行库存预减,如果减完之后库存不足,直接返回逻辑Exception就不需要访问数据库再去减库存了,如果库存值正确,进行下一步。 将请求入队,立即给前端返回一个值,表示正在排队中,然后进行秒杀逻辑,后端队列进行秒杀逻辑,前端轮询后端发来的请求,如果秒杀成功,返回秒杀,成功,不成功就返回失败。 第一步:系统初始化后就将所有商品库存放入缓存 /** * 秒杀接口优化之--- 第一步: 系统初始化后就将所有商品库存放入 缓存 */ @Override public void afterPropertiesSet() throws Exception { List goods…
2025-05-10 阅读全文 →
FWQ
服务器教程
单线程1KB的Redis写操作有84%都是耗费在内核上
单线程1KB的Redis写操作有84%都是耗费在内核上 收藏 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 的包。…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis作为缓存数据库的优化策略与性能测试
Redis作为缓存数据库的优化策略与性能测试 小伙伴们有没有觉得学习数据库很有意思?有意思就对了!今天就给大家带来《Redis作为缓存数据库的优化策略与性能测试》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你! Redis作为缓存数据库的优化策略与性能测试 随着互联网的快速发展,数据的处理和存储需求越来越高,对于网站和应用程序来说,减少响应时间成为了一项必须要解决的问题。缓存技术作为一个提高响应速度的方案,已成为了一个不可或缺的手段。而Redis作为一种基于内存的高性能键值存储系统,已成为了选择缓存数据库的首选技术之一。本文将着重探讨Redis作为缓存数据库的优化策略与性能测试。 一、Redis作为缓存数据库的优化策略 1.数据的压缩和序列化 Redis的数据是存储在内存中的,因此对Redis服务器的内存使用进行优化是非常重要的。使用Redis的RDB和AOF两种持久化方法可以将内存中的数据写入到磁盘中,但这仍然会占用服务器的内存,同时影响写入和读取的速度。在这种情况下,我们可以使用压缩算法对数据进行压缩,同时使用二进制序列化技术,大幅度减少了占用内存的空间,降低了内存使用率,并提高了性能。 2.设置过期时间 Redis的数据具有很短的生命周期,因此设置过期时间可以减少内存的使用并提高性能。通过使用TTL命令可以为数据设置过期时间,这将会自动地删除到期的数据。我们可以根据数据的生命周期来为数据设置过期时间,从而优化Redis的内存使用。 3.使用Redis集群 当Redis的内存使用过多时,单个Redis服务器可能会出现性能瓶颈。为了解决这个问题,我们可以使用Redis集群来扩展Redis的能力。Redis集群可以将多个Redis服务器组合在一起,以提高性能和可扩展性。通过将数据分散到不同的节点上,Redis集群可以支持更多的请求,并在负载均衡方面表现得更好。 4.使用流水线技术 通过使用Redis的流水线技术,可以提高Redis服务器的吞吐量。因为Redis是单线程的,所以当需要处理大量的请求时,处理这些请求将会成为瓶颈。使用流水线技术可以为Redis提供更高的吞吐量,从而提高性能。流水线技术允许客户端在一个单独的连接中发送多个请求,而不需要等待每次响应。 二、性能测试 Redis的性能测试分为两个部分:读写性能测试和压力测试。 1.读写性能测试 读写性能测试是测试Redis服务器的基本读写能力。在这个测试中,我们将使用Redis的PING和SET命令,同时设置了100000个键和对应的值。结果显示,在读测试中,Redis 3.2.8每秒可以执行241327个命令,而在写测试中,Redis 3.2.8每秒可以执行212765个命令。这个结果非常令人惊叹,并表明Redis可以处理大量的请求。 2.压力测试 在Redis的压力测试中,我们使用的是Redis-benchmark工具,该工具可以测试Redis服务器在高并发情况下的性能。在这个测试中,我们将使用100个并发连接向Redis服务器发送1,000,000个SET命令。结果显示,Redis 3.2.8可以处理最高达34098个写操作,以及最高达29045个读操作。这个测试结果证明,Redis可以在高负载下保持卓越的性能。 结论 Redis作为缓存数据库的优化策略与性能测试的结果表明,Redis可以提供高效的读写性能和可扩展性。通过优化Redis服务器的内存使用,设置过期时间,使用Redis集群和流水线技术,可以进一步提高Redis的性能。在高负载下测试结果表明Redis可以在高负载下保持卓越的性能。因此,Redis作为一个高性能缓存数据库,不仅可以提供更快的响应时间,而且也是一个可靠的解决方案,可以满足大多数Web应用程序的需求。 微软发布全新功能:PowerPoint for Windows应用迎来提词器革新 阿斯顿·马丁加速电动化进程,向吉利购买零部件以支持未来车型
2025-05-10 阅读全文 →