jedis

Redis学习之Jedis源码原理分析探究(BIO手写Jedis客户端)

心不动则不痛 提交于 2020-10-24 10:04:50
  在Redis的使用过程中,大多数人都是使用现成的客户端,如Jedis,Redisson,Lettuce。因此本文研究用BIO的方式手写Redis客户端尝试,对遇到的问题进行探究及总结。   如何从架构角度思考架构分层?   Redis通讯协议RESP是怎么回事?   如何基于BIO实现Redis客户端?   Redis客户端通讯线程安全问题如何解决? 一、Jedis客户端如何进行架构分层   要进行远程访问,如下图所示:                我们在Java应用程序的客户端通过访问包装的API进行Redis访问,API使我们直接可以看懂的调用入口; 然后API是对Redis通信协议的包装,通过对协议的包装,实现我们对Redis访问协议的透明使用; 协议是按照一定规则组装的数据,并不能直接用于网络IO,所以必须进行序列化和反序列化,这样才能进行远程Redis的请求调用以及返回数据的处理。 二、传输层通信   基于远程访问,我们可以使用BIO的Socket进行通信,首先定义一个Connection,Connection类包含了建立BIO连接的远程地址host,端口port,套接字Socket以及输入输出流。   此类一个Connection的构造方法,一个Connection的初始化方法,以及请求发送方法。 public class Connection { private

凭这些资料登上Redis的顶峰:阿里核心笔记/实战/面试专题/脑图,与之共勉

最后都变了- 提交于 2020-10-23 15:55:37
作为同时具备高性能、高可靠和高可扩展性的典型键值数据库,Redis不仅功能强大,而且稳定,理所当然地成为了大型互联网公司的首选。 众多大厂在招聘的时候,不仅会要求面试者能简单地使用Redis,还要能深入地理解底层实现原理,并且具备解决常见问题的能力。可以说,熟练掌握Redis已经成为了技术人的一个必备技能。 但是,在学习和使用Redis的过程中,总不可避免地遇见一些棘手的问题,比如: Redis的key和数据结构应该怎么设计?有什么最佳实践? Redis集群如何均衡数据?又如何横向扩展? 怎么保证数据的一致性?热点数据的问题怎么解决? RDB持久化生成的数据快照,每次更新是全量更新还是增量更新? 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题怎么解决? 如何高效阅读Redis源代码? 为了更好的学习Redis,吃透Redis,为大家带来三份扎实的学习资料, Redis核心笔记,Redis实战、Redis面试专题以及X-mind版本的Redis学习脑图 …… 由于篇幅原因,资料只做部分展示,需要获取完整资料的朋友麻烦 点击直达 话不多说,来吧!展示! Redis核心笔记 一 Redis 介绍 二 Redis 单机版安装配置 三 Redis 客户端 四 Redis 数据类型 五 Redis 事务 六 Redis 实现分布式锁 七 Redis 持久化方案 八 Redis

架构设计 | 高并发流量削峰,共享资源加锁机制

…衆ロ難τιáo~ 提交于 2020-10-22 08:46:01
本文源码: GitHub·点这里 || GitEE·点这里 一、高并发简介 在互联网的业务架构中,高并发是最难处理的业务之一,常见的使用场景:秒杀,抢购,订票系统;高并发的流程中需要处理的复杂问题非常多,主要涉及下面几个方面: 流量管理,逐级承接削峰; 网关控制,路由请求,接口熔断; 并发控制机制,资源加锁; 分布式架构,隔离服务和数据库; 高并发业务核心还是流量控制,控制流量下沉速度,或者控制承接流量的容器大小,多余的直接溢出,这是相对复杂的流程。其次就是多线程并发下访问共享资源,该流程需要加锁机制,避免数据写出现错乱情况。 二、秒杀场景 1、预抢购业务 活动未正式开始,先进行活动预约,先把一部分流量收集和控制起来,在真正秒杀的时间点,很多数据可能都已经预处理好了,可以很大程度上削减系统的压力。有了一定预约流量还可以提前对库存系统做好准备,一举两得。 场景:活动预约,定金预约,高铁抢票预购。 2、分批抢购 分批抢购和抢购的场景实现的机制是一致的,只是在流量上缓解了很多压力,秒杀10W件库存和秒杀100件库存系统的抗压不是一个级别。如果秒杀10W件库存,系统至少承担多于10W几倍的流量冲击,秒杀100件库存,体系可能承担几百或者上千的流量就结束了。下面流量削峰会详解这里的策略机制。 场景:分时段多场次抢购,高铁票分批放出。 3、实时秒杀 最有难度的场景就是准点实时的秒杀活动

自定义Spring-boot-starter

£可爱£侵袭症+ 提交于 2020-10-19 10:31:47
本文以Jedis举例 pom引入依赖 <groupId>com.bozhon</groupId> <artifactId>redis-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> <name>redis-spring-boot-starter</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency>

Redis-Java项目应用(Jedis、SpringBoot整合、工具类模板)

拜拜、爱过 提交于 2020-10-12 03:46:41
文章目录 Jedis 导入依赖 测试 SpringBoot整合 导入依赖 配置连接 测试 序列化 工具类封装 Jedis Jedis 是Redis官方推荐的Java连接开发工具。 导入依赖 < dependency > < groupId > redis.clients </ groupId > < artifactId > jedis </ artifactId > < version > 3.3.0 </ version > </ dependency > 测试 记得先开启Redis服务 测试了下各API调用,和前两篇讲的命令基本一致,不再赘述。 package com . wzl ; import redis . clients . jedis . Jedis ; import redis . clients . jedis . Transaction ; public class Test { public static void main ( String [ ] args ) { //连接Redis Jedis jedis = new Jedis ( "127.0.0.1" , 6379 ) ; System . out . println ( jedis . ping ( ) ) ; //测试String jedis . set ( "s1" , "v1" ) ; /

Redis集群pipeline批量插入

怎甘沉沦 提交于 2020-10-09 02:01:56
由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: String key = "key"; Jedis jedis = new Jedis("xx.xx.xx.xx"); Pipeline p = jedis.pipelined(); List<String> myData = .... //要插入的数据列表 for(String data: myData){ p.hset(key, data); } p.sync(); jedis.close(); 但实际上遇到的问题是,项目上所用到的Redis是集群,初始化的时候使用的类是JedisCluster而不是Jedis. 去查了JedisCluster的文档, 并没有发现提供有像Jedis一样的获取Pipeline对象的 pipelined()方法. Google了一下, 发现了解决方案. Redis集群规范有说: Redis 集群的键空间被分割为 16384 个槽(slot), 集群的最大节点数量也是 16384 个。每个主节点都负责处理 16384 个哈希槽的其中一部分。当我们说一个集群处于“稳定”(stable)状态时, 指的是集群没有在执行重配置(reconfiguration)操作, 每个哈希槽都只由一个节点进行处理。

造了一个 Redis 分布锁的轮子,没想到还学到这么多东西!!!

|▌冷眼眸甩不掉的悲伤 提交于 2020-10-08 05:33:59
书接上文 上篇文章「 MySQL 可重复读,差点就让我背上了一个 P0 事故! 」发布之后,收到很多小伙伴们的留言,从中又学习到很多,总结一下。 上篇文章可能举得例子有点不恰当,导致有些小伙伴没看懂为什么余额会变负。 这次我们举得实际一点,还是上篇文章 account 表,假设 id=1,balance=1000 ,不过这次我们扣款 1000 ,两个事务的时序图如下: 这次使用两个命令窗口真实执行一把: 注意事务 2,③处查询到 id=1,balance=1000 ,但是实际上由于此时事务 1 已经提交,最新结果如②处所示 id=1,balance=900 。 本来 Java 代码层会做一层余额判断: if (balance - amount < 0) { throw new XXException("余额不足,扣减失败"); } 但是此时由于 ③ 处使用快照读,读到是个旧值,未读到最新值,导致这层校验失效,从而代码继续往下运行,执行了数据更新。 更新语句又采用如下写法: UPDATE account set balance=balance-1000 WHERE id =1; 这条更新语句又必须是在这条记录的最新值的基础做更新,更新语句执行结束,这条记录就变成了 id=1,balance=-1000 。 之前有朋友疑惑 t12 更新之后,再次进行快照读,结果会是多少。 上图执行结果

解决:redis.clients.jedis.exceptions.JedisDataExceptionERR This instance has cluster support disabled

a 夏天 提交于 2020-10-06 02:02:32
1. springCloud 项目启动工程,redis 集群连接报错: Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR This instance has cluster support disabled 2. 解决:在reids 安装服务器上找到配置文件:redis.conf。 放开一个被注释掉的配置,开启集群模式: 原来: # cluster-enabled yes 改为: cluster-enabled yes 3. 重启工程,一切正常。 来源: oschina 链接: https://my.oschina.net/u/4302796/blog/4281070