
Redis
Franco蜡笔小强
小码农
展开
-
分布式锁-这一篇全了解(Redis实现分布式锁完美方案)
前言在某些场景中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的。随着技术快速发展,数据规模增大,分布式系统越来越普及,一个应用往往会部署在多台机器上(多节点),在有些场景中,为了保证数据不重复,要求在同一时刻,同一任务只在一个节点上运行,即保证某一方法同一时刻只能被一个线程执行。在单机环境中,应用是在同一进程下的,只需要保证单进程多线程环境中的线程安全性,通过 JAV...原创 2019-12-31 12:11:29 · 25601 阅读 · 8 评论 -
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
原文链接:https://www.cnblogs.com/powerwu/articles/9589075.html整理一篇关于Redis经常被问到的问题:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等概念的入门及简单解决方案。一、缓存雪崩缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有...原创 2019-04-28 19:24:30 · 264 阅读 · 0 评论 -
【成神之路】Mysql相关面试题
Redis支持哪几种数据结构Redis单进程单线程的Redis如何能够高并发?Redis如何实现分布式锁?(如果回答了jedis.set可以追问每个参数的大概含义,考察细节)Redis分布式锁操作的原子性,Redis内部是如何实现的?Redis 有哪些数据类型,可参考《Redis常见的5种不同的数据类型详解》 Redis 内部结构 Redis 使用场景 Redis...原创 2019-04-15 17:55:44 · 252 阅读 · 0 评论 -
【Redis源码剖析】 - Redis持久化之AOF
Redis提供了两种持久化方法:RDB和AOF。在前面一篇文章中我们已经介绍过RDB持久化机制,今天我们来看看AOF持久化方法。本文主要涉及aof.c文件。在前面一篇文章中,我们看到RDB持久化实际上就是把redis数据库中的所有键值对数据按照约定好的格式存放在磁盘文件中。而AOF持久化则采用了不同的策略,它将所有写操作相关的命令记录到磁盘文件中。一般对Redis的操作命令可以分为“读命令转载 2017-09-02 14:33:31 · 389 阅读 · 0 评论 -
【Redis源码剖析】 - Redis持久化之RDB
Redis是一个高效的内存数据库,所有的数据都存放在内存中。我们知道,内存中的信息会随着进程的退出或机器的宕机而消失。为此,redis提供了两种持久化机制:RDB和AOF。这两种持久化方式的原理实际上就是把内存中所有数据的快照保存到磁盘文件上,以避免数据丢失。今天我们主要来介绍一下RDB持久化机制RDB的实现原理,涉及的文件为rdb.h和rdb.c。RDB的主要原理就是在某个时间点把内转载 2017-09-02 13:45:29 · 452 阅读 · 0 评论 -
【Redis源码剖析】 - Redis之数据库redisDb
今天,我们来讨论两点内容:一是Redis是如何存储类型对象的,二是redis如何实现键的过期操作。本文介绍的内容主要涉及db.c和redis.h两个文件。1、redisDb介绍Redis中存在“数据库”的概念,该结构由redis.h中的redisDb定义。我们知道Redis提供string、list、set、zset、hash五种数据类型的存储,在Redis运行时,服务器中会存在许转载 2017-09-02 13:29:31 · 524 阅读 · 0 评论 -
【Redis源码剖析】 - Redis之事务的实现原理
今天为大家带来Redis中事务部分的源码分析。redis的事务机制允许将多个命令当做一个独立的单元运行,主要包括multi、exec、watch、unwatch、discard五个相关命令。如果你还不熟悉这几个命令,可以先看看我的另一篇文章【Redis学习笔记(七)】 Redis中的事务本文所讲述的内容主要涉及redis.h和multi.c两个源文件,依据惯例,文后会提供注释版的源码。转载 2017-09-02 13:24:34 · 422 阅读 · 0 评论 -
【Redis源码剖析】 - Redis数据类型之有序集合zset
Redis中的zset主要支持以下命令:zadd、zincrby zrem、zremrangebyrank、zremrangebyscore、zremrangebyrankzrange、zrevrange、zrangebyscore、zrevrangebyscore、zrangebylex、zrevrangebylexzcount、zcard、zscore、zrank、zrevrank z转载 2017-09-02 13:21:24 · 1108 阅读 · 0 评论 -
【Redis源码剖析】 - Redis数据类型之列表List
今天为大家带来Redis五大数据类型之一 – List的源码分析。redis中的List类型是一种双向链表结构,主要支持以下几种命令:lpush、rpush、lpushx、rpushx lpop、rpop、lrange、ltrim、lrem、rpoplpush linsert、llen、lindex、lset blpop、brpop、brpoplpushList的相关操作主原创 2017-09-02 13:18:12 · 335 阅读 · 0 评论 -
【Redis源码剖析】 - Reids内置数据结构之整数集合intset
今天我们来介绍Redis中一个比较简单的内置数据结构 – 整数集合intset。1、intset存储结构整数集合,顾名思义,就是存储一系列整数的集合。在redis中,intset结构体的定义如下:/* 整数集合结构体 */typedef struct intset { // 编码方式 uint32_t encoding; // 保存的元素数量转载 2017-09-02 11:31:28 · 411 阅读 · 0 评论 -
【Redis源码剖析】 - Redis内置数据结构之压缩字典zipmap
今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件中。我把zipmap称作“压缩字典”(不知道这样称呼正不正确)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间。zipmap和前面介绍的ziplist结构十分类似,我们可以对比地进行学习:redis中定义了双向链表list,但是这种链原创 2017-09-02 11:29:45 · 429 阅读 · 0 评论 -
【Redis源码剖析】 - Redis内置数据结构之压缩列表ziplist
在前面的一篇文章【Redis源码剖析】 - Redis内置数据结构之双向链表中,我们介绍了Redis封装的一种“传统”双向链表list,分别使用prev、next指针来指向当前节点的前一个节点和下一个节点。这种数据结构需要花费额外的空间存储两个指针,空间利用率不高。比如,考虑比较极端的情况,如果每个节点保存的只是一个char类型的字符,在32位机上每个节点需要占用9个字节,而其中只有1个字节用来存转载 2017-08-29 18:43:41 · 554 阅读 · 0 评论 -
【Redis源码剖析】 - Redis内置数据结构之字典dict
今天我们来讲讲Redis中的哈希表。哈希表在C++中对应的是map数据结构,但在redis中称作dict(字典)。Redis只是用了几个简单的结构体和几种常见的哈希算法就实现了一个简单的类似高级语言中的map结构。下面我们来具体分析一下dict的实现。在学习数据结构的时候,我们接触过一种称作“散列表”的结构,可以根据关键字而直接访问记录。说的具体一点就是通过把key值映射到表中的一个位置来转载 2017-08-29 10:14:40 · 424 阅读 · 0 评论 -
【Redis源码剖析】 - Redis内置数据结构之双向链表list
今天我们主要讲述Redis中双向链表的实现,源代码主要在adlist.h和adlist.c文件。学习过《数据结构》的童鞋应该不会对双向链表感到陌生,这是一种比较简单的数据结构。与我们以前接触到的“常规”的链表结构相比,Redis中的双向链表主要有以下两点不同:1、双向列表list的节点结构双向链表作为一个容器,必然需要支持不同类型数据的存储。由于C++中有“模板”的概念,这一点在C++转载 2017-08-29 09:47:55 · 539 阅读 · 0 评论 -
【Redis源码剖析】 - Redis内置数据结构之字符串sds
1、在C语言中,字符串是以字符数组的形式体现的(以’\0’为结束符),redis中的字符串定义如下:/* 字符串结构体(字符串就是字符数组) */struct sdshdr { // 字符串当前长度 unsigned int len; // 剩余可用长度 unsigned int free; // 字符数组(具体存放字符串的地方) char b转载 2017-08-29 09:27:38 · 601 阅读 · 0 评论 -
Redis-事务
Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。本章从事务常见的ACID性质对事务的原子性,一致性,可理性和持久性进行说明一、事务的实现一个事务从开始到结束通常会经历以下三个阶段:1)事务开始2)命令入队3)事务执行事务开始:MULTI命令可以讲执行该命令的客户端从事务状态切换至事务状态,通过在客户端状态的flags原创 2017-08-29 09:00:05 · 346 阅读 · 0 评论 -
Redis-数据结构-对象
在前面陆续介绍了Redis用到的所有数据,比如简单字符串SDS,双端链表 ,字典,压缩列表,整数集合等等,Redis并没有直接用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象,哈希对象,集合对象和有序集合对象五种类型的对象。原创 2017-08-28 23:12:32 · 359 阅读 · 0 评论 -
Redis-数据结构-压缩列表-ziplist
压缩列表是列表键和哈西键的底层实现之一,当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。压缩列表是Redis为了节约内存而开发的,是一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。ziplist的构成原创 2017-08-28 08:43:12 · 536 阅读 · 0 评论 -
Redis-数据结构-整数集合-intset
整数集合是Redis用于保存整数值的集合抽象数据结构,可以保存类型为int16_t,int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。typedef struct intset { //编码方式 unit32_t encoding; //集合包含的元素数量 unit32_t length; //保存原创 2017-08-27 20:56:42 · 294 阅读 · 0 评论 -
Redis-数据结构-跳跃表-skiplist
跳跃表(skiplist)是一种有序数结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来为有序集合键的底层实现。和链表、字典等数据结构被广泛的应用在Redis内部不同,Redis只在两个地方用到了跳跃表原创 2017-08-27 13:22:00 · 451 阅读 · 0 评论 -
Redis-数据结构-字典
字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典来作为底层实现的,对数据库的增删改查操作也是构建在字典的操作之上的。Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。1、哈希表dict.h/dicthttypedef struct dictht { //哈希表数组原创 2017-08-27 12:43:43 · 365 阅读 · 0 评论 -
Redis-数据结构-链表-adlist.h/listNode
每个链表接点使用一个adlist.h/listNode结构表示:typedef struce listNode { //前置节点 struct listNode *prev; //后置节点 struct listNode *next; //节点的值 void *value; }listNode;多个listN原创 2017-08-27 00:24:06 · 405 阅读 · 0 评论 -
Redis-数据结构-简单字符串-SDS
Redis没有直接用C余艳传统的字符串(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(SDS)抽象类型,作为Redis的默认字符串表示。SDS结构:struct sdshdr //记录buf数组中已使用的数量 //等于SDS所保存字符串的长度 int len; //记录buf数组中未使用字节的数量 in原创 2017-08-27 00:00:46 · 307 阅读 · 0 评论 -
Redis应用场景
NoSQL主要用于解决以下几种问题 1.少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。 2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。 3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心原创 2017-08-26 22:57:07 · 3987 阅读 · 0 评论