【Redis 06】聊聊 Redis 的事务

2020-02-08

背景 提到事务想必大家一定不会陌生,工作面试中多多少少都会了解到,这篇文章主要带大家再简单回忆一下事务的基本知识,然后重点介绍下 Redis 的事务,关于 Redis 的事务有何不同我们继续往下看就知道了。 什么事务 说到事务,首先我们需要知道什么是事务。首先事务是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行。事务是一个不可分割的逻辑单元。 事务的四大特性 A(原子性)事务的各步操作是不可分的,保证一系列的操作要么都完成,要么都不完成; C(一致性)事务完成,数据必须处于一致的状态; I(隔离性)对数据进行修改的所有并发事务彼此之间是相互隔离,这表明事务必须是独立的,不应以任何方式依赖或影响其他事务; D(持久性)表示事务对数据处理结束后,对数据更改必须持久化,不管是事务成功还是回滚。事务日志都能够保持事务的永久性。 以上是常规的事务以及事务的特性。下面我们来看一下什么是 Redis 的事务,以及 Redis 事务有什么特殊性质。 Redis 事务 关于 Redis 的性质官方文档如下 MULTI, EXEC, DISCARD an....

【Redis 05】一文带你了解 Redis 的发布与订阅的底层原理

2020-02-08

01、前言 发布订阅系统在我们日常的工作中经常会使用到,这种场景大部分情况我们都是使用消息队列的,常用的消息队列有 Kafka,RocketMQ,RabbitMQ,每一种消息队列都有其特性,关于 Kafka 的使用和源码分析,公号前面有相关的文章,大家可以前往回顾一下,另外两款消息队列大家有需要可以自行研究,后续我们会出相应的介绍文章。这篇文章主要是给大家介绍 Redis 的发布订阅系统,很多时候我们可能不需要独立部署相应的消息队列,只是简单的使用,而且数据量也不会太大,这种情况下,我们就可以使用 Redis 的 Pub/Sub 模型。 02、使用方式 2.1 发布与订阅 Redis 的发布订阅功能主要由 PUBLISH,SUBSCRIBE,PSUBSCRIBE 命令组成,一个或者多个客户端订阅某个或者多个频道,当其他客户端向该频道发送消息的时候,订阅了该频道的客户端都会收到对应的消息。 上图中有四个客户端,Client 02,Client 03,Client 04 订阅了同一个 Sport 频道(Channel),这时当 Client 01 向 Sport Channel 发送消息 ....

【Redis 04】一文带你了解 Redis 的慢日志相关底层原理

2020-02-08

01、前言 相信很多小伙伴在使用 Redis 的时候都知道 Redis 有相关慢日志的查询功能,并且多多少少都看过。那 Redis 底层到底是如果创建慢日志以及慢日志的结构是什么样子的呢?这篇文章就带大家认识一下。我们先看一张慢日志的截图 使用 slowlog get 2 命令查看最近的两条慢日志信息,如上图,我们可以看到每条日志中包含的信息有六个部分组成,从上到下编号为 0-5,依次代表的意思是 0:日志的唯一编号 ID 1:命令执行的当前时间戳 2:命令执行的耗时时长,单位微妙 3:具体的执行命令和参数 4:客户端的 ip 和端口(4.0 版本以上才支持) 5:客户端名称(4.0 版本以上支持) 如上图所示,第一条慢日志的 ID 是 41,命令执行的时间戳是 1575729996,并且执行了 16129 微妙,具体执行的命令就是 slowlog get ,ip 和端口是 27.38.56.88:8223 ,客户端的名称没有设置。 02、慢日志命令设置 查看命令 上面我们已经大概的知道的一条慢日志的格式,自然的我们可以想到的问题是一个命令执行多长时间,我们就可以认为是慢查询,以及慢日....

【Redis 03】一文看懂 Redis 的内存回收策略和 Key 过期策略

2020-02-08

01、前言 Redis 作为当下最热门的 Key-Value 存储系统,在大大小小的系统中都扮演着重要的角色,不管是 session 存储还是热点数据的缓存,亦或是其他场景,我们都会使用到 Redis。在生产环境我们偶尔会遇到 Redis 服务器内存不够的情况,那对于这种情况 Redis 的内存是如何回收处理的呢?另外对于带有过期时间的 Key Redis 又是如何处理的呢? 02、Redis 内存设置 我们都知道如果我们要设置 Redis 的最大内存大小只需要在配置文件 redis.conf 中配置一行 maxmemory xxx 即可,或者我们通过 config set 命令在运行时动态配置 Redis 的内存大小。 03、Redis 内存过期策略 3.1、过期策略的配置 那么当 Redis 内存不够的时候,我们要知道 Redis 是根据什么策略来淘汰数据的,在配置文件中我们使用 maxmemory-policy 来配置策略,如下图 我们可以看到策略的值由如下几种: volatile-lru: 在所有带有过期时间的 key 中使用 LRU 算法淘汰数据; alkeys-lru: 在....

【Redis 02】Redis 简单动态字符串

2020-02-08

大家好,我是鸭血粉丝(大家会亲切的喊我 「阿粉」),是一位喜欢吃鸭血粉丝的程序员,之前给大家总结了线上 OOM 的情况,相信大家也能从中学到一些东西,身为一名有追求的程序员,阿粉我的理解是光会吃老本是不行的,所以我一直也在学习,今天大家就跟我一起来了解一下 Redis 的 SDS 吧(不是 SOS 哦~)。 01、SDS 数据结构 Redis 底层是基于 C 语言来开发的,但是它没有采用 C 语言传统的字符串表示方式,而是自定义了一种叫做 SDS(Sample Dynamic String,简单动态字符串)的数据结构来表示字符串。传统的 C 语言的字符串是采用空字符(\0)作为结尾的字符数组,SDS 的数据结构稍微复杂一点,整个结构包含三个部分,是 Redis 的基础。(阿粉猜测这里就是传说中的青出于蓝而胜于蓝)。 1.1、数据结构 在源码 sds.h/sdshdr 结构体中定于了 SDS 的数据结构,包括三个部分,free,len,buf[],依次含义如下 buf[]:字节数组,用于存放实际的字符串; len:记录 buf 数组中已经使用的字节数量,等同于 SDS 所保存的字符串的长....

【Redis 01】Redis 基本概述与安装

2020-02-08

Redis 作为当下主流的 NoSQL 数据库,已经成为企业级开发不可或缺的一个重要组件了,现在大大小小的项目都会用到它,并且最新的版本已经达到 5.x 了。从这篇文章开始,我们会用一个系列的文章详细的给大家介绍一下 Redis 底层实现和使用场景,希望能帮助大家更好的使用。 01、概述 本篇是 Redis 系列的第一篇文章,我们主要对 Redis 做一下概述,以及详细的安装教程和简单使用,后面的文章会一步一步带大家走进 Redis 的细节部分。 1.1 Redis 简介 学任何一个技术,我们首先看的必定是官网,Redis 的官网是这样介绍的 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, ....

分布式下必备神器之分布式锁

2019-07-11

今天这篇文章我们来聊聊在分布式环境下的一个神兵利器——分布式锁!在看这篇文章的时候,默认大家对锁已经了解了,如果不了解的朋友可以去翻翻公号前面的文章,有很多篇详细介绍了锁的一些知识。 写这篇文章的主要原因是之前星球中有朋友说面试中被问的频率有点高,虽然知道分布式锁是什么,但是还是不能很好的说出来,这篇文章就是帮助大家好好梳理一下分布式锁的原理,希望对大家有帮助。 另外欢迎到 Java 极客技术知识星球中,我们一起煮酒论技术~ 什么是分布式锁 首先我们先来简单了解一下什么是分布式锁(关于什么是锁,可以翻翻之前公号的文章或者到我们的网站 http://www.justdojava.com/ 上看看之前的文章)。 在引入分布式锁之前大家应该都知道经典的 CAP 理论提到任何一个系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)三者的,同一时刻只能满足两个,在这种情况下分布式锁就出现了,分布式锁就是用来解决数据一致性问题的。 在以前单体应用的环境下,Java 的 API 提供了很多控制并发的接口,包括 s....

聊聊 Redis 的事务

2019-07-02

背景 提到事务想必大家一定不会陌生,工作面试中多多少少都会了解到,这篇文章主要带大家再简单回忆一下事务的基本知识,然后重点介绍下 Redis 的事务,关于 Redis 的事务有何不同我们继续往下看就知道了。 什么事务 说到事务,首先我们需要知道什么是事务。首先事务是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行。事务是一个不可分割的逻辑单元。 事务的四大特性 A(原子性)事务的各步操作是不可分的,保证一系列的操作要么都完成,要么都不完成; C(一致性)事务完成,数据必须处于一致的状态; I(隔离性)对数据进行修改的所有并发事务彼此之间是相互隔离,这表明事务必须是独立的,不应以任何方式依赖或影响其他事务; D(持久性)表示事务对数据处理结束后,对数据更改必须持久化,不管是事务成功还是回滚。事务日志都能够保持事务的永久性。 以上是常规的事务以及事务的特性。下面我们来看一下什么是Redis的事务,以及Redis事务有什么特殊性质。 Redis 事务 关于Redis的性质官方文档如下 MULTI, EXEC, DISCARD and WATC....

基于 Redis 注册中心的 Dubbo 监控平台搭建

2018-11-23

背景 本文描述的 Dubbo 监控系统都是基于 Redis 作为注册中心的 无需同时部署多个监控中心 官方 Dubbo-admin 和 Dubbo-monitor 搭建 GitHub 官方组件目前在重构,采用前后分离技术,尚未完成。本文采用的还是 master 分支的老版本 dubbo-admin 搭建步骤 git clone https://github.com/apache/incubator-dubbo-ops 在 dubbo-admin 项目的 pom.xml 中增加 Redis 依赖,因为我们这里用的是 Redis 作为注册中心 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>commons-io</groupId> ....