redis知识

HanGR 于 2024-09-14 发布


Redis


数据类型


高级数据结构


应用场景

  1. 缓存: Redis可以用作缓存, 降低数据库的查询压力, 提升响应速度.

  2. 计数器: Redis可以用作计数器, 如用户访问计数, 商品销量统计等.

  3. 排行榜: Redis可以用作排行榜, 如热门商品排行榜, 高分榜等.

  4. 发布/订阅: Redis可以用作消息队列, 发布者发布消息, 消费者接收消息.

  5. 任务队列: Redis可以用作任务队列, 将耗时的任务放入队列, 异步执行.

  6. 全文搜索: Redis可以用作全文搜索, 存储大量文本数据, 提供搜索功能.

  7. 地理位置: Redis可以用作地理位置, 存储经纬度信息, 实现地理位置信息的查找.


java里如何使用Redis?

  1. 介绍Java中常用的redis客户端

    • java中有多种Redis客户端, 我们可以根据自己的业务场景选择适合的客户端.
    • (1) Spring Data Redis(推荐): 基于Spring的Redis客户端, 封装了Redis操作的常用方法.
    • (2) Jedis: 一个独立于Spring的Redis客户端, 实现了Redis命令的封装.
    • (3) Lettuce: 一个Redis客户端, 实现了Redis命令的异步封装, 高阶操作.
    • (4) Redisson: 一个分布式的Redis客户端, 可以像使用本地集合一样操作Redis, 支持分布式锁等高级功能.
  2. 介绍Spring Data 和 Spring Data Redis

    • Spring Data 是通用的数据访问框架,定义了一组增删改查的接口,支持操作Redis, MySQL, MongoDB, jpa等.
    • Spring Data Redis 是 Spring Data 的子项目, 封装了Redis操作的常用方法, 简化了Redis的使用.
  3. 各种客户端使用场景

    • 如果项目用的是 Spring, 并且没有过多的定制化要求, 可以用 Spring Data Redis, 最方便
    • 如果项目用的不是 Spring, 并且追求简单, 并且没有过高的性能要求, 可以用 Jedis + Jedis Pool
    • 如果项目用的不是 Spring, 并且追求高性能、高定制化, 可以用 Lettuce, 支持异步、连接池
    • 如果你的项目是分布式的, 需要用到一些分布式的特性(比如分布式锁、分布式集合), 推荐用 redisson


Spring Data Redis 的使用

  1. 引入依赖

     <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
         <version>3.3.2</version>
     </dependency>
    
  2. 配置Redis

       # redis 配置
       spring:
         data:
           redis:
             host: localhost   # redis主机
             port: 6379    # redis端口
             database: 0   # redis数据库
             password: xxxxxxxx    # redis密码 非必填
    
  3. 使用Redis

    • (1) 配置 RedisTemplate 序列化
     @Configuration
     public class RedisTemplateConfig {
        
         @Bean
         public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
             //创建RedisTemplate对象
             RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
             //设置连接工厂
             redisTemplate.setConnectionFactory(connectionFactory);
             //设置Key的序列化
             redisTemplate.setKeySerializer(RedisSerializer.string());
        
             //创建Json序列化工具
             GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
             //设置Value的序列化
             redisTemplate.setValueSerializer(jsonRedisSerializer);
        
             return redisTemplate;
         }
     }
    
    • (2) 注入 RedisTemplate
     @SpringBootTest
     public class RedisTest {
        
         @Resource
         private RedisTemplate redisTemplate;
        
         @Test
         public void test() {
             ValueOperations valueOperations = redisTemplate.opsForValue();
             // 增
             valueOperations.set("testString", "测试");
             valueOperations.set("testInt", 1);
             valueOperations.set("testDouble", 2.0);
             User user = new User();
             user.setId(0L);
             user.setUserName("xxxxxx");
             valueOperations.set("testUser", user);
        
             // 查
             Object test = valueOperations.get("testString");
             Assertions.assertTrue("测试".equals((String) test));
             test = valueOperations.get("testInt");
             Assertions.assertTrue(1 == (Integer) test);
             test = valueOperations.get("testDouble");
             Assertions.assertTrue(2.0 == (Double) test);
             System.out.println(valueOperations.get("testUser"));
        
             // 改
             valueOperations.set("testUser", user);
        
             // 删
             redisTemplate.delete("testString");
        
         }
     }
    


参考