首页 > 数据库 >Redis之Java客户端连接

Redis之Java客户端连接

时间:2023-09-26 18:44:30浏览次数:43  
标签:slot Redisson Java redis Redis static ip new 客户端

Spring整合Redis

使用Lettuce框架访问Redis

private static RedisCommands<String, String> createRedisCommands() {
    RedisURI.Builder builder = RedisURI.Builder.redis("", 6379);
    builder.withPassword("test123").withDatabase(1);
    RedisClient redisClient = RedisClient.create(builder.build());
    StatefulRedisConnection<String, String> connection = redisClient.connect();
    return connection.sync();
}

使用spring-data-redis访问Redis

private static LettuceConnectionFactory createConnectionFactory() {
    RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration();
    standaloneConfiguration.setDatabase(1);
    standaloneConfiguration.setHostName("");
    standaloneConfiguration.setPassword("test123");
    LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(
    standaloneConfiguration);
    connectionFactory.afterPropertiesSet();
    return connectionFactory;
}

private static StringRedisTemplate createStringRedisTemplate() {
    LettuceConnectionFactory connectionFactory = createConnectionFactory();
    return new StringRedisTemplate(connectionFactory);
}

消息发布

// 消息发布
StringRedisTemplate redisTemplate = createStringRedisTemplate();
redisTemplate.convertAndSend("test1", "hello");

消息订阅

private static RedisMessageListenerContainer createMessageListenerContainer(
    RedisConnectionFactory connectionFactory, MessageListener messageListener) {
    RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
    listenerContainer.setConnectionFactory(connectionFactory);
    listenerContainer.addMessageListener(messageListener, new ChannelTopic("test1"));
    listenerContainer.afterPropertiesSet();
    listenerContainer.start();
    return listenerContainer;
}

可以自己实现 MessageListener 接口,也可以使用MessageListenerAdapter委托

static class MyMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println(new String(message.getBody()));
    }
}
static class MyMessageListener extend MessageListenerAdapter {

    //方法名称固定,参数也是固定,必须为public
    public void handleMessage(String text, String channel) {
        System.out.println(text);
        System.out.println(channel);
    }
}

使用Redisson连接Redis

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.16.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.glassfish</groupId>
            <artifactId>jakarta.el</artifactId>
        </exclusion>
    </exclusions>
</dependency>

RedissonAutoConfiguration自动配置了RedissonClient实现。

Redisson使用哨兵模式连接服务器

private static RedissonClient createRedissonSentinelClient() {
        //通过哨兵获取到master节点的实际地址,请求此节点
        Config config = new Config();
        SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
        sentinelServersConfig.setSentinelAddresses(Arrays.asList(
                "redis://ip:26380",
                "redis://ip:26381",
                "redis://ip:26382"
        ));
        sentinelServersConfig.setMasterName("mymaster");
        //报错 SENTINEL SENTINELS command returns less than 2 nodes 具体原因未知
        sentinelServersConfig.setCheckSentinelsList(false);
        return Redisson.create(config);
    }

主要需要配置哨兵的地址和master名称,Redisson内部会定时和哨兵服务通信,检查master节点是否有变更。

Redisson使用集群模式连接服务器

cluster slots # 查询slot在所有节点的分布情况
cluster keyslot key # 计算key对应的slot

具体计算slot的算法为 CRC16 % 16384,Redisson中通过ClusterConnectionManager的calcSlot()方法来实现。如果一个key格式为

cluster keyslot prefix:{hash_tag}:suffix

那么会取其中的hash_tag来计算slot,这个可以实现多个不同的key具有相同的slot

cluster keyslot user:{10086}:friends
cluster keyslot user:{10086}:videos

结果都为 5466 = CRC16("10086") % 16384

private static RedissonClient createRedissonClusterClient(){
        Config config = new Config();
        ClusterServersConfig clusterServersConfig = config.useClusterServers();
        clusterServersConfig.setNodeAddresses(Arrays.asList(
                "redis://ip:6371",
                "redis://ip:6372",
                "redis://ip:6373",
                "redis://ip:6374",
                "redis://ip:6375",
                "redis://ip:6376"
        ));
        clusterServersConfig.setPassword("test123");
        //报错 Not all slots covered! Only 10923 slots are available.
        clusterServersConfig.setCheckSlotsCoverage(false);
        return Redisson.create(config);
    }

通过 cluster nodes 命令获取到所有节点及对应的slot范围。创建slot->node的对应关系,实际执行命令时,先根据key计算出slot,再根据对应关系找到要执行的节点。

Redisson内部会定时和集群服务通信,检查节点是否有增加或删除,来调整slot的对应关系。

Redisson 对lua脚本的处理

Lua和事务需要操作的key,必须在同一个节点上,Redis Cluster提供了hashtag,Redisson内部的lua脚本就使用了这种特性,如RedissonBloomFilter,RedissonIdGenerator等。我们如果想自定义脚本,也必须使用这种方式,确保在集群模式下不出错。

标签:slot,Redisson,Java,redis,Redis,static,ip,new,客户端
From: https://www.cnblogs.com/strongmore/p/17131255.html

相关文章

  • 无涯教程-JavaScript - STDEVA函数
    描述STDEVA函数根据样本估算标准偏差。标准偏差是对值与平均值(平均值)的分散程度的度量。语法STDEVA(value1,[value2]...)争论Argument描述Required/OptionalValue11至255个值,对应于总体样本。您也可以使用单个数组或对数组的引用,而不要使用以逗号分隔的参数......
  • 转!!java ssh远程服务器报错 解决方法 Key exchange was not finished, connection is c
    转自:https://blog.csdn.net/weixin_45266856/article/details/129754122是ssh中的key交换算法不兼容导致 ssh报错解决:vi/etc/ssh/sshd_configKexAlgorithmsdiffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-gro......
  • 用Java 开发 WebService Axis简单实例
    [code]本人的开发环境eclipse3.2,tomcat5.0.28,jdk1.4axis_1.4目前最新版这里主要讲一下webservice的一个开发过程,1.下载axis1.4最新版本http://apache.mirror.phpchina.com/ws/axis/1_4/2.将解压后的axis-1_4文件下的webapps目录下的axis目录考......
  • 修改java项目启动后在jps展示的名称
    问题在服务器上启动jar包的时候,通过jps查看java进程只展示个jar解决,指定jar包的全路径java-jar/root/test/aaa.jarjps查看494976aaa.jarmaven打包修改jar名称修改build下的finalName即可:<build><finalName>springboot-yida-aaa</finalName></build>......
  • JavaScript——判断0, NaN, false, null, underfined, 空字符串
    1.判断NaN//NaN出现的原因:(NotaNumber)//操作两个类型不一致的数、用NaN值计算最终得到NaN、不合法运算(如0/0)letnum=0/0;if(isNaN(num)){console.log("num为NaN!")}2.判断undefinedlettemp=undefined//方法一if(typeof(temp)=="undefined"......
  • java八股文
     java的单继承,实现runable接口,本质上都是这样来执行线程的 runable是函数接口,lambda表达式,启动线程,Callable接口,Futuretask传给Thread,thread执行外方法,实际上也是runable线程池来创建线程 ......
  • Java 21 正式 GA,虚拟线程真的来了
    UTC时间2023年9月19日,期盼已久的Java21终于发布正式版!本文一起来看看其中最受Java开发者关注的一项新特性:Loom项目的两个新特性之一的”虚拟线程(VirtualThread)“(另外一个新特性是”结构化并发(StructuredConcurrency)“,当前是预览状态),它被称之为Java版的”协......
  • docker-compose安装Redis
    一、单机版本1、docker-composeversion:'3'services:redis:image:redis:5.0restart:alwaysprivileged:truecontainer_name:redis-javaports:-6379:6379volumes:-/var/docker/server/redis/redis.conf:/etc/redis......
  • Redis内存碎片:深度解析与优化策略
    本文已收录至GitHub,推荐阅读......
  • Redis系列23:性能优化指南
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......