it编程 > 编程语言 > Java

SpringBoot如何使用redis

2人参与 2025-03-10 Java

一、pom.xml

 <dependencies>
        <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>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>
 </dependencies>

二、application.properties

# redis服务器地址
spring.redis.host=192.168.11.84
# redis服务器连接端口
spring.redis.port=6379
# redis服务器连接密码(默认为空)
spring.redis.password=
# redis数据库索引(默认为0) 共15个
spirng.redis.database=0
## 连接超时时间(毫秒)
spring.redis.timout=30000
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=1
#连接池中最大空闲等待时间,3s没有活干的时候直接驱逐该链接
spring.redis.lettuce.pool.min-evicate-idle-time-millis=3000
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1

三、编写一个配置类用于解决乱码问题和对象真实的类型问题

package com.by.config;

import com.fasterxml.jackson.databind.objectmapper;
import org.springframework.boot.autoconfigure.condition.conditionalonmissingbean;
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 java.net.unknownhostexception;

@configuration
public class redisconfig {
    @bean
    @conditionalonmissingbean(name = "redistemplate")
    public redistemplate<object, object> redistemplate(redisconnectionfactory redisconnectionfactory)
            throws unknownhostexception {
        redistemplate<object, object> template = new redistemplate<>();
        template.setconnectionfactory(redisconnectionfactory);
        // key序列化方式
        template.setkeyserializer(stringredisserializer.utf_8);
        //jackson2jsonredisserializer 序列化方式 来代替自来的jdk序列化方式,因为后者会乱码
        jackson2jsonredisserializer jack = new jackson2jsonredisserializer(object.class);
        template.setvalueserializer(jack);
        template.sethashkeyserializer(stringredisserializer.utf_8);
        template.sethashvalueserializer(jack);
        /**
         * 使用objeck设置对象的类型为真实的对象类型 而不是hsash
         */
        objectmapper mapper=new objectmapper();
        // 启用默认类型推理,将类型信息作为属性写入json
        // 就是把对象的全类名写入json
        mapper.activatedefaulttyping(mapper.getpolymorphictypevalidator(), objectmapper.defaulttyping.non_final);
         // 将类型的信息作为属性传给json
        jack.setobjectmapper(mapper);
        return template;
    }
}

四、代码案例

4.1 model 准备 因为有可能存对象

@data
@allargsconstructor
@noargsconstructor
@builder
public class student implements serializable {
   private integer id;
   private string name;
}
@data
@allargsconstructor
@noargsconstructor
@builder
public class product implements serializable {
    private integer id;
    private string name;
}

4.2 使用redis 操作string

@slf4j
@springboottest
class stringtest {
    /**
     * 使用redis 操作string
     */
    @autowired
    private stringredistemplate str;
    // 自动序列化,用 @autowired报错
    @resource(name ="redistemplate")
    private redistemplate<string,student> redistemplate;
    private  final  string key ="zhouxingxing";

    /**
     * 将对象序列化 不用手动将对象转成字符串
     */
    @test
    void m8() {
        // jdk 序列化
        student student = student.builder().id(1).name("张三").build();
//        jdkserializationredisserializer serializer =new jdkserializationredisserializer();
//        byte[] serialize = serializer.serialize(student);
//        string s=new string(serialize);
        // s乱码
        redistemplate.opsforvalue().set("student", student);
        student student1 =  redistemplate.opsforvalue().get("student");
        system.out.println(student1.getname());

    }
    /**
     * string里的get set 方法
     */
    @test
    void m1() {
        str.opsforvalue().set("xiaolong", "帅呆了");
        string xiaolong = str.opsforvalue().get("xiaolong");
        log.info("xiaolong:{}", xiaolong);
    }

    /**
     * string里的strlen 方法
     * append 方法:追加字符串
     */
    @test
    void m2() {
        str.opsforvalue().set("xiaolong", "帅呆了");
        string xiaolong = str.opsforvalue().get("xiaolong");
        log.info("xiaolong:{}", xiaolong);
        // 追加字符串
        str.opsforvalue().append("xiaolong", "哈哈");
        // 获取长度
        long size = str.opsforvalue().size("xiaolong");
        log.info("长度为:{}", size);//15
    }

    /**
     * string里的incr 方法
     * incrby 方法:增加指定值
     */
    @test
    void m3() {
        str.opsforvalue().set("xiaolong", "100");
        long xiaolong = str.opsforvalue().decrement("xiaolong", 2);
        log.info("xiaolong:{}", xiaolong); //98
    }

    /**
     * 将student 对象存到redis 里
     * jsonutil.tojsonstr(对象)--->将对象转成序列化的json字符串
     */
    @test
    void m4() {
        student student = student.builder().id(1).name("张三").build();
        str.opsforvalue().set("student", jsonutil.tojsonstr(student));
        log.info("student:{}", str.opsforvalue().get("student"));//student:{"id":1,"name":"张三"}
    }
    @test
    public void m7() {
        str.opsforhash().put(key,"20220325","郑州");
        str.opsforhash().put(key,"20220326","洛阳");
        // 拿到所有小key的值
        list<object> values = str.opsforhash().values(key);
        for (object value : values) {
            system.out.println(value);
        }
    }

4.3 使用redis 操作list

@springboottest
@slf4j
public class listtest {
    @autowired
    private stringredistemplate redistemplate;
    private final string key = "xiaolong";
    /**
     * 给list左推元素和又推元素
     * 从右方删除元素并返回删除的元素
     */
    @test
    void m1() {
        redistemplate.opsforlist().leftpush(key, "g1");
        redistemplate.opsforlist().leftpush(key, "g2");
        redistemplate.opsforlist().leftpush(key, "g3");
        redistemplate.opsforlist().rightpush(key, "g4");//顺序为 g3 g2 g1 g4
        // 从右边删除元素 并返回删除的元素
        string s = redistemplate.opsforlist().rightpop(key);
        log.info("删除元素为:{}", s);// g4
    }

    @test
    public void m2() {
        list<object> obj = redistemplate.executepipelined((rediscallback<object>) connection -> {
            //队列没有元素会阻塞操作,直到队列获取新的元素或超时
            return connection.blpop(600, "list1".getbytes());
        }, new stringredisserializer());
        for (object str : obj) {
            system.out.println(str);
        }
    }

4.4 使用redis 操作hash

@slf4j
@springboottest
public class hashtest {
    @autowired
    private stringredistemplate redistemplate;
    // 自动序列化
    @resource(name ="redistemplate")
    private redistemplate<string, student> redistemplate1;
    // 设置大key
    private final string key = "xiaolong";
    @test
     void m10() {
        student student = student.builder().id(1).name("张三").build();
        redistemplate1.opsforhash().put(key, "g1", student);
        object o = redistemplate1.opsforhash().get(key, "g1");
    }
 // 设置商品黑名单
    @test
    public void m9() {
        product p1 = product.builder().id(1).name("华为").build();
        product p2 = product.builder().id(2).name("小米").build();
        redistemplate1.opsforhash().put("黑名单","名单列表1",p1);
        redistemplate1.opsforhash().put("黑名单","名单列表2",p2);
    }

    /**
     * 获取大key里所有小key的值
     */
    @test
    public void m1() {
        redistemplate.opsforhash().put(key, "g1", "小芳");
        redistemplate.opsforhash().put(key, "g2", "小红");
        // 拿到所有小key的值
        list<object> values = redistemplate.opsforhash().values(key);
        for (object value : values) {
            log.info("所有小key的值为:"+value);
        }
    }

4.5 使用redis 操作set

@springboottest
@slf4j
public class settest {
  @autowired
   private stringredistemplate redistemplate;
   private final string xiaoming = "xiaoming";
   private final string xiaohong = "xiaohong";
  @test// 交集
    void m1()
    {
        // 添加小明同学感兴趣的学科
        redistemplate.opsforset().add(xiaoming, "语文", "数学","物理");
        // 添加小红同学感兴趣的学科
        redistemplate.opsforset().add(xiaohong, "语文", "英语");
        // 获取两位同学共同感兴趣的学科
        set<string> tong = redistemplate.opsforset().intersect(xiaohong, xiaoming);
        for (string s : tong) {
           log.info("小明和小红共同感兴趣的学科为:"+s);// 语文
        }
    }
    @test//并集
    void m2()
    {
        // 添加小明同学感兴趣的学科
        redistemplate.opsforset().add(xiaoming, "语文", "数学","物理");
        // 添加小红同学感兴趣的学科
        redistemplate.opsforset().add(xiaohong, "语文", "英语");
        // 获取两位同学共同感兴趣的学科
        set<string> tong = redistemplate.opsforset().union(xiaohong, xiaoming);
        for (string s : tong) {
            log.info("小明和小红共同感兴趣的学科为:"+s);// 语文
        }
    }

4.6 使用redis 操作zset

@springboottest
@slf4j
public class zsettest {
    @autowired
    private stringredistemplate redistemplate;
    @resource(name = "redistemplate")
    private redistemplate<string, integer> redistemplate1;
    private string key = "xiaolong";
    /**
     * zset有序集合唯一 去重 适用于今日头条和热搜
     * 给xiaolong 添加三门得成绩
     */
    @test
    public void m1() {
        redistemplate.opsforzset().add(key, "语文", 90);
        redistemplate.opsforzset().add(key, "数学", 100);
        redistemplate.opsforzset().add(key, "英语", 80);
        long along = redistemplate.opsforzset().zcard(key);
        log.info("{科目数量为:}", along);
        // 获取xiaolong的最高分 spring 没有给我们封装
        redistemplate.execute(new rediscallback<object>() {
            @override
            public object doinredis(redisconnection connection) throws dataaccessexception {
                return connection.blpop(5, key.getbytes());
            }
        });
    }

4.7 redis 操作bitmap

@component
public class bitmapdemo {
    @autowired
    private stringredistemplate stringredistemplate;
    private final  string key ="sign#2022#zhouxingxing";
    public void test(){
       //设置签到
        stringredistemplate.opsforvalue().setbit(key,2,true);
        stringredistemplate.opsforvalue().setbit(key,85,true);
        //获取周星星同学的签到天数
        rediscallback<long> callback = connection -> { return  connection.bitcount(key.getbytes(),0,365);};
        long count = stringredistemplate.execute(callback);
        //打印周星星2022年签到天数
        system.out.println("周星星2022年一共签到天数:"+count);
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

使用EasyPOI实现多sheet动态列导出

03-10

Java实现FIFO功能的完整代码实践

03-10

SpringBoot自定义注解如何解决公共字段填充问题

03-10

对象存储服务MinIO快速入门(集成项目的详细过程)

03-10

Java利用Jsoup解析和操作HTML的技术指南

03-10

Java格式化小数并保留两位小数的四种方法

03-10

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论