自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Java中文社群

持续提供优质的 Java 文章。

  • 博客(122)
  • 论坛 (1)
  • 收藏
  • 关注

转载 聊聊近期的感受和10月文章精选!

先来看本月的原创文章汇总,其中算法部分也有少量 9 月份的文章,这样汇总起来大家看起来更方便,目录如下。算法系列小白学算法第1篇:一文详解「栈」和手撸栈的两种方法!小白学算法第2篇:JD...

2020-10-30 08:00:00 38

原创 小白学算法:买卖股票的最佳时机!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)本文已收录至 Github《小白学算法》系列:https://github...

2020-10-29 08:00:00 50

原创 如何设计不宕机的 Redis 高可用服务?

随着业务的不断发展和扩张我们需要更加稳定和高效的 Redis 服务,这是业务发展的必然趋势也是个人能力进阶的最高境界,我们需要一个高可用的 Redis 服务,来支撑和保证业务的正常运行。我们本文的面试题是,如何设计一个不宕机的 Redis 高可用服务?典型回答想要设计一个高可用的 Redis 服务,那么一定要从 Redis 的多机功能来考虑,比如 Redis 的主从、哨兵以及 Redis 集...

2020-10-28 16:11:00 41

原创 Redis 面试题补充与汇总

前面的 12 个章节对 Redis 的面试题做了一个系统的讲解,那么本文将对 Redis 的热门面试题再做一个补充,力求覆盖到更多的 Redis 面试点。Redis 持久化Redis 持久化总共有以下三种方式:快照方式(RDB, Redis DataBase)将某一个时刻的内存数据,以二进制的方式写入磁盘;文件追加方式(AOF, Append Only File),记录所有的操作命令,并...

2020-10-28 16:11:00 34

原创 使用 Redis 如何实现延迟队列?

延迟消息队列在我们的日常工作中经常会被用到,比如支付系统中超过 30 分钟未支付的订单,将会被取消,这样就可以保证此商品库存可以释放给其他人购买,还有外卖系统如果商家超过 5 分钟未接单的订单,将会被自动取消,以此来保证用户可以更及时的吃到自己点的外卖,等等诸如此类的业务场景都需要使用到延迟消息队列,又因为它在业务中比较常见,因此这个知识点在面试中也会经常被问到。我们本文的面试题是,使用 Red...

2020-10-28 16:10:59 76

原创 常用的 Redis 优化手段有哪些?

每个软件的常规操作有两种,一种是使用,另一种就是调优,对于 Redis 来说也是一样。关于 Redis 调优的问题一般会出现在 Redis 面试的后期,以此来考察面试者对于 Redis 的实际应用掌握,以及对于 Redis 高性能的追求与理解,因此本文就来重点的聊一聊关于 Redis 调优的相关问题。我们本文的面试题是,Redis 常见的优化手段有哪些?典型回答最有效的提高 Redis 性能...

2020-10-28 16:10:59 30

原创 Redis 如何实现分布式锁?

锁是多线程编程中的一个重要概念,它是保证多线程并发时顺利执行的关键。我们通常所说的“锁”是指程序中的锁,也就是单机锁,例如 Java 中的 Lock 和 ReadWriteLock 等,而所谓的分布式锁是指可以使用在多机集群环境中的锁。我们本文的面试题是,使用 Redis 如何实现分布式锁?## 典型回答首先来说 Redis 作为一个独立的三方系统(通常被作为缓存中间件使用),其天生的优势...

2020-10-28 16:10:58 58

原创 如何保证 Redis 消息队列中的数据不丢失?

Redis 最常见的业务场景就是缓存读取与存储,而随着时间的推移,有人开始将它作为消息队列来使用了,并且随着 Redis 版本的发展,在 Redis.2.0.0 中新增了发布订阅模式(Pub/Sub)代表着官方开始正式支持消息队列的功能了,直到今天为止还有部分公司在实现轻量级的消息队列时,依然会选择使用 Redis 来实现。并且消息队列的知识点也会作为一个进阶型的面试题经常出现在面试当中。我们本...

2020-10-28 16:10:58 131

原创 如何在海量数据中查询一个值是否存在?

一般面试中考察的题目通常是由三类组成的,基础面试题、进阶面试题、开放性面试题,而本文的题目则属于一个开放性的面试题,但对于 Redis 这种以数据为核心的缓存中间件来说,实现在海量数据中查询一个值是否存在还是相对比较容易的。因为是海量数据,所以我们就无法将每个键值都存起来,然后再从结果中检索数据了,比如数据库中的 select count(1) from tablename where id='...

2020-10-28 16:10:58 62

原创 Redis 内存用完会怎样?

在某些极端情况下,软件为了能正常运行会做一些保护性的措施,比如运行内存超过最大值之后的处理,以及键值过期之后的处理等,都属于此类问题,而专业而全面的回答这些问题恰好是一个工程师所具备的优秀品质。我们本文的面试题是 Redis 内存用完之后会怎么?典型回答Redis 的内存用完指的是 Redis 的运行内存超过了 Redis 设置的最大内存,此值可以通过 Redis 的配置文件 redis.c...

2020-10-28 16:10:57 33

原创 Redis 如何处理已经过期的数据?

上一篇我们讲了 Redis 内存用完之后的内存淘汰策略,它主要是用来出来异常情况下的数据清理,而本文讲的是 Redis 的键值过期之后的数据处理,讲的是正常情况下的数据清理,但面试者常常会把两个概念搞混,以至于和期望的工作失之交臂。我们本文的职责之一就是帮读者朋友搞清楚二者的区别,相信看完本文你就会对二者的概念有一个本质上的认识。我们本文的面试题是,Redis 如何处理已过期的数据?典型回答...

2020-10-28 16:10:57 83

原创 Redis 有哪些数据类型?

Redis 的数据类型可谓是 Redis 的精华所在,同样的数据类型,例如字符串存储不同的值对应的实际存储结构也是不同,当你存储的 int 值是实际的存储结构也是 int,如果是短字符串(小于 44 字节)实际存储的结构为 embstr,长字符串对应的实际存储结构是 raw,这样设计的目的是为了更好的节约内存。我们本文的面试题是 Redis 有哪些数据类型?典型回答Redis 最常用的数据类...

2020-10-28 16:10:56 65

原创 如何实现查询附近的人?

查询附近的人或者是附近的商家是一个实用且常用的功能,比如微信中“附近的人”或是美团外卖中“附近商家”等,如下图所示:那它是如何实现的呢?我们本文就一起来看。我们本文的面试题是,使用 Redis 如何实现查询附近的人?典型回答在说如何实现地理位置查询之前,首先我们需要搞清楚地理位置查询的基础知识。我们所处的任何位置都可以用经度和纬度来标识,经度的范围 -180 到 180,纬度的范围为:...

2020-10-28 16:10:56 48

原创 Redis 属于单线程还是多线程?不同的版本有什么区别?

Redis 是普及率最高的技术之一,同时也是面试中必问的一个技术模块,所以从今天开始我们将从最热门的 Redis 面试题入手,更加深入的学习和了解一下 Redis。我们本文的面试题是 Redis 属于单线程还是多线程?典型回答本文的问题在不同的 Redis 版本下答案是不同的,在 Redis 4.0 之前,Redis 是单线程运行的,但单线程并不意味着性能低,类似单线程的程序还有 Nginx...

2020-10-28 16:10:55 124

原创 Redis 如何实现限流功能?

“限流”这种事在生活中很常见,比如逢年过节时景点的限流,还有工作日的车辆单双号限流等,有人可能会问为什么要限流?我既然买了车子你还不让我上路开?还有我倒景点买了门票,景点不是能赚更多的钱吗?为什么要限流呢?其实限流的主要目的就是为了保证整个系统的正常运行,比如以车辆限流为了,它的作用主要有两个,一个是为了保证我们生存空间的资源少受污染,尤其是近几年雾霾已经越来越严重了,如果不采取相应的手段会导致...

2020-10-28 16:10:55 397

原创 附录:更多有序集合操作命令

查询有序集合的总个数语法:zcard key示例:127.0.0.1:6379> zcard zset1(integer) 4查询 score 区间内的元素个数语法:zcount key min max示例:127.0.0.1:6379> zcount zset1 0 10(integer) 4累加元素的 score 值语法:zincrby key incre...

2020-10-28 16:10:06 20

原创 附录:更多列表操作命令

在某值之前/之后添加某个元素语法:linsert key before|after pivot value示例:127.0.0.1:6379> linsert list3 before b A(integer) 4127.0.0.1:6379> lrange list3 0 -1"a""A""b""c"根据下标修改元素语法:lset key index valu...

2020-10-28 16:10:05 25

原创 附录:更多集合操作命令

移除并返回集合中的一个随机元素语法:spop key [count]示例:127.0.0.1:6379> smembers myset1) "v1"2) "v2"127.0.0.1:6379> spop myset 11) "v2"127.0.0.1:6379> smembers myset1) "v1"随机返回集合中指定数量的元素列表语法:srandme...

2020-10-28 16:10:05 21

原创 附录:更多字符串操作命令

键值对过期操作a.添加键值对并设置过期时间语法:set key value [expiration EX seconds|PX milliseconds] [NX|XX]示例:127.0.0.1:6379> set k1 val1 ex 1000OK设置键值对 k1=val1,过期时间为 1000 秒。查询键的过期时间可以使用 ttl key,如下代码所示:127.0.0....

2020-10-28 16:10:04 26

原创 附录:更多字典操作命令

插入一个或多个元素语法:hmset key field value [field value …]示例:127.0.0.1:6379> hmset myhash k1 val1 k2 val2OK127.0.0.1:6379> hmget myhash k1 k21) "val1"2) "val2"查询一个或多个元素语法:hmget key field [field...

2020-10-28 16:10:04 16

原创 技能学习指南

经过前面文章的学习,我相信一定有一半的人看懂了,而另一半人一定是似懂非懂或者是完全不懂,如果你属于前者,那恭喜你,但如果没看懂,也没关系,本文来给你具体的解决方案。我们来仔细回忆两件事,第一件是大学考级学的那些英语,我每个单词每个语句当时都背的滚瓜烂熟,那时候你也以为这些东西你都会了吧?但你现在还能记起多少呢?我们再来回忆一下,我们小的时候学习骑自行车的本领,即使相隔很多年,但依旧没能忘记,这...

2020-10-28 16:10:03 38

原创 加餐:Redis 的可视化管理工具

因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli,以至于我们在使用的时候会比较麻烦,通常要输入一堆命令,而且命令行版的客户端看起来也不够直观,基于以上两个原因我们需要找一个可视化的 Redis 客户端,下面是我这些年使用过的一些 Redis 可视化客户端,分享给大家。RedisClient是否收费:免费。项目介绍:Java 编写的 Redis 连接客户端,功能...

2020-10-28 16:10:03 33

原创 实战:Redis 集群模式(下)

上篇文章我们讲了 Redis 集群的搭建与节点的动态添加和删除,我们这里再来简单的复习一下,其中 30001~30006 是我们最初搭建的集群,而 30007 和 30008 是后面动态添加的主从节点,我们使用 --cluster info 命令来看一下主节点和槽位的分配情况,执行代码如下:$ redis-cli --cluster info 127.0.0.1:30001127.0.0.1:...

2020-10-28 16:10:02 19

原创 案例:Redis 问题汇总和相关解决方案

本文收集了一些 Redis 使用中经常遇到的一些问题,和与之相对应的解决方案,这些内容不但会出现在实际工作中,也是面试的高频问题,接下来一起来看。缓存雪崩缓存雪崩是指在短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成了巨大的压力,严重情况下可能会导致数据库宕机的情况叫做缓存雪崩。我们先来看下正常情况下和缓存雪崩时程序的执行流程图,正常情况下系统的执行流程如下图所示...

2020-10-28 16:10:02 15

原创 实战:Redis 哨兵模式(下)

上一篇我们介绍了 Redis Sentinel 的搭建和运行原理,本文我们重点来看下 Sentinel 的命令操作和代码实战。Sentinel 命令操作要使用 Sentinel 实现要连接到 Sentinel 服务器,和连接 Redis 服务相同,我们可以使用 redis-cli 来连接 Sentinel,如下命令所示:[@iZ2ze0nc5n41zomzyqtksmZ:~]$ redis-...

2020-10-28 16:10:01 20

原创 实战:Redis 集群模式(上)

Redis Cluster 是 Redis 3.0 版本推出的 Redis 集群方案,它将数据分布在不同的服务区上,以此来降低系统对单主节点的依赖,并且可以大大的提高 Redis 服务的读写性能。Redis 将所有的数据分为 16384 个 slots(槽),每个节点负责其中的一部分槽位,当有 Redis 客户端连接集群时,会得到一份集群的槽位配置信息,这样它就可以直接把请求命令发送给对应的节点...

2020-10-28 16:10:01 17

原创 实战:Redis 主从同步

主从同步(主从复制)是 Redis 高可用服务的基石,也是多机运行中最基础的一个。我们把主要存储数据的节点叫做主节点 (master),把其他通过复制主节点数据的副本节点叫做从节点 (slave),如下图所示:在 Redis 中一个主节点可以拥有多个从节点,一个从节点也可以是其他服务器的主节点,如下图所示:主从同步的优点主从同步具有以下三个优点:性能方面:有了主从同步之后,可以把查询...

2020-10-28 16:10:00 21

原创 实战:Redis哨兵模式(上)

上一篇我们讲了主从复制模式,它是属于 Redis 多机运行的基础,但这种模式本身存在一个致命的问题,当主节点奔溃之后,需要人工干预才能恢复 Redis 的正常使用。例如,我们有 3 台服务器做了主从复制,一个主服务器 A 和两个从服务器 B、C,当 A 发生故障之后,需要人工把 B 服务器设置为主服务器,同时再去 C 服务器设置成从服务器并且从主服务器 B 同步数据,如果是发生在晚上或者从服务器...

2020-10-28 16:10:00 20

原创 实战:Redis 性能测试

为什么需要性能测试?性能测试的使用场景有很多,例如以下几个:技术选型,比如测试 Memcached 和 Redis;对比单机 Redis 和集群 Redis 的吞吐量;评估不同类型的存储性能,例如集合和有序集合;对比开启持久化和关闭持久化的吞吐量;对比调优和未调优的吞吐量;对比不同 Redis 版本的吞吐量,作为是否升级的一个参考标准。等等,诸如此类的情况,我们都需要进行性能测...

2020-10-28 16:09:59 41

原创 实战:Redis 慢查询

Redis 慢查询作用和 MySQL 慢查询作用类似,都是为我们查询出不合理的执行命令,然后让开发人员和运维人员一起来规避这些耗时的命令,从而让服务器更加高效和健康的运行。对于单线程的 Redis 来说,不合理的使用更是致命的,因此掌握 Redis 慢查询技能对我们来说非常的关键。如何进行慢查询?在开始之前,我们先要了解一下 Redis 中和慢查询相关的配置项,Redis 慢查询重要的配置项有...

2020-10-28 16:09:59 25

原创 实战:Redis 性能优化方案

Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1)),但由于 Redis 是单线程执行的特点,因此它对性能的要求更加苛刻,本文我们将通过一些优化手段,让 Redis 更加高效的运行。本文我们将使用以下手段,来提升 Redis 的运行速度:缩短键...

2020-10-28 16:09:59 29

原创 实战:定时任务案例

我在开发的时候曾经遇到了这样一个问题,产品要求给每个在线预约看病的患者,距离预约时间的前一天发送一条提醒推送,以防止患者错过看病的时间。这个时候就要求我们给每个人设置一个定时任务,用前面文章说的延迟队列也可以实现,但延迟队列的实现方式需要开启一个无限循环任务,那有没有其他的实现方式呢?答案是肯定的,接下来我们就用 Keyspace Notifications(键空间通知)来实现定时任务,定时任务...

2020-10-28 16:09:58 36

原创 实战:RediSearch 高性能的全文搜索引擎

RediSearch 是一个高性能的全文搜索引擎,它可以作为一个 Redis Module(扩展模块)运行在 Redis 服务器上。RediSearch 主要特性如下:基于文档的多个字段全文索引高性能增量索引文档排序(由用户在索引时手动提供)在子查询之间使用 AND 或 NOT 操作符的复杂布尔查询可选的查询子句基于前缀的搜索支持字段权重设置自动完成建议(带有模糊前缀建议)精...

2020-10-28 16:09:58 89

原创 实战:布隆过滤器安装与使用及原理分析

我们前面有讲到过 HyperLogLog 可以用来做基数统计,但它没提供判断一个值是否存在的查询方法,那我们如何才能查询一个值是否存在于海量数据之中呢?如果使用传统的方式,例如 SQL 中的传统查询,因为数据量太多,查询效率又低有占用系统的资源,因此我们需要一个优秀的算法和功能来实现这个需求,这是我们今天要讲的——布隆过滤器。开启布隆过滤器在&nbsp...

2020-10-28 16:09:57 31

原创 完整案例:实现延迟队列的两种方法

延迟队列是指把当前要做的事情,往后推迟一段时间再做。延迟队列在实际工作中和面试中都比较常见,它的实现方式有很多种,然而每种实现方式也都有它的优缺点,接下来我们来看。延迟队列的使用场景延迟队列的常见使用场景有以下几种:超过 30 分钟未支付的订单,将会被取消外卖商家超过 5 分钟未接单的订单,将会被取消在平台注册但 30 天内未登录的用户,发短信提醒等类似的应用...

2020-10-28 16:09:57 101

原创 消息队列终极解决方案——Stream(上)

在 Redis 5.0 Stream 没出来之前,消息队列的实现方式都有着各自的缺陷,例如:发布订阅模式 PubSub,不能持久化也就无法可靠的保存消息,并且对于离线重连的客户端不能读取历史消息的缺陷;列表实现消息队列的方式不能重复消费,一个消息消费完就会被删除;有序集合消息队列的实现方式不能存储相同 value 的消息,并且不能阻塞读取消...

2020-10-28 16:09:55 22

原创 消息队列终极解决方案——Stream(下)

在开始使用消息分组之前,我们必须手动创建分组才行,以下是几个和 Stream 分组有关的命令,我们先来学习一下它的使用。消息分组命令创建消费者群组127.0.0.1:6379> xgroup create mq group1 0-0 OK相关语法: xgroup create stream-key group-key ID其中:mq 为&n...

2020-10-28 16:09:55 15

原创 实战:分布式锁详解与代码

什么是锁?锁是一种常用的并发控制机制,用于保证一项资源在任何时候只能被一个线程使用,如果其他线程也要使用同样的资源,必须排队等待上一个线程使用完。锁的示意图,如下所示:什么是分布式锁?上面说的锁指的是程序级别的锁,例如 Java 语言中的 synchronized 和 ReentrantLock 在单应用中使用不会有任何问题,但如果放到分布式环境下...

2020-10-28 16:09:55 17

原创 消息队列——发布订阅模式

在 Redis 中提供了专门的类型:Publisher(发布者)和 Subscriber(订阅者)来实现消息队列。在文章开始之前,先来介绍消息队列中有几个基础概念,以便大家更好的理解本文的内容。首先,发布消息的叫做发布方或发布者,也就是消息的生产者,而接收消息的叫做消息的订阅方或订阅者,也就是消费者,用来处理生产者发布的消息。除了发布和和订阅者,在消息队列中还有一个重要的概念:channe...

2020-10-28 16:09:54 43

原创 消息队列的其他实现方式

在 Redis 5.0 之前消息队列的实现方式有很多种,比较常见的除了我们上文介绍的发布订阅模式,还有两种:List 和 ZSet 的实现方式。List 和 ZSet 的方式解决了发布订阅模式不能持久化的问题,但这两种方式也有自己的缺点,接下来我们一起来了解一下,先从 List 实现消息队列的方式...

2020-10-28 16:09:54 13

空空如也

我的csdn头像更新了一直显示是旧头像

发表于 2018-04-28 最后回复 2018-04-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除