1、reids 基础

发布时间 2023-11-12 15:43:28作者: 鲤斌

SortedSet类型

特性

1.可排序

2.元素不重复性

3.查询速度快

与普通的集合类型相比,SortedSet 主要有以下两个特点:

  1. 有序性:根据分数对元素进行排序,便于范围查找等操作。
  2. 不重复性:即使添加了相同的元素,也只会保留一个。

SortedSet 提供了许多常用的操作方法,包括添加元素、删除元素、查找元素、范围查找(支持按分数范围、按排名范围)等。具体的方法和使用方式可以参考 Redis 文档或教程。

在实际应用中,SortedSet 可以用于排行榜、计数器、带权重的任务队列等场景。以排行榜为例,可以将玩家与对应的分数作为 SortedSet 的元素,进行插入、删除、更新操作,同时可以方便地进行排名查找、前几名的统计等操作。

 

redis的java客服端

jedis: 以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用

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

redisson:Redisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map.Queue. Lock.Semaphore. AtomicLong等强大功能

java-redis-client

vertx-redis-client

jedis

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>5.0.0-alpha2</version>
        </dependency>

jedis连接池

Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此使用Jedis连接池代替Jedis

 SpringDateRedis

Spring   Redis的优点:

  1. 简化的 API:Spring Data Redis提供了简单易用的API,使得与Redis进行交互变得更加方便和高效。

  2. 集成Spring生态系统:Spring Data Redis与其他Spring生态系统无缝集成,如Spring Boot、Spring MVC等,可以方便地与其他组件和框架进行协作开发。

  3. 缓存支持:Spring Data Redis提供了缓存注解,可以方便地将方法结果缓存到Redis中,提高系统性能和响应速度。

  4. 声明式事务管理:Spring Data Redis支持声明式事务管理,可以通过注解的方式来管理Redis操作的事务,保证数据的一致性和隔离性。

  5. 多种序列化支持:Spring Data Redis支持多种数据序列化方式,如JSON、XML、Protobuf等,使得存储和读取数据更加灵活可扩展。

  6. 强大的功能支持:Spring Data Redis提供了丰富的功能支持,如分布式锁、发布订阅、Lua脚本执行等,可以满足复杂应用场景下的需求。

主要缺点:

  1. 性能考虑:虽然Redis本身是一个高性能的内存数据库,但使用Spring Data Redis进行数据访问时,需要考虑性能问题,避免不必要的网络开销和序列化开销。

<!--        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>

 yml中的配置

spring:
  #redis的所有配置方式
  redis:
    host: localhost
    port: 6379
#    password: 123456 # 如果有密码,请填写密码
    timeout: 2000ms
    lettuce:
      pool:
        max-active: 8 #最大连接
        max-idle: 8 #最大空闲连接
        min-idle: 0 #最小空闲连接
        max-wait: -1ms #连接等待时间

RedisTemplate的两种序列化实践方案

方案一:

1.自定义RedisTemplate
2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二:

1.使用StringRedisTemplate
2.写入Redis时,手动把对象序列化为JSON
读取Redis时,手动把读取到的JSON反序列化为对象

RedisTemplate的序列化方式

 config
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        // 创建Template对象
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
                new GenericJackson2JsonRedisSerializer();
        // key和 hashKey采用 string序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // value和 hashValue采用 JSON序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }
}
测试代码:
  @Autowired
  RedisTemplate<String,Object> redisTemplate;
    @Test
  void BookTypeName(){
      List<BookTypeNameEntity> list = bookTypeNameService.list();
      BookTypeNameEntity bookTypeNameEntity = list.get(0);
      System.out.println(bookTypeNameEntity);
      redisTemplate.opsForValue().set("bookType1",bookTypeNameEntity);
      Object name = redisTemplate.opsForValue().get("bookType1");
      System.out.println(name);
    }

StringRedisTemplate的序列化方式

  @Autowired
  StringRedisTemplate stringRedisTemplate;

  private static final ObjectMapper mapper = new ObjectMapper();

  @Test
  void StringBookTypeName() throws JsonProcessingException {
    List<BookTypeNameEntity> list = bookTypeNameService.list();
    //获取对象
    BookTypeNameEntity bookTypeNameEntity = list.get(0);
    System.out.println(bookTypeNameEntity);
    //手动序列化
    String s = mapper.writeValueAsString(bookTypeNameEntity);
    // 写入数据
    stringRedisTemplate.opsForValue().set("bookType3", s);
    String name = stringRedisTemplate.opsForValue().get("bookType3");
    // 手动反序列化
    BookTypeNameEntity book = mapper.readValue(name,BookTypeNameEntity.class);
    System.out.println(name);
  }
Hash 的 StringRedisTemplate 方式
  @Test
  void toHashBookTypeName()   {
    stringRedisTemplate.opsForHash() .put(  "user:400", "name","虎哥");
    stringRedisTemplate.opsForHash().put( "user:400",  "age" , "121") ;
    Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(  "user:400");
    System.out.println("entries-----------"+entries);
  }