Spring Boot 使用 Redis

1,Spring 是如何集成Redis的?

首先我们要使用jar包

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

2,我们使用的时候需要用到高级封装

2,配置Redis

# Redis服务器地址
spring.redis.host=10.1.30.222
# Redis数据库索引(默认为0)
spring.redis.database=0 
# Redis服务器连接端口
spring.redis.port=6379 
# Redis服务器连接密码(默认为空)
#spring.redis.password=
## 连接超时时间(毫秒)
spring.redis.timeout=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-evictable-idle-time-millis = 3000


# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1

StringRedisTemplate

String

public class StringDemo {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private final String key = "zhengzhou";

    public void test() {

        stringRedisTemplate.opsForValue().set(key, "我的家乡", 30, TimeUnit.SECONDS);
        String value = stringRedisTemplate.opsForValue().get(key);
        System.out.println(value);
    }
}

Java

Hash

@Component
public class HashDemo {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private  final  String key ="zhouxingxing";
    public void  test(){
        stringRedisTemplate.opsForHash().put(key,"20220325","郑州");
        stringRedisTemplate.opsForHash().put(key,"20220326","洛阳");

        List<Object> values = stringRedisTemplate.opsForHash().values(key);

        for (Object value:values){
            System.out.println(value);
        }

    }
}

Java

List

@Component
public class ListDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private  final  String key ="onewayroad";
    void  test(){

        stringRedisTemplate.opsForList().leftPush(key,"周星星");
        stringRedisTemplate.opsForList().leftPush(key,"张敏");
        stringRedisTemplate.opsForList().leftPush(key,"李大锤");
        String value = stringRedisTemplate.opsForList().rightPop(key);
        System.out.println(value);


    }
}
    @Test
    void test6() {
     // 如果一些原生命令,spring 没有给我们封装,redisTemplate.execute(new RedisCallback)
    while (true){
        System.out.println("开始一轮监听");
        List<byte[]> rawResults = redisTemplateProduct.execute(new RedisCallback<List<byte[]>>() {
            @Override
            public List<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
                return connection.bRPop(5,"product.hot".getBytes());
            }
        });
        if(ObjUtil.isNotEmpty(rawResults)){
            byte[] rawKey = rawResults.get(0);
            byte[] rawValue = rawResults.get(1);
            Product product = (Product)redisTemplateProduct.getValueSerializer().deserialize(rawValue);
            System.out.println(product);
        }
    }


Java

Set

@Component
public class SetDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private final  String zhouxingxing ="zhouxingxing";
    private  final  String zhangmin = "zhangming";

    public void  test(){
        //添加周星星同学感兴趣的科目
        stringRedisTemplate.opsForSet().add(zhouxingxing,"语文");
        stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
        stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
        //添加张敏同学感兴趣的科目
        stringRedisTemplate.opsForSet().add(zhangmin,"数学");
        stringRedisTemplate.opsForSet().add(zhangmin,"英语");

        //获取两位同学共同感兴趣的科目
        Set<String> values = stringRedisTemplate.opsForSet().intersect(zhouxingxing, zhangmin);

        System.out.println("周星星和张敏共同感兴趣的科目为:");

        for(String value : values){
            System.out.println(value);
        }
        
    }
}

Java

ZSet

@Component
public class ZSetDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private final  String key ="zhouxingxing";
    public void  test(){
        //添加周星星同学成绩
        stringRedisTemplate.opsForZSet().add(key,"语文",98);
        stringRedisTemplate.opsForZSet().add(key,"数学",87);
        stringRedisTemplate.opsForZSet().add(key,"英语",75);
        //获取分数最高的成绩
        ZSetOperations.TypedTuple<String> values = stringRedisTemplate.opsForZSet().popMax(key);
        //打印值
        System.out.println("周星星最好成绩科目是:"+values.getValue());
        System.out.println("周星星最好成绩:"+values.getScore());
        
    }
}

Java

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);
    }
}

Java

3.RedisTemplate

3.1泛型约束的使用

@Component
public class RedisTemplateDemo {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate<String, String> redisTemplate_string_string;

    @Resource
    private RedisTemplate<String, User> redisTemplate;

    @Resource(name="redisTemplate")
    private ValueOperations<String,User> valueOperations;

    private final String key = "useris#01";

    public void test() {
        User user = User.builder().id(1).name("李四").build();
        redisTemplate.opsForValue().set(key,user );
        User value = redisTemplate.opsForValue().get(key);
        valueOperations.set(key,user );
        User value2 = valueOperations.get(key);
        System.out.println(value);

    }
}

4,乱码的问题

JdkSerializationRedisSerializer  serializer = new JdkSerializationRedisSerializer();
        byte[] serialize = serializer.serialize("user#01");
        System.out.println(new String(serialize));

自定义序列化工具

@Configuration
public class RedisConfig {
    

 @Bean //主动注册了一个名字叫redisTemplate 的bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
    {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper  mapper = new ObjectMapper();

        // 启用默认类型推理,将类型信息作为属性写入JSON
        // 就是把对象的全类名写入json
        mapper.activateDefaultTyping( mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);

        jackson.setObjectMapper(mapper);
        template.setKeySerializer(StringRedisSerializer.UTF_8);
        template.setValueSerializer(jackson);
        template.setHashKeySerializer(StringRedisSerializer.UTF_8);
        template.setHashValueSerializer(jackson);
        return template;
    }


}

为什么要自定话应该序列化工具,因为他自己提供的不是很好,所以我们要自己定义一个,这样的话可以把java对象转化成json和字节码存入Redis 里,反序列化就是把json和字节码转化为java对象,泛型指定为 Object.class 表示可以处理任何类型的对象。

最后返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

详细的介绍:

  1. @Configuration 注解表明这是一个配置类,Spring IoC容器将会读取该类中的bean定义。

  2. @Bean 注解的方法表示该方法会返回一个对象,该对象会被注册为Spring容器中的bean。在这个例子中,方法名为 redisTemplate,所以生成的bean的名字也是 "redisTemplate"。

  3. 方法体中首先创建了一个 RedisTemplate<Object, Object> 实例,并将其连接工厂设置为传入的 RedisConnectionFactory,这是连接Redis的基础配置。

  4. 创建了 Jackson2JsonRedisSerializer 实例,用于将Java对象序列化为JSON字符串,反序列化时则将JSON字符串转回为Java对象。泛型指定为 Object.class 表示可以处理任何类型的对象。

  5. 初始化 ObjectMapper,它是Jackson库中用于处理JSON的核心类。这里启用了默认类型推理(activateDefaultTyping),这样在序列化时,即使目标类没有显式地声明类型信息,也能根据实际运行时类型推断并在JSON中包含类型信息,这对于处理多态类型的场景非常有用。

  6. 将初始化好的 ObjectMapper 设置给 Jackson2JsonRedisSerializer

  7. 配置RedisTemplate的序列化策略:

    • template.setKeySerializer(StringRedisSerializer.UTF_8); 设置键(key)的序列化器为 StringRedisSerializer,以UTF-8格式进行字符串序列化。
    • template.setValueSerializer(jackson); 设置值(value)的序列化器为刚才创建的 Jackson2JsonRedisSerializer,即所有值都将转化为JSON字符串存储。
    • template.setHashKeySerializer(StringRedisSerializer.UTF_8); 设置哈希表键(hash key)的序列化器也为 StringRedisSerializer,同样以UTF-8格式进行字符串序列化。
    • template.setHashValueSerializer(jackson); 设置哈希表值(hash value)的序列化器为 Jackson2JsonRedisSerializer,意味着哈希表中的每个值也将被转化为JSON字符串存储。

最后,返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505251.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【docker】nexus 本地 maven配置

1、这篇文章中说明了如何搭建私服 【docker】搭建Nexus私服-CSDN博客文章浏览阅读2次。4、点击登陆&#xff08;账号&#xff1a;admin 秘密&#xff1a;在容器内 /nexus-data/admin.password 文件中)注意我的端口号是 10002&#xff0c;注意你的端口号。7、设置maven-central…

博客页面---前端

目录 主页 HTML CSS 文章详细页面 HTML CSS 登录页面 HTML CSS 文章编辑页 HTML CSS 这只是前端的页面组成&#xff0c;还没有接入后端&#xff0c;并不是完全体 主页 HTML <!DOCTYPE html> <!-- <html lang"en"> --> <head>&…

AcWing刷题-有序分数

有序分数 递归 # 求最大公约数 def gcd(a,b):return gcd(b,a%b) if b else a ans [] n int(input()) for i in range(1,n1):for j in range(0,i1):if gcd(i,j)1: # 最简形式ans.append([j,i]) ans.sort(keylambda x:x[0]/x[1]) # 按照从小到大的顺序排 for elem in ans:a,be…

逐步学习Go-Select多路复用

概述 这里又有多路复用&#xff0c;但是Go中的这个多路复用不同于网络中的多路复用。在Go里&#xff0c;select用于同时等待多个通信操作&#xff08;即多个channel的发送或接收操作&#xff09;。Go中的channel可以参考我的文章&#xff1a;逐步学习Go-并发通道chan(channel)…

PyCharm安装及Anaconda关联设置

PyCharm介绍 PyCharm 是一款专为 Python 设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由 JetBrains 开发。它提供了一整套功能强大的工具&#xff0c;帮助开发者更高效地编写、测试和调试 Python 代码。PyCharm 有免费的社区版和付费的专业版。 PyCharm官网链接…

Linux 安装Mysql

安装源文件版本&#xff1a;mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 安装前&#xff0c;我们可以检测系统是否自带安装 MySQL: rpm -qa | grep mysql如有&#xff0c;类似 mysql-libs-5.1.52-1.el6_0.1.x86_64那可以选择进行卸载: rpm -e mysql-libs-5.1.52-1.el6_0.1…

Xinstall自动邀请代理功能,让App线上推广更高效

在移动互联网时代&#xff0c;App的推广成为了每个开发者都必须面对的问题。线上推广作为一种重要的手段&#xff0c;其效果直接关系到App的下载量、安装量以及用户活跃度。然而&#xff0c;线上推广并非易事&#xff0c;需要借助专业的工具和方法才能实现最佳效果。今天&#…

JAVAEE——多线程进阶,锁策略

文章目录 锁策略乐观锁和悲观锁乐观锁悲观锁两者的比较 读写锁重量级锁和轻量级锁重量级锁轻量级锁 自旋锁公平锁和非公平锁公平锁非公平锁 可重入锁和不可重入锁可重入锁不可重入锁 锁策略 乐观锁和悲观锁 乐观锁 什么是乐观锁呢&#xff1f;我们可以认为乐观锁比较自信&am…

树的重心——树的结构

树的重心是指对于某个点&#xff0c;将其删除后&#xff0c;可以使得剩余联通块的最大值最小。也就等价于一某个点为根的树&#xff0c;将根删除后&#xff0c;剩余的若干棵子树的大小最小。 例如下图的树的重心就是2。 性质&#xff1a; 性质一&#xff1a;重心的若干棵子树打…

代码第三十六天:需要添加的硬币的最小数量

需要添加的硬币的最小数量 题目要求&#xff1a; 解题思路 为方便描述&#xff0c;把 0 也算作可以得到的数。 假设现在得到了区间 [ 0 , s − 1 ] [0,s−1] [0,s−1] 中的所有整数&#xff0c;如果此时遍历到整数 x c o i n s [ i ] xcoins[i] xcoins[i]&#xff0c;那么…

百度云加速方法「Cheat Engine」

加速网盘下载 相信经常玩游戏的小伙伴都知道「Cheat Engine」这款游戏内存修改器&#xff0c;它除了能对游戏进行内存扫描、调试、反汇编 之外&#xff0c;还能像变速齿轮那样进行本地加速。 这款专注游戏的修改器&#xff0c;被大神发现竟然还能加速百度网盘资源下载&#xf…

Linux 学习之路 -- 进程篇 -- 背景介绍

目录 1、冯诺依曼体系架构 2.操作系统 1、冯诺依曼体系架构 再开始学习进程之前我们要先了解一下计算机的体系结构&#xff0c;这里我们以最经典的冯诺依曼体系结构为例&#xff0c;简单介绍一下一下计算机的体系结构&#xff0c;方便我们对进程的理解。 这里的中央处理器就是…

【C++】入门C++(上)

简单唠几句 从今天开始我们就要进入C的学习了 众所周知&#xff0c;C是在C语言的基础上应运而生的&#xff0c;其容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式&#xff0c;为我们在编程上提供了很大的便捷 在接下来的这几篇C入门的博…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下&#xff0c;我们需要从别的系统获取数据时&#xff0c;一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼&#xff0c;旨在总结相关套路&#xff0c;提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

微分方程数值解法_常微分方程篇

一阶常微分方程初值问题 问题的适定性 (well-posedness): (數學系的角度) • 存在性:问题有解 • 唯一性:解是唯一的 • 稳定性:这个唯一解连续地依赖于问题中所给的数据(即初值、边值等) 初值问题的求解 Euler 法 區別(極限) 入門 要點:極限、中值定理==>差分方程…

linux进程退出之exit与_exit

linux进程退出之exit与_exit _exitexit流程清理函数atexit()函数&#xff1a;on_exit()函数&#xff1a; _exit /* Terminate program execution with the low-order 8 bits of STATUS. */ /** status参数定义了进程的终止状态&#xff0c;父进程可以通过wait&#xff08;&am…

leetcode刷题---链表

目录 1.删除链表的倒数第N个节点两两交换链表中的节点反转链表2 1.删除链表的倒数第N个节点 根据题目描述&#xff0c;第一个思路是存到数组中对数组进行操作&#xff0c;想到数组我们就可以想到下标和倒数第N个的关系&#xff0c;所以我们可以不额外开空间&#xff0c;可以直接…

vuex插件实现数据共享

vuex插件 vuex是管理多个vue通用的数据的插件.(状态管理工具,状态是数据) 我们对于多个vue文件之间的共同数据,是用props传递,或者对于一个vue实例对象,进行绑定,传参,也是多次传参,多个文件之间,比较麻烦. 但是我们vuex会创建一个公共对象,从这个公共对象上赋值,比较简单易…

appium辅助自动化工具-- Appium studio

这里我要给大家介绍一款appium辅助自动化测试工具appium studio&#xff0c;你没看错&#xff0c;不是android studio&#xff0c;也不是appium android studio&#xff0c;就是appium studio&#xff01; 下载地址&#xff1a; Appium Studio | Digital.ai Continuous Test…

【应用笔记】LAT1413+快速开关蓝牙导致设备无广播

1. 问题背景 客户使用 BlueNRG-345MC 开发了一个 BLE 外设&#xff0c;和手机连接。在测试中发现&#xff0c;手机连接上外设之后&#xff0c;不断地在手机上点击蓝牙的开关按钮&#xff0c;造成设备不断地断开、重连&#xff1b;少则几次&#xff0c;多则几十次。点击之后&am…