java客户端连接redis

一、连接方案

jedis连接实现
lettuce连接实现
redisson连接

jedis连接

简单实用,但是jedis的实例是线程不安全的,多线程环境下需要基于链接池来使用

演示

首先要新建一个maven工程,然后引入下面的pom依赖

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.7.0</version>
            <scope>test</scope>
        </dependency>

简单连接

编写测试类

/**
 * @author: 
 * @date: 2022/3/24 18:30
 * @description:
 */
public class JedisTest {
    private Jedis jedis;

    @BeforeEach
    void setUp(){
        jedis = new Jedis("127.0.0.1",6379);
        jedis.select(0);
    }

    @Test
    public void setRedis(){
        jedis.set("name","小明");
        System.out.println(jedis.get("name"));
    }

测试结果:


image.png

连接池的形式连接

package redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author: 
 * @date: 2022/3/24 18:36
 * @description: Jedis连接池
 */
public class JedisConnetFactory {

    private static final JedisPool jedisPool;

    static{
        // 配置连接池
        JedisPoolConfig config = new JedisPoolConfig();
        // 最大连接数
        config.setMaxTotal(8);
        // 最大空闲链接
        config.setMaxIdle(8);
        // 最小空闲链接
        config.setMinIdle(0);
        // 最长等待时间
        config.setMaxWaitMillis(1000);
        jedisPool = new JedisPool(config,"127.0.0.1",6379);
    }

    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

编写测试类

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.JedisConnetFactory;
import redis.clients.jedis.Jedis;

/**
 * @author: 
 * @date: 2022/3/24 18:30
 * @description:
 */
public class JedisTest {
    private Jedis jedis;

    @BeforeEach
    void setUp(){
        jedis = JedisConnetFactory.getJedis();
        jedis.select(0);
    }

    @Test
    public void setRedis(){
        jedis.set("name","小明");
        System.out.println(jedis.get("name"));
    }

可以手动模拟测试一下。

lettuce连接

是基于netty实现的,支持同步,异步,响应式编程方式,并且是线程安全的。支持redis的哨兵模式,集群模式和管道模式

lettuce连接已经在springboot中帮我们集成了,我们只需要创建一个spring-boot的maven工程,然后引入下面的pom依赖就行了

        <!--spring-data-redis-->
        <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>
        <!--json依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

配置数据源

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    lettuce:
      pool:
        # 最大连接数
        max-activity: 8 
        # 最大空闲链接
        max-idle: 8
        # 最小空闲链接
        min-idle: 0
        # 最长等待时间
        max-wait: 1000

启动类设置一下
@ComponentScan("com.mumu.*")
配置哪些包下的类需要被spring管理

@SpringBootApplication
@ComponentScan("com.mumu.*")
public class SpringRedisDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringRedisDemoApplication.class, args);
    }
}

编写测试类

@SpringBootTest
class SpringRedisDemoApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        stringRedisTemplate.opsForValue().set("name", "张三");
        Object openId = stringRedisTemplate.opsForValue().get("name");
        System.out.println(openId);
    }
}

这里我默认使用StringRedisTemplate模板,没有使用默认的RedisTemplate模板,因为RedisTemplate写入的时候序列化,会自动使用默认的jdk序列化,从而导致你存的时候key=name,value = 张三,但是在redis中你查看会发现乱码。
此时你可以按照上面的写法用StringRedisTemplate这个对象,也可以自己定义序列化。
自定义RedisTemplate序列化方式

/**
 * @author: 
 * @date: 2022/3/24 19:13
 * @description:
 */
@Configuration
public class RedisConfig {

    @Bean("redisTemplate")
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer stringSerializer = new StringRedisSerializer();
        template.setConnectionFactory(factory);
        // 创建json序列化工具对象
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置key的序列化
        template.setKeySerializer(stringSerializer);
        template.setHashKeySerializer(stringSerializer);
        // 设置value的序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }
}

这里需要注意的是redisTemplate被你自己定义成一个Bean的时候,在注入spring容器的时候是不会去覆盖默认的beanName = redisTemplate 的Bean,所以这时候你用@Autowired注解去注释的时候,会出现一个属性注入失败的报错,这时候你应该用@Resource注解去注入,我用的是springboot-2.6.4版本出现的问题。我后来就索性直接不适用自定义的redisTemplate,而是用StringRedisTemplate就很好的规避了这块的问题。

redisson连接

是基于redis实现的分布式,可伸缩的java数据结构集合,包含了诸如map,queue,lock等强大功能
redisson主要是封装了针对redis的一系列的操作的工具包。比如分布式锁的实现等等。

<!--引入redisson组件-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.13.6</version>
        </dependency>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容