redis
redis
Hanyinh
这个作者很懒,什么都没留下…
展开
-
testOnBorrow、testOnReturn属性
Jedis客户端testOnBorrow、testOnReturn属性分析总结:1、testOnBorrow若testOnBorrow属性设置为true,从连接池中获取对象时,会进行检查,检查不通过,会从连接池中移走并销毁。检查是通过PooledObjectFactory接口的validateObject方法完成。Jedis客户端,提供JedisFactory对象,用于校验。若ping不通,则校验失败。JedisFactory对象,是在连接池创建时,构造。2、testOnReturn若原创 2021-11-09 11:02:29 · 2375 阅读 · 0 评论 -
Redis 数据类型——hyperloglog
一、hyperloglog 介绍1、hyperloglog 简介Redis 中 hyperloglog 数据类型是 2.8.9 版本引入的,是一种概率数据结构,用来估算数据的基数。基数就是指一个集合中不同值的数目,比如 a, b, c, d 的基数就是 4,a, b, c, d, a 的基数还是 4。虽然 a 出现了两次,但是只会被计算一次。hyperloglog 通常用来统计一个集合中不重复的元素个数。一个很常见的例子就是统计某个文章的 UV(Unique Visitor,独立访客,一般可以理解原创 2021-08-14 17:59:48 · 1628 阅读 · 0 评论 -
Redis 数据类型——geospatial
一、geospatial 简介Redis 在 3.2 版本中加入了地理空间(geospatial)以及索引半径查询的功能,主要用在需要地理位置的应用上。将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中,这些数据将会存储到 sorted set。这样的目的是为了方便使用 GEORADIUS 或者 GEORADIUSBYMEMBER 命令对数据进行半径查询等操作。也就是说,推算地理位置的信息,两地之间的距离,周围方圆的人等等场景都可以用它实现。小结:geo 底层原理是使用 zset来实现原创 2021-08-14 11:27:00 · 2710 阅读 · 1 评论 -
Redis 数据结构——robj
一、robj 介绍Redis 的其他基本数据结构,比如 sds、intset、ziplist、linkedlist、dict、zskiplist,其实 Redis 并没有直接使用这些数据结构来实现键值对的数据库,而是在这些数据结构之上又包装了一层 RedisObject(对象)。使用 robj的好处:1、通过不同类型的对象,Redis 可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。2、可以针对不同的使用场景,为对象设置不同的实现,从而优化内存或查询速度。二、rob原创 2021-08-07 21:12:41 · 690 阅读 · 0 评论 -
Redis 数据结构——dict
一、dict 介绍dict,也就是字典,字典又称散列表,是用来存储键值对的一种数据结构;但是,C 语言中是没有这种数据结构的,Redis 是 k-v 型数据库,整个数据库都是用 dict 来存储的,对 Redis 数据库进行增删改查操作,实际上就是对字典中的数据进行增删改查操作。Redis 的键值对存储就是用 dict 实现的,散列(Hash)的底层实现之一也是字典。dict 通常的存储结构是 Key-Value 形式的,通过 Hash 函数对 key 求 Hash 值来确定 Value 的位置,因此原创 2021-08-07 18:37:17 · 1760 阅读 · 0 评论 -
Redis 数据结构——intset
一、intset 介绍intset,也就是整数集合,是 set 的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis 就会使用 intset 作为 set 的底层实现。它的查找是 O(log n) 的,插入和删除都是 O(n) 的。但是由于存储元素相对较少的时候,O(log n) 和 O(n) 差距不是很大,但是用 Redis 的这种 intset,相比红黑树和哈希表来说,可以大大减少内存。所以,Redis 的 整数集合 intset 的存在主要还是为了节省内存。原创 2021-08-07 16:39:41 · 1312 阅读 · 0 评论 -
Redis 数据结构——zskiplist
一、zskiplist 介绍zset 数据类型在生活中较常见,如根据成绩对学生进行排名、根据得分对游戏玩家进行排名等。对于 zset 的底层实现,我们可以使用数组、链表、平衡树等结构。然而,数组不便于元素的插入和删除;链表的查询效率低,需要遍历所有元素;平衡树或者红黑树结构虽然效率高但实现复杂。于是,Redis 采用了一种新型的数据结构—— 跳跃表,也即 zskiplist。跳跃表的效率堪比红黑树,然而实现却远比红黑树简单。在 Reids 中,跳跃表主要应用于有序集合 zset 的底层实现,zs原创 2021-08-07 14:24:55 · 636 阅读 · 0 评论 -
Redis 数据结构——quicklist
一、quicklist 介绍1、quicklist 简介Redis 中的 list 数据类型在版本 3.2 之前,其底层的编码是 ziplist 和 linkedlist 实现的,但是在版本 3.2 之后,重新引入了一个 quicklist 的数据结构,list 底层都由 quicklist 实现。在早期的设计中, 当 list 对象中元素的长度比较小或者数量比较少的时候,采用 ziplist 来存储,当 list 对象中元素的长度比较大或者数量比较多的时候,则会转而使用双向列表 linkedli原创 2021-08-07 12:08:21 · 759 阅读 · 0 评论 -
Redis 数据结构——linkedlist
一、linkedlist 简介由于 C 语言没有内置链表这种数据结构,于是 Redis 构建了自己的链表实现。linkedlist 是一个双端链表,也是 list 数据类型的底层实现之一。当一个list 包含了数量比较多的元素,又或者 list 中包含的元素都是比较长的字符串时,Redis就会使用 linkedlist 作为 list 的底层实现。当一个 lsit 只包含少量的元素,并且每个 list 要么就是小整数值,要么就是长度比较短的字符串,那么 Redis 就会使用 ziplist 作为 list原创 2021-08-03 00:16:32 · 581 阅读 · 0 评论 -
Redis 数据结构——ziplist
一、ziplist 简介ziplist,也就是压缩列表,是为了提高存储效率而设计的一种特殊编码的双向链表。它可以存储字符串或者整数,存储整数时是采用整数的二进制而不是字符串形式存储。他能在 O(1) 的时间复杂度下完成 list 两端的 push和 pop 操作。但是因为每次操作都需要重新分配 ziplist 的内存,所以实际复杂度和 ziplist 的内存使用量相关。二、ziplist结构整个ziplist在内存中的存储格式如下:ziplist 主要有这么几个部分:zlbytes:32 位原创 2021-08-01 14:59:06 · 917 阅读 · 0 评论 -
Redis 数据结构——SDS
前言:本文将介绍 Redis 中字符串的实现方法。一、说明Redis 是使用 C 语言实现的,但是 Redis 中使用的字符串却不是直接用的 C 语言中字符串的定义,而是自己实现了一个数据结构,叫做 SDS(simple dynamic String),即简单动态字符串。二、C 语言字符串定义C 语言的字符串定义,是使用和字符串相等长度的字符数组来存储字符串,并且在后面额外加一个字符来存储空字符 ‘\0’,也就是下图:这种实现方式的优点就是,简单且直观。但是众所周知,Redis 是一原创 2021-07-31 18:09:49 · 889 阅读 · 0 评论 -
Redis与Memcache区别
Redis与Memcache区别最全整理(1)【持久化能力】Redis支持持久化,memcache也支持但一般不做持久化(重启丢失数据)(2)【数据类型支持】Redis类型较多(5种数据类型,string、list、hash、set、sorted set),memcache只能是字符串(3)【线程模型】Redis是单线程+多路IO复用,虽然没有锁冲突,但很难利用多核特性提升整体吞吐量。memecache是多线程+锁的方式,主线程监听,work子线程接收请求,执行读写,有锁冲突。;(4)【数据原创 2021-06-04 16:37:19 · 200 阅读 · 0 评论 -
redis集群 mget不能跨分区查找解决
记录搭建redis集群以及使用过程中踩过的坑redis分片集群不支持跨分区操作,意思是说3个master集群,key1存在m1上,key2存在m2上,key3存在m3上,redis命令行执行 mget key1,key2,key3 执行失败,会报keys have defferent slots,不能跨分片查询spring项目引用redis.clients.jedis,也会报错springboot项目org.springframework.data.redis包,居然可以查到数据,没有异常,查原创 2021-05-26 18:29:23 · 1017 阅读 · 0 评论 -
Redis 事务是否具备原子性?
Redis 事务是否具备原子性?原创 2021-05-17 15:44:53 · 670 阅读 · 0 评论 -
Redis cluster集群扩容缩容原理
Redis cluster集群扩容缩容原理扩容原理:1、redis cluster可以实现对节点的灵活上下线控制2、3个主节点分别维护自己负责的槽和对应的数据,如果希望加入一个节点实现扩容,就需要把一部分槽和数据迁移和新节点3、每个master把一部分槽和数据迁移到新的节点node04新节点刚开始都是master节点,但是由于没有负责的槽,所以不能接收任何读写操作,对新节点的后续操作,一般有两种选择:1、从其他的节点迁移槽和数据给新节点2、作为其他节点的slave负责故障转移slot迁原创 2021-05-16 20:46:19 · 1877 阅读 · 0 评论 -
redis选举
redis集群选举机制当redis集群的主节点故障时,Sentinel集群将从剩余的从节点中选举一个新的主节点,有以下步骤:1、故障节点主观下线2、故障节点客观下线3、Sentinel集群选举Leader4、Sentinel Leader决定新主节点1、主观下线Sentinel集群的每一个Sentinel节点会定时对redis集群的所有节点发心跳包检测节点是否正常。如果一个节点在down-after-milliseconds时间内没有回复Sentinel节点的心跳包,则该redis节点被该原创 2021-05-15 10:19:34 · 935 阅读 · 0 评论 -
redis槽
为什么RedisCluster会设计成16384个槽?总结:槽介绍:Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。为什么RedisCluster会设计成16384个槽?1、由于redis集群各个节点会定时发送心跳包以确保在线,而如果槽位太多的话,发送的心跳信息就太多了,浪费了带宽。如果槽位为65536,发送心跳信息的消息头达8k,发送的心原创 2021-05-15 10:01:14 · 1038 阅读 · 0 评论 -
scan命令
Redis 中 scan 命令踩坑,千万别乱用!!总结:redis提供了scan命令,就是用于增量迭代的。这个命令可以每次返回少量的元素,所以这个命令十分适合用来处理大的数据集的迭代,可以用于生产环境。count选项后面跟的数字并不是意味着每次返回的元素数量,而是scan命令每次遍历字典槽的数量。所以在使用scan命令的时候,如果需要迭代的遍历,需要每次调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。...原创 2021-05-06 14:24:24 · 856 阅读 · 0 评论 -
Redis内部的rehash扩容缩容
《闲扯Redis八》Redis字典的哈希表执行Rehash过程分析Redis 渐进式 rehash 源码分析总结:结构:/* * 字典 */typedef struct dict { // 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashid原创 2021-04-21 14:22:40 · 609 阅读 · 0 评论 -
Redis中删除过期Key的三种策略
Redis中删除过期Key的三种策略总结:Redis对于过期键有三种清除策略:1、被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key2、主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key3、当前已用内存超过maxmemory限定时,触发主动清理策略...原创 2021-04-20 21:14:55 · 474 阅读 · 0 评论 -
Redisson实现分布式锁原理
Redisson实现分布式锁(1)—原理1、如果有多个线程请求锁1.1、加锁不成功就自旋加锁1.2、加锁成功就继续执行2、获取锁之后就会去执行lua脚本(保证原子性),然后保存数据到redis数据库3、内部实现了一个看门狗,如果还持有锁,但是锁快过期了,就可以自动延时加锁时间redison有一个缺点,就是如果主节点持有锁之后宕机了,从节点转成主节点,又重新获取锁,这就有问题了。可以使用redlock来解决。参考下面那边文章解决主从架构的redis分布式锁主节点宕机锁丢失的问题..原创 2021-04-20 12:56:55 · 246 阅读 · 0 评论 -
redis集群脑裂及解决方案
redis集群(主从)脑裂及解决方案脑裂:由于网络原因,master节点和slave、sentinel节点之间不能通信,sentinel节点无法感知到master节点的存在,于是会从slave节点中选出一个成为master节点,此时就存在多个master节点,这就是脑裂。如果在网络恢复之前,还有请求发送到之前的master节点,那么新的master节点就会丢失这部分数据。因为等到网络恢复了之后,sentinel节点会把之前的master节点降为slave节点,然后新的master节点同步时,就会丢失原创 2021-04-15 11:06:27 · 1329 阅读 · 0 评论 -
布隆过滤器、布谷鸟过滤器
太牛了!缓存穿透、缓存击穿、缓存雪崩的终极解决方案(主要看其中的布隆过滤器介绍,当然了,也可以全部看)布隆过滤器:可以用来防止缓存穿透。其主要特点是判断不存在的,则一定不存在;判断存在的,大概率存在,但也有小概率不存在。并且这个概率是可控的,我们可以让这个概率变小或者变高,取决于用户本身的需求。布隆过滤器由一个 bitSet 和 一组 Hash 函数(算法)组成,是一种空间效率极高的概率型算法和数据结构,主要用来判断一个元素是否在集合中存在。在初始化时,bitSet 的每一位被初始化为0,同时原创 2021-04-07 14:12:18 · 231 阅读 · 0 评论 -
解决主从架构的redis分布式锁主节点宕机锁丢失的问题
解决主从架构的redis分布式锁主节点宕机锁丢失的问题总结:问题:比如某个主redis节点A加锁成功之后宕机了,导致锁丢失,然后另一个redis从节点B发生主从切换,接着节点B又再次加锁成功,这就会产生多个节点加锁成功,出现问题。解决:使用Redlock解决。Redlock思想:使用N个完全独立,没有主从关系的主redis节点,保证他们大多数情况下不会宕机。然后对每个主redis节点进行加锁,只有超过半数,也就是(N/2 + 1)的主redis节点加锁成功,才算成功,否则一律算失败。失原创 2021-03-24 14:58:37 · 2414 阅读 · 1 评论 -
Redisson解决redis分布式锁过期时间到了业务没执行完问题
Redisson解决redis分布式锁过期时间到了业务没执行完问题总结:redisson内部提供了一个看门狗自动延期机制,它的主要功能就是隔一段时间会延长一下过期时间,直至结束。原创 2021-03-24 14:22:56 · 2736 阅读 · 0 评论 -
redis分布式锁
redis分布式锁文章有个地方写错了,在RedissonManager类中改成这样config.useSingleServer().setAddress("redis://127.0.0.1:6379");总结:1、如果使用redis原生接口,则需要使用这个方法,保证了加锁和加过期时间是一个原子操作jedis.set(String key, String value, String nxxx, String expx, int time)2、也可以使用lua脚本,因为lua脚本里面的内容都属原创 2021-03-24 13:59:47 · 80 阅读 · 0 评论 -
ZSet跳表和压缩列表原理
【Redis】拼多多面试官问我zset底层是如何实现的,我反手就把跳表的数据结构画了出来总结:普通链表是一个节点一个节点按顺序的排序,而跳表是为每个节点随机出一个层数,每一层指向的节点可能会不通过。并且,越高层的链表节点数越少。这样查找的话,会从高层开始查找,一层一层往下找,最终在第一层找出其精准位置。这样的查找方式可以跳过很多下层节点数,大大加快查找速度。而对于插入和删除等,也只需要修改对应节点前后指针而已,这就比平衡树更有优势。为什么采用跳表,而不使用哈希表或平衡树实现呢?1、skipl原创 2021-03-24 10:26:57 · 1932 阅读 · 0 评论 -
redis热点问题和热点发现
Redis缓存系列:你所不知道的Redis热点问题以及如何发现热点前言热点就是访问量特别大所形成的热点数据。因此需要缓存,于是使用了redis缓存。缓存化使用了redis缓存会有以下一个问题:1、热点数据过期,会导致大量请求访问DB,造成DB崩溃解决方案:1、使用分布式锁,只允许一个线程访问DB,其他阻塞2、设置成永不过期,但是需要进行预热处理以上两个方案还存在一个问题:1、redis达到负载时,也会崩溃解决方案:1、可以使用redis集群但是redis集群set和get都是原创 2021-03-23 11:33:38 · 483 阅读 · 0 评论 -
使用Redis解决海量数据的日活、月活问题
使用redis统计用户日活、月活(实践版)redis HyperLogLog的使用原创 2021-03-08 14:23:40 · 415 阅读 · 0 评论 -
使用redis解决超卖问题
高并发下超卖问题及如何解决主要思路是:1. 首先在团购秒杀开始前将需要的物品库存信息放入缓存中2. 使用锁来处理其并发请求3. 将缓存中的数据同步到数据库。我们此处使用redis作为缓存。应用操作redis减库存的大体思路为:1. 首先通过redis api监听相关物品的库存信息,在事务开启前保证该物品库存信息无人修改2. 获取现有库存信息,判断库存不为0并且当前库存量大于等于订单所需数量3. 满足上述2的话则进行扣除操作4. 如果在1的过程中有别人更新了该物品库存信息版本,则重试5原创 2021-03-03 15:57:35 · 2495 阅读 · 1 评论 -
redis主从数据一致性
redis主从复制如何保证数据一致性_面试官:Redis 主从复制时网络开小差了怎么整?…总结:1. 当主节点和从节点第一次连接时,会把生成的RDB文件全量复制给从节点。2. 期间,可能主节点会收到写命令等修改数据,这时主节点会用缓冲区来记录这些写命令,然后等到RDB文件发送完成后再把缓冲区的写命令发送给从节点。3. 如果有多个从节点,则可以通过从节点复制给从节点的方式来减轻主节点的压力。4. 如果主从同步的时候,网络断开了,则可以根据偏移量来进行增量复制,从而保证主从数据一致性。...原创 2021-03-03 15:19:01 · 1252 阅读 · 1 评论 -
Redis为什么引入多线程
Redis为什么又引入了多线程?作者也逃不过“真香定理”?redis原本使用单线程的原因:1. IO多路复用2. 可维护性高,多线程会出现并发问题,并且线程切换会增加资源消耗3. redis主要瓶颈是内存,并且由于内存速度快,因此无需多线程为什么引用多线程:使用多线程也不是直接用多线程,而是对于一些操作使用多线程。比如:如果要删除一个元素,但是该元素非常大,用单线程的话,就需要花费不少时间,如果执行了删除命令用单线程执行,但是具体的删除操作让另一个线程去删除,这样就可以不必等元素删除完毕才可原创 2020-12-14 23:17:39 · 675 阅读 · 0 评论 -
redis的三种集群方式
redis的三种集群方式原创 2020-07-08 22:49:27 · 162 阅读 · 0 评论 -
redis持久化方式
redis持久化的几种方式总的来说,有两种方式,一种RDB持久化,一种AOF持久化。RDB持久化:就是在指定时间内把内存中的数据进行快照,然后交给子进程写入磁盘文件中,并压缩文件。AOF持久化,是以追加的方式,用日志的形式来存储每一个写、删除操作,读操作不写入磁盘文件。区别:RDB持久化只包含一个文件,文件小,启动快,但是不保证高可用,当子进程进行写文件时,如果数据量大,可能会造成服务器停止服务几百毫秒,甚至一秒,而且如果这时候宕机,数据就丢失了。AOF持久化具有更高的安全性,写入时如果宕机,也原创 2020-07-08 22:41:40 · 172 阅读 · 0 评论 -
Redis下载教程及简单使用
使用本地缓存快还是使用redis缓存好?什么是redis的雪崩和穿透(击穿)为什么说Redis是单线程的以及Redis为什么这么快!Redis下载教程及简单使用以上是单个redis以下是redis集群主看第三个吧,然后安装的一些ruby redis-trib.rb从前两个参考吧Windows下搭建redis集群教程Windows下搭建redis集群教程Windows下搭建red...原创 2020-01-09 16:56:22 · 333 阅读 · 1 评论