Redis初步探索

Redis简介与相关特性

Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis以其快速、高效的特性而闻名,通常用于解决许多不同的用例,如缓存、会话存储、实时分析、队列系统等。

以下是 Redis 的一些关键特性:

  1. 内存存储: Redis的数据存储在内存中,这使得它具有非常高的读写速度。它通过周期性地将数据持久化到磁盘上的日志文件来确保数据持久性。
  2. 数据结构的多样性: Redis支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。这些数据结构允许开发者以更高层次的抽象方式处理数据,使其非常适用于各种不同类型的应用程序。
  3. 持久化: Redis允许将内存中的数据持久化到磁盘上,以便在重新启动后恢复数据。它支持两种主要的持久化方式:RDB(快照)和AOF(日志)。
  4. 发布/订阅: Redis提供了发布/订阅模式,允许多个客户端订阅频道并接收消息。这种模式非常适合消息传递和实时通信。
  5. 原子操作: Redis支持原子操作,这意味着可以执行多个操作作为单个、不可分割的操作。这对于实现计数器、锁定和事务等功能非常有用。
  6. 集群支持: Redis提供了集群模式,可以在多个节点之间分布数据,提供更高的可扩展性和容错能力。
  7. 高性能: Redis是非常快速的,因为它的数据存储在内存中,并使用高效的数据结构和算法来处理数据操作。

Redis通常用于以下场景:

  • 缓存: 作为高性能缓存系统,以减轻数据库负载。
  • 会话存储: 存储用户会话数据,例如Web应用程序中的用户登录信息。
  • 消息队列: 通过列表数据结构提供可靠的消息队列功能。
  • 实时数据分析: 支持高速数据读写,适用于实时分析和统计。
  • 计数器、排行榜等: 适合于实现计数器、排行榜和实时数据更新等功能。

使用redisTemplete操作Redis

1. 添加 Redis 依赖

pom.xml 文件中添加 Redis 相关的依赖项。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置 Redis 连接

application.propertiesapplication.yml 文件中添加 Redis 连接配置信息,包括 Redis 服务器地址、端口、密码、连接池配置等。

# Redis 连接配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=xxxxxx
spring.redis.database=0

3. 创建 Redis 配置类

创建一个配置类,配置 RedisTemplate 或者其他 Redis 相关的 Bean,自定义一些配置选项。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisHost, redisPort);
        lettuceConnectionFactory.setPassword(redisPassword);
        return lettuceConnectionFactory;
    }

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

4. 使用 RedisTemplate 进行操作

在需要的类中注入 RedisTemplate Bean,使用它进行 Redis 相关的操作。




import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisService {

    private final RedisTemplate<String, Object> redisTemplate;

    @Autowired
    public RedisService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void setValue(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void setList(String key, List list) {
        redisTemplate.opsForValue().set(key, list);
    }

    public List<T> getValue(String key) {
        return (List<T>)redisTemplate.opsForValue().get(key);
    }



    // 其他操作方法...
}

不同数据类型的操作方法:

opsForValue String值

opsForList 列表List

opsForHash 哈希表Hash

opsForZSet 有序集合Sorted Set

opsForSet 集合

使用Jedis操作Redis

1. 在项目中添加 Jedis 的依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.8.0</version> 
</dependency>

2. 使用 Jedis 对Redis 进行操作

 import redis.clients.jedis.Jedis;

public class JedisExample {

    public static void main(String[] args) {
        // 创建 Jedis 客户端连接到 Redis 服务器
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 设置键值对
            jedis.set("mykey", "Hello Redis!");

            // 获取值
            String value = jedis.get("mykey");
            System.out.println("Value for 'mykey': " + value);
        }
    }
}

3. 使用 Jedis 创建连接池对Redis 进行操作

public void testPool(){
    // 创建Redis连接池
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(20);
    jedisPoolConfig.setMaxIdle(5);
    jedisPoolConfig.setMinIdle(3);
    JedisPool jedisPool = new JedisPool(jedisPoolConfig,"localhost",6379);
    // 获取连接池资源 对Redis进行数据操作
    Jedis jedis = jedisPool.getResource();
    jedis.set("name","smallming-pool");
    String value = jedis.get("name");
    System.out.println(value);
}

4. 使用 Jedis 对Redis 集群进行操作

localhostpublic void testCluster(){
    // 创建集群连接
    Set<HostAndPort> set = new HashSet<>();
    set.add(new HostAndPort("localhost",7001));
    set.add(new HostAndPort("localhost",7002));
    set.add(new HostAndPort("localhost",7003));
    set.add(new HostAndPort("localhost",7004));
    set.add(new HostAndPort("localhost",7005));
    set.add(new HostAndPort("localhost",7006));
    JedisCluster jedisCluster = new JedisCluster(set);
    // 对集群进行数据操作
    jedisCluster.set("name","smallming");
    String value = jedisCluster.get("name");
    System.out.println(value);
}

两种连接方式的区别

Jedis特点:

  • 直接连接 Redis: Jedis 是一个直接连接 Redis 服务器的 Java 客户端库。它提供了简单且直接的 API,使得与 Redis 服务器进行交互变得容易。
  • 同步阻塞: Jedis 是一个同步、阻塞的客户端,这意味着当执行某些操作时,线程可能会被阻塞,直到操作完成。
  • 线程不安全: Jedis 实例不是线程安全的,因此在多线程环境下需要注意同步问题。
  • 功能丰富: Jedis 提供了丰富的方法来执行 Redis 支持的各种操作,例如字符串、哈希表、列表、集合等数据结构,以及事务、管道等。

RedisTemplate特点:

  • Spring Data Redis 抽象: RedisTemplate 是 Spring Data Redis 提供的 Redis 客户端,它提供了对 Redis 的访问,并对操作进行了更高级的抽象和封装。
  • 与 Spring 集成: RedisTemplate 集成了 Spring 框架,可以很容易地在 Spring 应用程序中使用。
  • 线程安全: RedisTemplate 是线程安全的,因为它是基于 Spring 的 Bean,可以在多线程环境中安全地共享。
  • 序列化支持: RedisTemplate 提供了对象序列化和反序列化的支持,可以更方便地存储和检索 Java 对象。

主要区别总结:

  • 实现方式: Jedis 是一个直接连接 Redis 服务器的原生客户端;而 RedisTemplate 是基于 Spring Data Redis 的高级抽象,与 Spring 框架集成,提供更多功能和便利。
  • 线程安全性: RedisTemplate 是线程安全的,适合在多线程环境中使用;而 Jedis 实例则不是线程安全的,需要开发者自行处理线程安全问题。
  • Spring 集成: 如果已经使用了 Spring 框架,且想要更高层次的抽象和更好的集成,那么使用 RedisTemplate 可能更为合适。而如果你更喜欢直接操作 Redis,并且不需要 Spring 提供的特性,那么可以选择 Jedis。