Redis——SpringBoot项目使用Lettuce和Jedis接入Redis集群
Jedis连接Redis:
非线程安全
如果是多线程环境下共用一个Jedis连接池,会产生线程安全问题,可以通过创建多个Jedis实例来解决,但是创建许多socket会影响性能,因此好一点的方法是使用JedisPool
https://blog.csdn.net/lihao21/article/details/46830553
https://www.jianshu.com/p/5e4a1f92c88f
为什么 jedis不是线程安全的,可以通过一个demo来说明:
public class BadConcurrentJedisTest { private static final ExecutorService pool = Executors.newFixedThreadPool(20); private static final Jedis jedis = new Jedis("127.0.0.1", 6379); public static void main(String[] args) {
for(int i=0;i<20;i++){
pool.execute(new RedisSet());
}
} static class RedisSet implements Runnable{ @Override
public void run() {
while(true){
jedis.set("hello", "world");
}
} }
这时候后台报错:
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Socket Closed
主要的原因就在于jedis实例中的两个成员变量:RedisInputStream和RedisOutputStream
jedis在执行每一个命令之前都会先执行connect方法,socket是一个共享变量,在多线程的情况下可能存在:线程1执行到:
outputStream = new RedisOutputStream(socket.getOutputStream());
inputStream = new RedisInputStream(socket.getInputStream());
线程2执行到:
socket = new Socket();
socket.connect(new InetSocketAddress(host, port), connectionTimeout);
Jedis解决线程安全的方式就是使用连接池:
Lettuce连接Redis:
线程安全
Lettuce是基于netty的,性能比较好。
多线程使用同一连接实例时,是线程安全的。
application-test.yml
redis:
nodes:
- host1:port1
- host2:port2
-----------------------------------------------------------------Lettuce-----------------------------------------------------------------
导入依赖:
//Redis
compile 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
配置类:
import io.lettuce.core.RedisURI;
import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
import io.lettuce.core.cluster.api.sync.RedisClusterCommands;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.ArrayList;
import java.util.List; @Configuration
@ConfigurationProperties(prefix = "redis")
public class LettuceConfig {
private List<String> nodes; public List<String> getNodes() {
return nodes;
} public void setNodes(List<String> nodes) {
this.nodes = nodes;
} @Bean
RedisClusterCommands<String, String> redisCommands() {
List<RedisURI> uriList = new ArrayList<>();
nodes.forEach(node -> {
String[] addrStr = node.split(":");
String host = addrStr[0];
int port = Integer.parseInt(addrStr[1]); RedisURI redisUri = RedisURI.Builder.redis(host).withPort(port).build();
uriList.add(redisUri);
});
RedisClusterClient redisClient = RedisClusterClient.create(uriList);
StatefulRedisClusterConnection<String, String> connection = redisClient.connect();
RedisClusterCommands<String, String> syncCommands = connection.sync(); return syncCommands;
} }
-----------------------------------------------------------------Jedis-----------------------------------------------------------------
导入依赖:
compile group: 'redis.clients', name: 'jedis', version: '2.9.0'
配置类:
package com.youdao.outfox.interflow.config; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster; import java.util.HashSet;
import java.util.List;
import java.util.Set; @Configuration
@ConfigurationProperties(prefix = "redis")
public class JedisClusterConfig { private List<String> nodes; public List<String> getNodes() {
return nodes;
} public void setNodes(List<String> nodes) {
this.nodes = nodes;
} @Bean
public JedisCluster jedisCluster() {
Set<HostAndPort> jedisClusterNodes = new HashSet<>();
nodes.forEach(node -> {
String[] addrStr = node.split(":");
String host = addrStr[0];
int port = Integer.parseInt(addrStr[1]);
jedisClusterNodes.add(new HostAndPort(host, port));
});
return new JedisCluster(jedisClusterNodes, 5, 2);
}
}
--------------------------------更新-------------------------------------
Redis——SpringBoot项目使用Lettuce和Jedis接入Redis集群的更多相关文章
- redis在项目中的使用(单机版、集群版)
1.下载jar包:jedis-2.6.2.jar 2.代码: JedisDao.java: package com.test.www.dao; public interface JedisDao { ...
- Redis(七):Jedis简介和集群
Jedis简介 1.Jedis 是Redis 客户端工具jar2.使用非集群版示例代码 Jedis jedis = new Jedis("192.168.139.132", 637 ...
- redis在Windows下以后台服务一键搭建集群(多机器)
redis在Windows下以后台服务一键搭建集群(多机器) 一.概述 此教程介绍如何在windows系统中多台机器之间布置redis集群,同时要以后台服务的模式运行.布置以脚本的形式,一键完成.多台 ...
- redis在Windows下以后台服务一键搭建集群(单机--伪集群)
redis在Windows下以后台服务一键搭建集群(单机--伪集群) 一.概述 此教程介绍如何在windows系统中同一台机器上布置redis伪集群,同时要以后台服务的模式运行.布置以脚本的形式,一键 ...
- Redis三种模式——主从复制,哨兵模式,集群
一.Redis主从复制作用 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复:实际上是一种服务的冗余. 负 ...
- Docker Compose搭建Redis一主二从三哨兵高可用集群
一.Docker Compose介绍 https://docs.docker.com/compose/ Docker官方的网站是这样介绍Docker Compose的: Compose是用于定义和运行 ...
- redis 在windows 上面的安装和使用,集群搭建
redis作为nosql数据库,将数据存储到内存中(缓存),具有非常高的性能.下面讲解一下redis的安装及java api的使用. 1:redis 安装 windows 上面直接下载msi文件,安装 ...
- SpringBoot中使用消息中间件Kafka实现Websocket的集群
1.在实际项目中,由于数据量的增大及并发数的增多,我们不可能只用一台Websocket服务,这个时候就需要用到Webscoket的集群.但是Websocket集群会遇到一些问题.首先我们肯定会想到直接 ...
- jedis:分片集群使用
jedis使用 引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis ...
随机推荐
- comodo firewall 科莫多离线安装
comodo firewall是什么?他配有HIPS,配置好规则就可以比杀软强不是一个两个档次,但是新手不建议使用. 注意:不用使用疯狂模式后锁屏,不然系统都打不开. 下载地址: https://do ...
- python+selenium调用JavaScript
有些浏览器的页面操作,不能依靠WebDriver提供的API来操作,需要借助JavaScript脚本. webdriver提供了execute_script()方法来执行JavaScript代码. f ...
- PTA(Advanced Level)1031.Hello World for U
Given any string of N (≥5) characters, you are asked to form the characters into the shape of U. For ...
- [转帖]超能课堂:Intel平台芯片组变迁史
https://www.expreview.com/69419.html 现在我们在购买电脑时一个最重要的硬件就是主板了.作为承载CPU等主要硬件的平台,其最重要的功能就是连接外围设备,扩展计算机.但 ...
- Java代码 简单用于处理和数据库相关的操作
package util; import org.apache.commons.beanutils.BeanUtils; import java.lang.reflect.InvocationTarg ...
- json与String的转化
String转成jsonObject JsonObject json = JsonObject.fromObject(String str) String转成JsonArray J ...
- Mac OS 下定制终端颜色
方法 有五种方法, 参考网站,我使用的是 Oh My Zsh 方案一:(通过 .bash_profile 文件自定制) 方案二:(也是修改 ~/.bash_profile) 方案三:(三方插件 Oh ...
- (转)MQTT 入门介绍
原文链接:https://blog.csdn.net/qq_2887... MQTT 入门介绍 一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测 ...
- (转)Cvte提前批
1. 加密解密了解么?几种算法,讲一下你了解的(链接) 算法选择:对称加密AES,非对称加密: ECC,消息摘要: MD5,数字签名:DSA 常见加密算法 1.DES(Data Encryption ...
- EJS学习(三)之语法规则中
⚠️实例均结合node,也就是AMD规范版本 ejs中使用render()表示渲染文本 接收三个参数:模版字符串.data.options,返回一个字符串 const ejs = require('e ...