redis
文章平均质量分 52
妖四灵.Shuen
这个作者很懒,什么都没留下…
展开
-
Redisson 源码初探(十一) CountDownLatch
我们都知道JDK 并发包里面有CountDownLatch 类,这个类是干嘛用的?简单的理解就是,我们主线程设置一个条件,然后阻塞,等其他线程去将条件达成,就可以让主线程继续执行下去当然这里的条件就是数字那么Redisson 是如何实现的? public static void main(String[] args) throws Exception { //构建一个配置信息对象 Config config = new Config(); .原创 2021-02-27 21:38:31 · 752 阅读 · 0 评论 -
Redisson 源码初探(十) Semaphore 模式
redisson 内部实现的还有一种semaphore 信号量的模式,这个是个什么模式?大白话说就是资源池中存在一部分共享的资源,多个线程可以从资源池里面去获取资源,如果资源被获取完,那么其他向获取资源的线程就需要等待,别人释放资源。其实逻辑很清晰(1)设置资源池的数量 也就是设置对应的semaphore key的 value值(2)尝试获取资源,如果足够 对资源池key 对应的value - 数量,如果不足够,进入死循环,不停的尝试获取(3)释放资源,其实就是将对应的key的value.原创 2021-02-27 16:00:47 · 1471 阅读 · 0 评论 -
Redisson 源码初探(九)ReadWriteLock 读写锁
读写锁得概念我们就不再赘述了public static void main(String[] args) throws Exception { //构建一个配置信息对象 Config config = new Config(); config.useClusterServers() //定时扫描连接信息 默认1000ms .setScanInterval(2000)原创 2021-02-27 15:12:12 · 1240 阅读 · 0 评论 -
Redisson 源码初探(八) RedLock
本篇主要讲解Redisson中得RedLock实现,但是很多知识因为和前面一样,就直接省略了RedLock 原理理一下:(1)获取当前时间戳,单位是毫秒(2)和RedissonMultiLock一样,一次轮询尝试去每个机器上创建锁,需要加一个超时时间,如果超过一定时间就表示获取锁失败(3)尝试在大多数节点上建立一个锁,如果3个节点就要求创建 n/2 + 1 = 2个节点上创建锁(4)客户端计算建立锁的时间,如果在规定时间内,建立锁成功,就代表加锁成功(5)如果建立锁失败,那么就会依次原创 2021-02-27 10:03:57 · 323 阅读 · 1 评论 -
Redisson源码初探(七) MutiLock
MutiLock 说明东西?就是可以将多个锁合并成一个大锁,对一个大锁进行统一的申请和释放。其实就是一次性的去锁定多个资源,然后处理业务,最后统一释放我们看源码之前先思考一下,这个如果基于之前的一些思想,如何去实现这个功能????难道是就是对多个所RedissonLock 依次去加锁?所有的锁加锁成功就代表MultiLock加锁成功?我们还是先看看Redisson如何使用,也就是我们看源码的入口对把public static void main(String[] args) throws E.原创 2021-02-27 09:08:37 · 705 阅读 · 0 评论 -
Redisson 源码初探 (六)公平锁
因为Redisson 默认是非公平锁,client 端互相一起争抢,现在我们继续研究公平锁,为什么要研究?研究分布式锁 不仅仅要研究最基础的锁对吧,我们要把一系列的非公平锁 公平锁 读写锁 RedLock锁,Semaphore CountDownLatch 一系列的研究完,才算真正的研究了分布式锁,对吧那么公平锁呢,我们知道公平锁需要维持一个有序的获取锁的顺序,可以使用队列也可以使用一些其他的机制,那么我们慢慢来看Redisson的公平锁是如何实现的?先找到入口 public static .原创 2021-02-26 21:22:18 · 930 阅读 · 0 评论 -
Redisson 源码初探(五)获取锁超时 以及 锁超时自动释放
获取锁超自动发现,方法有所改变,不再是使用lock.lock(),而是使用lock.tryLock()public static void main(String[] args) throws Exception { //构建一个配置信息对象 Config config = new Config(); config.useClusterServers() //定时扫描连接信息 默认1000ms .原创 2021-02-24 19:44:59 · 4662 阅读 · 0 评论 -
Redisson 源码初探(四)释放锁
@Override public void unlock() { try { //unlockAsync 是异步化的释放锁 //这里的get 包裹是将异步变为同步 get(unlockAsync(Thread.currentThread().getId())); } catch (RedisException e) { if (e.getCause() instance..原创 2021-02-23 10:45:42 · 879 阅读 · 0 评论 -
Redisson 源码初探(三)可重入锁 以及 互斥阻塞
Redisson 的代码质量相当的不错,从抽象设计 代码的思路 和 顺序 读别人源码都非常的清晰,不想Spring Cloud 的eureka 和 hystrix 读起来 相当的混乱。可重入锁对吧,就是一个线程加锁两次,那么redisson 又是如何实现的呢,其实这里还是要去看lua脚本lock()加锁的逻辑是一样的,最本质的区别再与lua脚本<T> RFuture<T> tryLockInnerAsync(long leaseTime, TimeUnit unit,原创 2021-02-23 10:45:19 · 907 阅读 · 0 评论 -
Redisson 分布式锁(二)lock 续约操作以及对应的lua脚本
private <T> RFuture<Long> tryAcquireAsync(long leaseTime, TimeUnit unit, final long threadId) { if (leaseTime != -1) { return tryLockInnerAsync(leaseTime, unit, threadId, RedisCommands.EVAL_LONG); } //这里是什么?.原创 2021-02-23 09:29:00 · 1173 阅读 · 0 评论 -
Redisson 源码初探 (如何上锁 lua脚本的使用)
Redisson的基本使用pom 依赖<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.8.1</version> </dependency> public static void main(String[] args) throws.原创 2021-02-22 11:49:53 · 1218 阅读 · 0 评论 -
Redis cluster集群模式详解
Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能,能有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,都可以采用Cluster架构达到负载均衡的目的。原创 2020-05-29 09:49:20 · 13060 阅读 · 0 评论 -
Redis 深入理解内存回收策略设计思想(过期键删除策略和内存淘汰策略)
Redis 深入理解内存回收策略设计思想(过期键删除策略和内存淘汰策略)原创 2020-05-28 10:26:01 · 11499 阅读 · 0 评论 -
Redis 主从数据复制原理(面试之说说Redis主从复制功能呢?如何实现?)
前置知识在Redis中,从服务器对主服务器的复制可以分为以下两种情况:(1)初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制主服务器和上一次复制的主服务器不通(2)断线后重复制:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动重连接重新连上了主服务器,并继续复制主服务器旧版2.8版本以前,不管是初次复制,还是断线后重复制都是完整复制,效率很低(需要先生成RDB,然后再发送)因此Redis从2.8版本开始,使用了PSYNC命令替代了SYNC命令来原创 2020-05-27 10:14:57 · 12704 阅读 · 0 评论 -
Redis 事务的ACID(为什么是半原子性,特定持久化)
背景在传统的关系式数据库中,常常用ACID性质来检验功能的可靠性和安全性。在Redis中,事务总是具有原子性(Atomicity)、一致性(Consistency)和隔离性(Isolation),并且当Redis运行在某种特定的持久化模式下,事务也具有持久性(Durability)原子性对于Redis的事务功能来说,事务队列中的命令要么全部执行,要么一个都不执行,但是不同于关系型数据库事务,Redis不支持事务回滚机制(rollback),即使事务队列中的某个命令在执行期间出现了错误,整个事原创 2020-05-26 11:03:59 · 12457 阅读 · 0 评论 -
Redis 事务深入剖析
在传统的关系式数据库中,常常用ACID性质来检验功能的可靠性和安全性。在Redis中,事务总是具有原子性(Atomicity)、一致性(Consistency)和隔离性(Isolation),并且当Redis运行在某种特定的持久化模式下,事务也具有持久性(Durability)原创 2020-05-26 10:59:53 · 12269 阅读 · 0 评论 -
Redis数据持久化RDB与AOF(剖析设计思想)
????思考:我们的Redis必须使用数据持久化吗?Redis又是如何持久化?(1)如果我们的Redis服务器只作为缓存使用,Redis中存储的所有数据都是从其他地方同步过来的备份,那么就根据实际情况看是否需要开启了。(2)Redis的持久化操作分以下两种:RDB:指定的时间隔策略内保存数据快照(注:很多博客直接写的基于时间间隔,其实是有问题的,如果间隔时间内我们都没有一次数据变化,我们为什么要再进行一次快照存储呢?)AOF:AOF机制对每条写入命令作为日志,以append-only的模式写入一原创 2020-05-26 09:56:00 · 12396 阅读 · 0 评论 -
Redis cluster 集群模式 请求重定向 客户端为什么有时会访问两次?
既然 16384个槽位分别在不同的机器上(数据分布在不同的机器上),那我客户端访问的时候应该访问哪一台机器去尝试操作?又怎么知道数据的分布呢?其实,当客户端向节点发送与数据库有关的命令的时候,接收到命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己(Redis集群中每个机器 都保存了槽位的信息分布,如果槽位信息变化了,都会以消息的形式进行传播)原创 2020-05-25 10:37:53 · 13710 阅读 · 0 评论 -
Redis 持久化 之 AOF 和 RDB 同时开启,Redis听谁的?
https://www.jianshu.com/p/9cdf6c6d4cb0原创 2020-05-24 11:21:37 · 22926 阅读 · 6 评论 -
Redis 跳跃表skiplist(深入理解,面试再也不用怕)
跳跃表在单链表中查询一个元素的时间复杂度为O(n),即使该单链表是有序的,我们也不能通过2分的方式缩减时间复杂度。 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针(注:可以理解为维护了多条路径),从而达到快速访问节点的目的。 图上有多层,根据程序自身实现产生特点:(1)跳跃表的每一层都是一条...原创 2020-05-22 09:54:18 · 19408 阅读 · 0 评论 -
Redis rehash内存暴增问题
redis内存分析(1) 自身内存:一个空的Redis占用很小,可以忽略不计(2) kv内存:key对象 + value对象(3) 缓冲区:客户端缓冲区(普通 + slave伪装 + pubsub)以及aof缓冲区(比较固定,一般没问题)(4) Lua:Lua引擎所消耗的内存内存突增常见问题(1) kv内存:bigkey、大量写入(2) 客户端缓冲区:一般常见的有普通客户端缓冲区(例如monitor命令)或者pubsub客户端缓冲区渐进式rehash造成内存暴增为了保证查询的性原创 2020-05-21 10:45:11 · 13328 阅读 · 0 评论 -
Redis 数据结构之字典(渐进式rehash)
Redis字典结构哈希表结构Redis字典使用的哈希表由dict.j/dictht结构定义,如下:其中table属性是一个数组,数组元素为dict.h/dictEntry结构(key-value结构,类似于java中hashMap中的Node<K,V>结构)????思考:结构中哈希表为ht[2],容量为2的dictht数组,为什么是2个?ht[2]:一般情况下只会用到ht[0],ht[1]只会在ht[0]哈希表进行rehash的时候使用rehashidx原创 2020-05-21 10:25:00 · 12826 阅读 · 0 评论 -
Redis 数据结构字符串底层剖析(简单动态字符串)
引言Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示.在Redis 里面,C字符串只会作为字符串面量(string literal)用在一些无须对字符串值进行修改的地方。在一个可以被修改的字符串值里面,Redis就会使用SDS来表示字符串值,比如:Redis数据库里面,包含字符串值得健值对在底层得实现都是由SDS实现的以及AOF的缓冲区等(注:在一些无需更改原创 2020-05-20 10:08:35 · 12719 阅读 · 0 评论 -
Redis 5种数据结构(底层原理,性能分析,使用场景)
Redis 数据结构有5种,分别为:字符串(String)列表(List)哈希(Hash) 集合(Set)有序集合(ZSet)字符串(String)Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示.在Redis 里面,C字符串只会作为字符串面量(string literal)用在一些无须对字符串值进行修改的地方。在一个可以被修改的字符串值里面,Redis原创 2020-05-19 10:16:48 · 14411 阅读 · 0 评论 -
SSM框架(二级缓存)集成Redis单机模式及哨兵模式
项目整体框架: SpringMVC + Spring+MyBatis +Redis(缓存部署在Linux虚拟机)。数据库:mysql1、整体架构参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅)使用Spring管理Redis连接池模仿EhcacheCache,实现RedisCache2、pom.xml中加入Maven依赖<!--引入项目依赖的jar包 -->...原创 2017-09-18 09:57:58 · 13863 阅读 · 1 评论