jedis

手写redis客户端

那年仲夏 提交于 2020-11-09 10:56:31
一、RESP通信协议 Redis Serialization Protocol (Redis序列化协议). 特点:容易实现、解析快、可读性强 以\r\n分割数据. 二、撸代码 package com.dongnao.demo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * Created by crescendo.tian on 2018/8/27. */ public class TqRedis { private Socket socket; private OutputStream write; private InputStream read; public TqRedis(String host, int port) throws IOException { socket = new Socket(host, port); } public void set(String key, String val) throws IOException { StringBuffer sb = new StringBuffer(); sb.append( "*3").append("\r\n"); //

nginx+redis安装配置(内存型数据库)实现session的共享

五迷三道 提交于 2020-10-31 05:29:46
注意:借鉴原文章: http://www.cnblogs.com/roy-blog/p/7196054.html    感兴趣的可以加一下481845043 java交流群,共同进步。 1 session的概念    在网络应用中我们会称为“会话控制”,在开发中我们常称其为session对象,用来存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。注意 :会话状态仅在支持 cookie 的浏览器中保留。 2 为什么实现session共享   在利用nginx实现了负载均衡和动静分离之后,会面临一个内存数据同步的问题,我们通常将一些例如:用户信息,重要标识等具有 唯一标识 的数据,存在内存中,典型的一种就是在数据存在session中。例如:我有A,B两台服务器做了负载均衡,当我在A服务器上执行了登录并且将登录数据存入session的时候,这些session数据只存在于A服务器上

nginx+redis安装配置(内存型数据库)实现session的共享

浪尽此生 提交于 2020-10-31 05:29:33
注意:借鉴原文章: http://www.cnblogs.com/roy-blog/p/7196054.html 1 session的概念   在网络应用中我们会称为“会话控制”,在开发中我们常称其为session对象,用来存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。注意 :会话状态仅在支持 cookie 的浏览器中保留。 2 为什么实现session共享   在利用nginx实现了负载均衡和动静分离之后,会面临一个内存数据同步的问题,我们通常将一些例如:用户信息,重要标识等具有唯一标识的数据,存在内存中,典型的一种就是在数据存在session中。例如:我有A,B两台服务器做了负载均衡,当我在A服务器上执行了登录并且将登录数据存入session的时候,这些session数据只存在于A服务器上,而没有在B服务器上,假如在处理下一个请求的时候,我需要用到session的数据

nginx+redis实现session的共享

♀尐吖头ヾ 提交于 2020-10-31 05:04:33
1.第一步是安装redis,我的服务器是windows的,下载的是免安装版本,解压以后就可以了,其目录如下。一开始redis是默认不需要密码,如果想要设置密码,可以进入redis.windows.conf文件下找到requirepass,删除前面的#号,在其后面便可以设置密码。 2.从cmd进入redis的根目录,键入如下指令:redis-server.exe redis.windows.conf。这样就可以启动redis了,如果启动成功,则会出现下面画面。当然还可以修改conf文件,加上密码。requirepass xxxxx。如果要允许远程也能访问,则需要将bind指令注释掉,该指令默认绑定了127.0.0.1这个ip也就是本地。 3.接下来我们就可以做一些配置工作,来实现session数据的全局缓存。 1)首先是添加jar包,如果你是maven项目,需要在pom.xml加入下面代码 <!-- redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.3.1.RELEASE</version> <type>pom</type> </dependency>

springboot 整合Redis-Jedis

允我心安 提交于 2020-10-29 01:02:00
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xiao</groupId> <artifactId>boot-jedis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>boot

SpringBoot系列: Redis 共享Session

元气小坏坏 提交于 2020-10-28 11:54:01
Web项目Session管理是一个很重要的话题, 涉及到系统横向扩展, SpringBoot已经为共享Session很好的解决方案, 这篇文章关注使用Redis共享会话, 同时这也是最常用的方法. ============================ pom.xml 增加依赖 ============================ SpringBoot2 已经将Redis底层客户端从Jedis切换为Lettuce库, Lettuce 是基于Netty的实现, 比 Jedis 更加高效, 并且是线程安全的, 能满足多线程环境下并发需求, 同时支持线程池. 使用 Lettuce 客户端(推荐), pom.xml的依赖有: < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-data-redis </ artifactId > </ dependency > < dependency > < groupId > org.apache.commons </ groupId > < artifactId > commons-pool2 </ artifactId > </ dependency > <!-- Session 依赖 --> <

Java与Redis

Deadly 提交于 2020-10-28 06:00:06
1、下载Java使用Redis架包并引入 jedis-2.9.0.jar 2、用Java使用Redis如下: package com.jef.redis; import redis.clients.jedis.Jedis; import java.util.Iterator; import java.util.List; import java.util.Set; /** * @author Jef */ public class RedisJava { public static void main(String[] args) { Jedis jedis = getAuthJedis(); getString(jedis); getList(jedis); getSet(jedis); } /** * 获取认证的Jedis对象 * @return */ public static Jedis getAuthJedis() { // 连接本地的 Redis 服务 Jedis jedis = new Jedis("localhost" ); // 使用 CONFIG SET requirepass "root",其中root可自定义,如果已经设置了, // 可以通过CONFIG GET requirepass获取 jedis.auth("root" ); System.out

Redis BigKey介绍

不想你离开。 提交于 2020-10-28 04:45:48
一、什么是bigkey 在Redis中,一个字符串最大512MB,一个二级数据结构(例如hash、list、set、zset)可以存储大约40亿个(2^32-1)个元素,但实际上中如果下面两种情况,我就会认为它是bigkey。 字符串类型 :它的big体现在单个value值很大,一般认为超过10KB就是bigkey。 非字符串类型 :哈希、列表、集合、有序集合,它们的big体现在元素个数太多。 二、危害 bigkey可以说就是Redis的老鼠屎,具体表现在: 1.内存空间不均匀 这样会不利于集群对内存的统一管理,存在丢失数据的隐患。 2.超时阻塞 由于Redis单线程的特性,操作bigkey的通常比较耗时,也就意味着阻塞Redis可能性越大,这样会造成客户端阻塞或者引起故障切换,它们通常出现在慢查询中。 例如,在Redis发现了这样的key,你就等着DBA找你吧。 127 .0 .0 .1 :6379 > hlen big :hash(integer) 2000000127 .0 .0 .1 :6379 > hgetall big :hash 1) " a " 2) "1" 3.网络拥塞 bigkey也就意味着每次获取要产生的网络流量较大,假设一个bigkey为1MB,客户端每秒访问量为1000,那么每秒产生1000MB的流量,对于普通的千兆网卡(按照字节算是128MB/s

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

烂漫一生 提交于 2020-10-28 04:26:07
  在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

springBoot集成redisson实现分布式锁

偶尔善良 提交于 2020-10-27 18:55:08
场景 公司有块业务需要跑定时业务,来处理数据,后台采用 springBoot 开发的, springBoot 集成定时任务还是挺简单的,使用 Scheduled 配置好 cron 就可以使用了,有个业务是每个小时的45分钟执行一次,因为后台是集群部署的,前端用 Nginx 做的负责均衡,就牵扯到一个问题,同一时刻,后台的定时任务只能用一个触发,最开始采用的 redis 做分布式锁,客户端是使用的 Jedis ,实现的分布式锁,网上基于 redis 实现分布式锁的文章太多了,这里就不再阐述了 基于 Jedis 实现分布式锁的初始代码如下 package com.juyi.camera.cache; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis;