springboot3使用redis 最新详细方法

06-01 1612阅读

1.Spring Data Redis

这是Spring框架提供的一个用于简化Redis操作的模块。:

初始准备

1.1首先配置Pom依赖

            org.springframework.boot
            spring-boot-starter-data-redis

1.2 在yml中配置redis相关信息

由于spring.redis.host 这种配置已经被弃用,在新版的springboot中,需要在spring.data.redis.host 进行配置

spring:
  data:
    redis:
    # 改为自己的地址和密码
      host: 10.69.37.213
      port: 6379
      password: Jolly
      # 连接超时时间,单位ms
      connect-timeout: 50000
      # 选择第几个数据库,默认为0,最大值15
      database: 0
      lettuce:
        pool:
          # 最大的活跃连接数,不会超过这个数,根据项目预期并发量调整
          max-active: 50
          # max-idle 指定了连接池中的最大空闲连接数。
          # 空闲连接是指那些没有被使用,但是已经创建并且保持在连接池中的连接
          # 这个值应该与max-active相匹配或者稍微低一些,
          # 以保持连接池中有足够的空闲连接来处理突发请求。
          # 设置得太高可能会导致资源浪费,因为空闲连接会占用内存和其他资源。
          max-idle: 30
          #这个配置指定了连接池中的最小空闲连接数。
          #这个设置可以确保连接池始终保持一定数量的空闲连接,以便在请求到来时可以立即使用,而不需要等待连接的创建。
          # 这个值应该根据你的应用程序的基线负载来设置
          min-idle: 10
          # 当连接池达到最大活跃连接数时,客户端等待可用连接的最大时间(以毫秒为单位)。-1 表示无限等待
          # 如果设置为一个正数,那么在等待时间超过这个值后,会抛出一个异常。
          max-wait: -1

1.3 设置redis的序列化

为了防止存入到redis的数据出现乱码的情况,进行序列化的设置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@Configuration
public class redisConfig {
	@ConditionalOnMissingBean(name = "redisTemplate")
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(connectionFactory);
        // 默认为utf-8,可以进行修改
        template.setKeySerializer(new StringRedisSerializer());
        // 原版默认使用jdk的序列化方式JdkSerializationRedisSerializer
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
        template.setValueSerializer(serializer);
        // 设置Hash的序列化化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        // 设置属性
        template.afterPropertiesSet();
        return template;
    }
}

使用redis

2.1 存取string

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class test {
    @Resource
    private RedisTemplate redisTemplate;
    @GetMapping(value="/setString")
    public String setString() {
        String key = "test";
        // 插入一个字符串
        redisTemplate.opsForValue().set(key,"123");
        // 再从redis读取这个key值对应的value
        String s = redisTemplate.opsForValue().get(key);
        System.out.println(s);
        // 再次设置值,会进行覆盖
        // redisTemplate.opsForValue().set(key,"456");
        // s = redisTemplate.opsForValue().get(key);
        return s;
    }
    
    @GetMapping(value="/append")
    public void append() {
        str.opsForValue().set("jolly", "hello");
        String xiaolong = str.opsForValue().get("jolly");
        // 追加字符串
        str.opsForValue().append("jolly", "哈哈");
        // 获取长度
        Long size = str.opsForValue().size("jolly");
    }
}

2.2 存取Object

存储对象其实和string本质上是一样的,也就是将对象序列化为json字符串,在取的时候再将字符串转为对象

首先创建一个对象

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class user implements Serializable{
    private int id;
    private String name;
    private int age;
    private String email;
}
@RestController
@RequestMapping("/test")
public class test {
    @Resource
    // 这要需要修改
    private RedisTemplate redisTemplate;
    @GetMapping(value="/setObject")
    public String setObject() {
        String key = "obj";
        user user = new user(1,"jolly",22,"1589112546@qq.com");
        redisTemplate.opsForValue().set(key,user);
        Object o = redisTemplate.opsForValue().get(key);
        System.out.println(o);
        return "s";
    }
}

2.3 存取list

redis中list的左右都可以进出,可以理解为双端队列,还可以使用redis中的list作为消息队列

    @GetMapping(value = "/list")
    public String list() {
        redisTemplate.opsForList().leftPush("list","1");
        redisTemplate.opsForList().leftPush("list","2");
        redisTemplate.opsForList().rightPush("list","3");
        // 获取第一个
        // redisTemplate.opsForList().getFirst("list");
        // redisTemplate.opsForList().leftPop("list");
        redisTemplate.opsForList().rightPush("list","4");
        List s = redisTemplate.opsForList().range("list",0,4);
        // s = [2, 1, 3, 4]
        return s.toString();
    }
2.4 存取Set中的元素

Set中的元素是无序且唯一的,并且Redis中Set中的元素都是字符串类型。所以存取对象需要序列化为字符串类型。并且Redis的Set集合中还提供了两个集合求并集和交集的功能。

 @Resource
 private RedisTemplate redisTemplate;
 
 @GetMapping("/Set")
    public void set(){
        String key = "set1";
        String key2= "set2";
        redisTemplate.opsForSet().add(key, "1","1","2","3");
        redisTemplate.opsForSet().add(key2, "1","5","2","4");
        Set members = redisTemplate.opsForSet().members(key);
        //输出 [2, 1, 3]
        System.out.println(members);
        Boolean member = redisTemplate.opsForSet().isMember(key, "1");
        //判断是否存在
        System.out.println(member);
        //获取Set集合中元素的个数
        Long size = redisTemplate.opsForSet().size(key);
        System.out.println(size);
        // 删除指定元素
        // redisTemplate.opsForSet().remove(key,"1");
        // 集合求并集
        Set union = redisTemplate.opsForSet().union(key, key2);
        System.out.println(union);
        //求交集,比如可以求共同好友
        Set intersect = redisTemplate.opsForSet().intersect(key, key2);
        System.out.println(intersect);
    }

2.5 存取ZSet

在Redis中,ZSet(有序集合)是一种数据结构,用于存储唯一、不重复的字符串元素,同时每个元素都会关联一个浮点数分数(score),这个分数用于按照从低到高排序元素。ZSet因此也是Redis中最复杂的数据结构之一。

以下是ZSet与普通Set(集合)的主要区别:

1.排序:

  • ZSet:元素根据分数(score)进行排序,可以获取指定分数范围内的元素。
  • Set:Set中的元素是无序的,因为它们是基于哈希表实现的,所以不能对元素进行排序。

    2.分数(Score):

    • ZSet:每个元素都与一个分数相关联,这个分数是排序的依据。
    • Set:Set中的元素没有与之关联的分数,因此不能根据任何值进行排序。

      3.操作:

      • ZSet:除了添加、删除和检查成员等基本操作外,还可以根据分数范围进行查询、获取元素的排名等。
      • Set:提供基本的集合操作,如添加、删除、判断元素是否存在、计算集合的交集和并集等。

        4.使用场景:

        • ZSet:适用于需要排序的场景,如排行榜、时间序列数据等。
        • Set:适用于需要确保元素唯一性的集合操作,而不关心元素的顺序。
          @GetMapping("/ZSet")
              public void zSet() {
                  String key = "ZSet" ;
                  // 排序手机的销量情况
                  redisTemplate.opsForZSet().add(key,"小米",100);
                  redisTemplate.opsForZSet().add(key,"华为",120);
                  redisTemplate.opsForZSet().add(key,"Apple",200);
                  redisTemplate.opsForZSet().add(key,"Oppo",99);
                  // 统计范围中的个数,包含100,和200
                  Long count = redisTemplate.opsForZSet().count(key, 100, 200);
                  // 输出3
                  System.out.println(count);
                  // 输出[Oppo, 小米, 华为, Apple],默认从小到大
                  Set range = redisTemplate.opsForZSet().range(key, 0, -1);
                  System.out.println(range);
                  // 从大到小使用
                  // Set reverseRange = redisTemplate.opsForZSet().reverseRange(key, 0, -1);
                  // 获取前2个最大值,得到全部数据[[score=200.0, value=Apple], [score=120.0, value=华为]]
                  Set l = redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, 1);
                  System.out.println(l);
              }
          

          2.6 存取Hash

          常见使用场景:

          1. 对象存储:Hash经常用来存储对象,其中field对应对象的属性,value对应属性的值。
          2. 数据库行:可以将Hash用作轻量级的数据库行,field对应列名,value对应列的值。
          3. 缓存:可以用来缓存具有多个字段的记录,比如用户信息、配置信息等。
          @GetMapping("/hash")
              public void hash() {
                  String key = "hash1";
                  redisTemplate.opsForHash().put(key, "1", "world");
                  redisTemplate.opsForHash().put(key, "2", "world2");
                  redisTemplate.opsForHash().put(key, "3", "world3");
          //        user user = new user(1,"jolly",22,"1589112546@qq.com");
          //        redisTemplate.opsForHash().put(key, "4", user);
                  Object o = redisTemplate.opsForHash().get(key, "1");
                  System.out.println(o);
                  // 获取hash中所有的key
                  Set keys = redisTemplate.opsForHash().keys(key);
                  System.out.printf(keys.toString());
                  // 获取所有的value
                  List values = redisTemplate.opsForHash().values(key);
                  System.out.printf(values.toString());
              }
          

          2.7存取Bitmap

          Bitmap实际上是对字符串的抽象,但它将字符串看作是一个由二进制位组成的数组。

          springboot3使用redis 最新详细方法
          (图片来源网络,侵删)

          应用场景

          1.用户活跃度统计:

          springboot3使用redis 最新详细方法
          (图片来源网络,侵删)

          可以使用Bitmap来记录用户每天的登录情况,每个用户对应一个key,每天的日期对应一个offset,如果用户在那天登录,则将对应的位设置为1。

          2.布隆过滤器(Bloom Filter):

          springboot3使用redis 最新详细方法
          (图片来源网络,侵删)

          Bitmap可以用来实现布隆过滤器,用于快速判断一个元素是否在一个集合中,虽然有一定的误判率,但非常节省空间。

          3.简单的布尔值存储:

          当需要存储大量布尔值时,Bitmap可以非常节省空间,比如记录用户的性别、订阅状态等。

          4.事件计数:

          可以使用Bitmap来记录事件的发生,比如记录用户点击广告的情况,每个广告点击事件对应一个位。

          Bitmap的最大offset为2^32 - 1,即可以处理的最大字符串长度为512MB。

          redisTemplate 没有快捷的调用bitcount命令,有点离谱

          @GetMapping("/Bitmap")
              public void bitmap(){
                  // 用户id
                  String id = "admiuad@ad#al.";
                  redisTemplate.opsForValue().setBit(id,0,true);
                  redisTemplate.opsForValue().setBit(id,99,true);
                  redisTemplate.opsForValue().setBit(id,100,true);
                  redisTemplate.opsForValue().setBit(id,200,true);
                  // 获取当天的登录情况
                  @GetMapping("/Bitmap")
              public void bitmap(){
                  // 用户id
                  String id = "admiuad@ad#al.";
                  redisTemplate.opsForValue().setBit(id,0,true);
                  redisTemplate.opsForValue().setBit(id,99,true);
                  redisTemplate.opsForValue().setBit(id,100,true);
                  redisTemplate.opsForValue().setBit(id,200,true);
                  redisTemplate.opsForValue().setBit(id,300,true);
                  redisTemplate.opsForValue().setBit(id,365,true);
                  // 获取当天的登录情况
                  Boolean bit = redisTemplate.opsForValue().getBit(id, 0);
                  System.out.println(bit);
                  System.out.println(bitCount(id,0,365));
                  
              }
              public Long bitCount(String key, int start, int end) {
                  return redisTemplate.execute((RedisCallback) con -> con.bitCount(key.getBytes(), start, end));
              }
          
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码