spring-data-redis文档: https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/reference/html/#new-in-2.0.0
Redis 文档: https://redis.io/documentation
Redis 中文文档: http://www.redis.cn/commands.html

本文学习一下如何通过 Java 操作 Redis。

Java 操作 Redis 的库有两个,Jedis 和 Lettuce,目前 SpringBoot 2.x 中已经将 Jedis 换成了 Lettuce。

Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例

本文直接从 Lettuce 来学习。

基本使用

1:添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

java 中通过 Lettuce 来操作 Redis

 

属性配置

在 application.properties 文件中配置如下内容

spring.redis.host=localhost
#spring.redis.password=battcn
# 连接超时时间(毫秒)
spring.redis.timeout=10000
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

java 中通过 Lettuce 来操作 Redis

 

 

 

实体类

创建一个User

java 中通过 Lettuce 来操作 Redis

private static final long serialVersionUID = 8655851615465363473L;
private Long id;
private String username;
private String password;


public Users(Long id, String username, String password) {
    this.id = id;
    this.username = username;
    this.password = password;
}

public static long getSerialVersionUID() {
    return serialVersionUID;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}


@Override
public String toString() {
    return "Users{" +
            "id=" + id +
            ", username='" + username + '\'' +
            ", password='" + password + '\'' +
            '}';
}

 

 

 

新建RedisCacheAutoConfiguration配置类

java 中通过 Lettuce 来操作 Redis

默认情况下的模板只能支持RedisTemplate<String, String>,也就是只能存入字符串,这在开发中是不友好的,所以自定义模板是很有必要的,当自定义了模板又想使用String存储这时候就可以使用StringRedisTemplate的方式,它们并不冲突

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisCacheAutoConfiguration {

    @Bean
    public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Serializable> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

 

 

 

 

新建一个SpringbootRedisDemoApplicationTests类测试

java 中通过 Lettuce 来操作 Redis

private static final Logger log = LoggerFactory.getLogger(SpringbootRedisDemoApplicationTests.class);

@Autowired
private StringRedisTemplate stringRedisTemplate;

@Autowired
private RedisTemplate<String, Serializable> redisCacheTemplate;


@PostMapping
public void get() {
    ExecutorService executorService = Executors.newFixedThreadPool(8888);
    IntStream.range(0, 8888).forEach(i ->
            executorService.execute(() -> stringRedisTemplate.opsForValue().increment("dd", 1))
    );
    stringRedisTemplate.opsForValue().set("flag", "好");
    final String a = stringRedisTemplate.opsForValue().get("flag");
    log.info("[字符缓存结果] - [{}]", a);
    String key = "opsForValue:user:1";
    redisCacheTemplate.opsForValue().set(key, new Users(99L, "小王", "18"));
    final Users user = (Users) redisCacheTemplate.opsForValue().get(key);
    System.out.println(user + "*****");
    log.info("[对象缓存结果] - [{}]", user);
}

 

用postman发起请求

java 中通过 Lettuce 来操作 Redis

 

客户端工具显示效果

java 中通过 Lettuce 来操作 Redis

 

下列的就是Redis其它类型所对应的操作方式

  • opsForValue: 对应 String(字符串)
  • opsForZSet: 对应 ZSet(有序集合)
  • opsForHash: 对应 Hash(哈希)
  • opsForList: 对应 List(列表)
  • opsForSet: 对应 Set(集合)
  • opsForGeo: 对应 GEO(地理位置)

 

 

 

 

 

 

 

 

相关文章:

  • 2021-06-28
  • 2022-12-23
  • 2022-12-23
  • 2021-06-14
  • 2021-09-04
  • 2021-07-04
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-07
  • 2021-05-02
相关资源
相似解决方案