分类归档

服务器教程

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

FWQ
服务器教程
Redis的使用场景是什么
Redis的使用场景是什么 0浏览 收藏 IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Redis的使用场景是什么》,聊聊,我们一起来看看吧! Redis常用命令总结:包括时间复杂度总结与具体数据类型在Redis内部使用的数据结构; Redis的高级功能:包括持久化、复制、哨兵、集群介绍; 理解Redis:理解内存、阻塞;这部分是非常重要的,前面介绍的都可以成为术,这里应该属于道的部分; 开发技巧:主要是一些开发实战的总结,包括缓存设计与常见坑点。 先来开启第一部分的内容,对Redis来一次重新打量。 本系列内容基于:redis-3.2.12 Redis不是万金油 在面试的时候,常被问比较下Redis与Memcache的优缺点,个人觉得这二者并不适合一起比较,一个是非关系型数据库不仅可以做缓存还能干其它事情,一个是仅用做缓存。常常让我们对这二者进行比较,主要也是由于Redis最广泛的应用场景就是Cache。那么Redis到底能干什么?又不能干什么呢? Redis都可以干什么事儿 缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效; 排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定; 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力; 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能; 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦; Session共享,以PHP为例,默认Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。 Redis不能干什么事儿 Redis感觉能干的事情特别多,但它不是万能的,合适的地方用它事半功倍。如果滥用可能导致系统的不稳定、成本增高等问题。 比如,用Redis去保存用户的基本信息,虽然它能够支持持久化,但是它的持久化方案并不能保证数据绝对的落地,并且还可能带来Redis性能下降,因为持久化太过频繁会增大Redis服务的压力。 简单总结就是数据量太大、数据访问频率非常低的业务都不适合使用Redis,数据太大会增加成本,访问频率太低,保存在内存中纯属浪费资源。 选择总需要找个理由 上面说了Redis的一些使用场景,那么这些场景的解决方案也有很多其它选择,比如缓存可以用Memcache,Session共享还能用MySql来实现,消息队列可以用RabbitMQ,我们为什么一定要用Redis呢? 速度快,完全基于内存,使用C语言实现,网络层使用epoll解决高并发问题,单线程模型避免了不必要的上下文切换及竞争条件; 注意:单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理 丰富的数据类型,Redis有8种数据类型,当然常用的主要是…
2024-12-01 阅读全文 →
FWQ
服务器教程
Linux命令操作和redis安装使用的方法是什么
Linux命令操作和redis安装使用的方法是什么 0浏览 收藏 有志者,事竟成!如果你在学习数据库,那么本文《Linux命令操作和redis安装使用的方法是什么》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~ 电脑操作系统 : windows7,8,10,xp,win98       操作系统 : linux ax unix     以后开发项目是部署在服务器上,服务器一般采用linux.     linux的优点:系统稳定,操作速度快,系统安全..     linux可以部署 : 数据库 tomcat 缓存(redis).....   1.如果安装虚拟机,必须把金山毒霸,360防护退出(禁用vmware程序)      指令:     通用语法:       命令后面不接 ./  或者  ../  表示是当前目录.       ./ 表示当前目录       ../表示上一层目录       /表示根目录               clear清屏          磁盘管理:     ls list 显示目录下的数据:       -l : 详细列别       -r : 反序       -t : 日期       需要记住的是 ll       ll -a       -a : 表示所有文件都显示.…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis实现高并发计数器
Redis实现高并发计数器 0浏览 收藏 亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Redis实现高并发计数器》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下Redis计数器,希望所有认真读完的童鞋们,都有实质性的提高。 业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制调用次数为例: /** * 是否拒绝服务 * @return */ private boolean denialOfService(String userId){ long count=JedisUtil.setIncr(DateUtil.getDate()+"&"+userId+"&"+"queryCarViolation", 86400); if(count /** * 查询违章 * @param plateNumber车牌 * @param vin…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis是如何存储对象和集合的
Redis是如何存储对象和集合的 0浏览 收藏 本篇文章向大家介绍《Redis是如何存储对象和集合的》,主要包括存储、对象、Redis,具有一定的参考价值,需要的朋友可以参考一下。 在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术。前者主要是为了减轻数据库压力,大幅度提升性能。后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异步),并且像ribbmitmq等消息队列有重试机制等功能。 这里主要讲redis如何把对象,集合存入,并且取出。 1.在启动类上加入如下代码 private Jedis jedis;private JedisPoolConfig config;private JedisShardInfo sharInfo;@Beanpublic Jedis jedis(){//连接redis服务器,192.168.0.100:6379// jedis = new Jedis("192.168.0.100", 6379);// //权限认证// jedis.auth("123456");// 操作单独的文本串config = new JedisPoolConfig();  config.setMaxIdle(1000);//最大空闲时间config.setMaxWaitMillis(1000); //最大等待时间config.setMaxTotal(500); //redis池中最大对象个数sharInfo = new JedisShardInfo("192.168.0.100", 6379);  sharInfo.setPassword("123456");  sharInfo.setConnectionTimeout(5000);//链接超时时间jedis = new Jedis(sharInfo);return jedis;  2.在application.yml当中加入redis配置 spring:    redis:      database: 0      host: 101.132.191.77      port: 6379      password: 123456      pool:        max-idle: 8 #连接池最大连接数(使用负值表示没有限制)        min-idle: 0 # 连接池中的最小空闲连接        max-active: 8 # 连接池最大阻塞等待时间(使用负值表示没有限制)        max-wait: -1 # 连接池中的最大空闲连接       timeout: 5000 # 连接超时时间(毫秒)  3.新建SerializeUtil类,这个类主要是为了将对象序列化redis当中 import java.io.ByteArrayInputStream;  import java.io.ByteArrayOutputStream;  import java.io.ObjectInputStream; …
2024-12-01 阅读全文 →
FWQ
服务器教程
redis中5种数据基础查询命令
redis中5种数据基础查询命令 0浏览 收藏 数据库小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《redis中5种数据基础查询命令》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发! (一)key查询 1.查询所有key KEY * 2.查询包含某个字符的key KEY *字符* 例如查询key包含字符chen可用 KEY *chen* 3.查询key的类型 TYPE key 4.查询某个键是否存在 EXISTS key (二)5种数据类型查询命令 1.string查询 1.1 查询string类型键的值 GET string_key 1.2查询string类型键的长度 STRLEN…
2024-12-01 阅读全文 →
FWQ
服务器教程
如何利用Redis和C++实现发布-订阅功能
如何利用Redis和C++实现发布-订阅功能 收藏 欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《如何利用Redis和C++实现发布-订阅功能》,这篇文章主要讲到等等知识,如果你对数据库相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习! 如何利用Redis和C++实现发布-订阅功能,需要具体代码示例 引言:Redis是一种开源的高性能键值存储系统,它支持多种数据结构,并提供了一系列的客户端库,适用于各种编程语言。Redis的发布-订阅功能是其最常用的功能之一,可以实现消息的发布和订阅,非常适用于实时通信、发布系统等场景。本文将介绍如何使用Redis和C++来实现发布-订阅功能,并附带详细的代码示例。 步骤一:安装Redis首先,我们需要安装Redis服务器。可以从Redis官方网站(https://redis.io/)下载最新的稳定版本,并按照官方文档进行安装和配置。安装完成后,确保Redis服务器已经在本地运行,并监听默认的6379端口。 步骤二:连接Redis服务器现在我们开始编写C++代码,首先需要连接Redis服务器。使用hiredis库可以轻松地完成与Redis服务器的通信。hiredis是一个简单、高性能的C客户端库,支持阻塞和非阻塞式操作,与Redis服务器进行通信。 首先,我们需要在C++项目中包含hiredis库的头文件,并链接hiredis库。示例代码如下: #include <iostream> #include <hiredis/hiredis.h> 接下来,我们需要定义一个函数来连接Redis服务器。示例代码如下: redisContext* connectToRedis(const char* hostname, int port) { redisContext* conn = redisConnect(hostname, port); if (conn ==…
2024-12-01 阅读全文 →
FWQ
服务器教程
一文聊聊 Redis 的缓存场景
一文聊聊 Redis 的缓存场景 0浏览 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《一文聊聊 Redis 的缓存场景》,介绍一下缓存、数据、架构,希望对大家的知识积累有所帮助,助力实战开发!   序言 夏日炎炎,无风。从空调房间出来,再到接近四十度的高温,这个过程,缓存预热了解一下…… 为什么要用缓存?因为追求性能,因为要追求极致的用户体验。 缓存理论 1、缓存适合的场景 缓存,就是将一些需要读取数据放在磁盘或者内存中,由于是追求速度,从而一般放在内存中。 在读取数据的时候,一般是从关系型数据库中读取数据,在数据库层面也可以进行各种优化,例如读性能不足,那么可以添加几个从库,从而数据库的一主多从;例如写性能不足,那么可以分库分表。 在有些场景中,要使用缓存,是因为无法解决读的速度,例如count(*)的操作,无论从数据库的层面如何优化,都不可能提高;还有一种就是sql的执行本身就必须消耗很多资源和时间,例如各种关联查询子查询,这些时候,都可以将这些数据放在缓存当中,从而大大的减轻数据库的压力。 2、缓存穿透问题 在使用缓存的时候,第一个问题就是缓存穿透的问题,就是使用了缓存和没使用缓存是一样的,应用程序到缓存中查询数据,发现数据么有,那么就去数据库查询,在这里,穿透了缓存,缓存没起到保护数据库的作用。 在爬虫爬取网页的时候,每个分页都会爬取,而对于缓存的分页数据,一般只缓存了热点数据,也就是前几页的数据在缓存当中,如果全部爬取,那么就会造成缓存不命中,导致查询数据库;还有一种就是故意搜索一些不存在的关键字,而这些搜索的结果都没有数据,在数据库中也不存在数据,从而造成缓存穿透。 此种解决方法就是:当用户进行第一次查询的时候发现结果为空,那么可以将结果放在缓存中,设置一个短暂的过期时间,从而可以缓解穿透的问题;而对于爬虫的爬取数据,只能进行监控,然后进行访问的IP,依旧只能缓解,不能完全解决。 3、缓存雪崩的问题 缓存雪崩指的是当缓存失效之后,从而引起系统性能的急剧下降,导致数据库不可用从而系统挂掉。 缓存最关键的地方就是内存,当内存满了之后,会有各种策略将缓存进行失效,在分布式环境下,如果有一个缓存失效,而恰好这个缓存是一个热点数据,前端有10个应用都需要访问这个缓存,并且TPS很高的话,那么全部的线程都会去访问数据库,从而能直接将数据库拖垮。 应对缓存雪崩,有很多策略,例如可以设置两个缓存的key,而具有不同的失效时间,当key1失效之后,访问key2,然后更新key1和key2;可以使用分布式锁,从而当应用发现缓存失效之后,拿到锁的线程才去更新缓存;可以使用消息通知机制,当应用发现缓存失效之后,发送消息,然后后台线程进行更新缓存,后台线程会检测缓存中是否存在缓存,如果存在就不更新;专门用一个后台线程来更新缓存,快速的检测缓存是否存在,然后更新缓存,此种也可以解决缓存不一致的问题。 4、缓存命名和失效时间 在使用缓存的时候,都需要一个key,那么这个key怎么命名呢?key太长,占用内存,会使得缓存中能存储的数据减少;key一般的命名规则可以为SQL:1782,表示为这是缓存一个sql的结果,然后用冒号分割,然后表示为缓存的编号,可以为各种sql条件的hash后的结果,这种命名规则的好处就是,在每次在缓存里查询的时候,可以使用通配符,从而可以查询到有多少个缓存在系统中。 缓存的失效时间,这个和业务强相关,对于一些时效性比较高的数据,就不能放在缓存当中,而对于一些不经常变化的数据,可以放在缓存当中,例如一天,缓存主要是应对读多写上的应用,从而大部分的数据例如在搜索的结果的分页数据,这种实时性无须太高,可以放在缓存当中。。。主要看业务的容忍程度,也影响到一部分的用户体验,可能我放入了缓存,更新了,刷新下,还没有更新。…
2024-12-01 阅读全文 →
FWQ
服务器教程
如何使用Redis和C#开发分布式事务功能
如何使用Redis和C#开发分布式事务功能 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《如何使用Redis和C#开发分布式事务功能》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了! 如何使用Redis和C#开发分布式事务功能 引言分布式系统的开发中,事务处理是一项非常重要的功能。事务处理能够保证在分布式系统中的一系列操作要么全部成功,要么全部回滚。Redis是一种高性能的键值存储数据库,而C#是一种广泛应用于开发分布式系统的编程语言。本文将介绍如何使用Redis和C#来实现分布式事务功能,并提供具体代码示例。 I. Redis事务Redis支持事务处理,通过将一系列操作组合成一个原子操作,以保证事务的一致性。一个Redis事务可包含一组命令,这些命令将按照其执行顺序进行排列。在Redis事务中,所有的命令都会提交执行,或者回滚到事务开始前的状态。 在C#中,我们可以使用StackExchange.Redis库来与Redis进行交互。下面是一个使用Redis事务的代码示例: using StackExchange.Redis; // 连接到Redis服务器 var connection = ConnectionMultiplexer.Connect("localhost"); // 创建一个事务 var transaction = connection.GetDatabase().CreateTransaction(); // 将命令添加到事务中 transaction.StringSetAsync("key1", "value1"); transaction.StringSetAsync("key2", "value2");…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis内存碎片产生原因及Pipeline管道原理解析
Redis内存碎片产生原因及Pipeline管道原理解析 0浏览 收藏 在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Redis内存碎片产生原因及Pipeline管道原理解析》,聊聊管道、Pipeline、Redis内存碎片,希望可以帮助到正在努力赚钱的你。 内存碎片 内存碎片如何产生的? Redis内部有自己的内存分配器,默认是jemalloc,为了提高内存使用的效率,来对内存的申请和释放进行管理。 而内存分配器按照固定大小分配内存,并不是完全按照程序申请的内存大小来进行分配。 比如程序申请一个20字节的内存,内存分配器会分配一个32字节的内存空间,这么做是为了减少分配次数。redis会申请不同大小的内存空间来存储不同业务不同类型的数据,由于内存按照固定大小分配且会比实际申请的内存要大一些,这个过程中会产生内存碎片。 举个例子: 我们用高铁车厢说明,假设一个车厢的座位总共有60个,现在已经卖 了57张票,需要三张连在一起的票,但发现买不到了,只好换一趟车。我们可以把这些分散的空座位叫作车厢座位碎片。 内存碎片类似上面高铁座位的例子。虽然操作系统的剩余空间总量足够,但申请一块连续地址空间N字节时,剩余内存空间中没有大小为N字节的连续空间,那么这些剩余空间就是内存碎片。 Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。 内存分配器 在编译时指定的Redis使用的内存分配器,可以是libc、jemalloc、tcmalloc,默认是jemalloc。 jemalloc在64位系统中,将内存空间划分为小、大、巨大三个范围;每个范围内又划分了许多小的内存块单位;存储数据的时候,会选择大小最合适的内存块进行存储。 jemalloc划分的内存单元如下图所示: 也就是说Redis是以指定大小的块为单位进行连续内存分配的,而不是按需分配的。Redis 会根据申请的内存最接近的固定值分配相应大小的空间。 这就像你有不同的箱子,为了装东西,你需要找一个体积最接近的箱子来装。但是装进去后,你发现还有空间可以放一些小东西,就无需再找箱子了。但是,这种分配空间的方式会带来一定程度的内存碎片。我们可以把固定大小的划分空间看成不同体积的箱子,每种箱子里的空间不同程度上都会有剩余。这些剩余的空间就是内存碎片。 怎么看是否有内存碎片? 我们登陆到Redis服务器上,执行以下命令: redis> info memory 我们会看到这些信息: 指标mem_fragmentation_ratio:1.86…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis实现分布式锁的原理和实现方式
Redis实现分布式锁的原理和实现方式 收藏 哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《Redis实现分布式锁的原理和实现方式》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧! 随着分布式系统的普及,分布式锁变得越来越重要。分布式锁是一种保证在分布式系统中同时只能有一个进程或者线程进行操作的机制。在许多分布式环境下的应用程序中,分布式锁是一个非常常见的问题。Redis是一个高性能的支持多种数据结构的内存数据库,在分布式锁方面有着广泛的应用。本文将介绍Redis实现分布式锁的原理和实现方式。 一、Redis实现分布式锁的原理 在分布式系统中实现一个锁需要解决一些问题,比如如何实现互斥,如何保证一致性等。对于Redis实现分布式锁,其主要的原理是通过Redis的事务来保证锁的互斥和一致性。Redis事务提供了一种将多个命令打包成一个事务、然后一次性执行的能力。在发出事务的同时服务器会开始记录一个事务执行的 Redis 命令序列。 因此,Redis实现分布式锁主要有以下三个步骤: 1、尝试获取锁 在Redis中,可以使用SETNX命令(SET if Not eXists)来判断某个key是否存在,如果不存在则返回1并设置key的值,如果key已经存在则返回0。因此,可以利用SETNX命令来实现获取锁的过程。 2、设置锁的超时时间 为了防止锁死,需要为锁设置一个超时时间,当锁的持有者在一段时间后还未释放锁,那么锁就会被强制释放。 3、释放锁 利用Redis事务中的DEL命令来释放锁,将锁的key从Redis中删除。 二、Redis实现分布式锁的实现方式 通过以上步骤的介绍,我们可以知道Redis实现分布式锁的主要原理是通过SETNX命令进行抢锁,从而通过事务来进行加锁和解锁操作。在此基础上,我们将介绍Redis实现分布式锁的两种实现方式:基于Redis单节点和基于Redis集群。 1、基于Redis单节点 我们可以通过简单的使用Redis SETNX和DEL两个命令来轻松实现基于Redis单节点的分布式锁,代码如下所示。 public Boolean tryLock(String key,…
2024-12-01 阅读全文 →