RedisTemplate重写的一些模板

1.为什么要重写RedisTemplate

我们知道SpringBoot官方给出了2种实例化方式,分别是 RedisTemplate<Object,Object>RedisTemplate<String,String>
这两种或多或少都有一些问题;

1.第一种对key所采用的序列化方式是JdkSerializationRedisSerializer
由此种方式序列化的key在存入Redis数据库时会被转为16进制同时具有类型前缀(非常复杂难看懂),这样想要拿取key对应的value还要先算出此key的值,所以不采用该种。

2.第二种要求value值类型也为String,导致数据操作步骤繁琐,较为影响运行效率。所以我们一般重写一RedisTemplate<String,Object>
这样更切合业务并且代码操作更加简单,SpringBoot官方的设置也是当你手动注入一个RedisTemplate的Bean时,优先使用你手动注入的RedisTemplate。(如使用第二种的话,我需要手动将对象数据进行json转化,影响代码效率,存储起来也非常麻烦)

2.实例

package com.wyh.gateway.redis;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
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;/*** Redis的config处理** @author: chopin* @create: 2023/12/2 23:00*/
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {//1.redisTemplate 是一个key-value存储的模板,它可以操作hash、list、set、zset等数据结构,但是默认序列化是乱码的RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();StringRedisSerializer redisSerializer = new StringRedisSerializer();//2.设置了 RedisConnectionFactory 对象,它是 Redis 客户端的连接工厂,它可以创建和管理 Redis 客户端连接。redisTemplate.setConnectionFactory(redisConnectionFactory);//3.设置了 RedisTemplate 的 key 序列化器为 StringRedisSerializer 对象,它可以将字符串对象转换为 Redis 的键redisTemplate.setKeySerializer(redisSerializer);//4.设置了 RedisTemplate 的 hash key 序列化器为 StringRedisSerializer 对象,它可以将字符串对象转换为 Redis 的哈希键redisTemplate.setHashKeySerializer(redisSerializer);//5.设置了 RedisTemplate 的 value 序列化器为 jackson2JsonRedisSerializer 对象,它可以将 Java 对象序列化为 JSON 字符串并将其存储在 Redis 中redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());return redisTemplate;}public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {// 创建一个 Jackson2JsonRedisSerializer 对象,其泛型类型为 ObjectJackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 允许所有属性可见,包括私有属性objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 禁用对未知属性的失败objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 启用默认的类型,即非终态类型objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);// 将 ObjectMapper 对象设置为 Jackson2JsonRedisSerializer 对象jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 返回 Jackson2JsonRedisSerializer 对象return jackson2JsonRedisSerializer;}
}

RedisUtils

package com.wyh.gateway.redis;import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** Redis工具类** @author: chopin* @create: 2023/12/2 23:10*/
@Component
@Slf4j
public class RedisUtil {@Resourceprivate RedisTemplate redisTemplate;private static final String CACHE_KEY_SEPARATOR = ".";/*** 构建缓存key*/public String buildKey(String... strObjs) {return Stream.of(strObjs).collect(Collectors.joining(CACHE_KEY_SEPARATOR));}/*** 是否存在key*/public boolean exist(String key) {return redisTemplate.hasKey(key);}/*** 删除key*/public boolean del(String key) {return redisTemplate.delete(key);}/*** set(不带过期)*/public void set(String key, String value) {redisTemplate.opsForValue().set(key, value);}/*** set(带过期)*/public boolean setNx(String key, String value, Long time, TimeUnit timeUnit) {return redisTemplate.opsForValue().setIfAbsent(key, value, time, timeUnit);}/*** 获取string类型缓存*/public String get(String key) {return (String) redisTemplate.opsForValue().get(key);}public Boolean zAdd(String key, String value, Long score) {return redisTemplate.opsForZSet().add(key, value, Double.valueOf(String.valueOf(score)));}public Long countZset(String key) {return redisTemplate.opsForZSet().size(key);}public Set<String> rangeZset(String key, long start, long end) {return redisTemplate.opsForZSet().range(key, start, end);}public Long removeZset(String key, Object value) {return redisTemplate.opsForZSet().remove(key, value);}public void removeZsetList(String key, Set<String> value) {value.stream().forEach((val) -> redisTemplate.opsForZSet().remove(key, val));}public Double score(String key, Object value) {return redisTemplate.opsForZSet().score(key, value);}public Set<String> rangeByScore(String key, long start, long end) {return redisTemplate.opsForZSet().rangeByScore(key, Double.valueOf(String.valueOf(start)), Double.valueOf(String.valueOf(end)));}public Object addScore(String key, Object obj, double score) {return redisTemplate.opsForZSet().incrementScore(key, obj, score);}public Object rank(String key, Object obj) {return redisTemplate.opsForZSet().rank(key, obj);}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用文件命令

文章目录 文件命令文件内容查看catnlmoreless&#xff08;more的plus版&#xff09;headtailod 文件属性操作用户权限常见的权限chownchmodchgrpumask 隐藏属性常见的隐藏属性lsattrchattr 查找文件查看文件类型查找文件位置whichwhereislocatefind 文件操作&#xff08;复制、…

深度学习之梯度下降算法

梯度下降算法 梯度下降算法数学公式结果 梯度下降算法存在的问题随机梯度下降算法 梯度下降算法 数学公式 这里案例是用梯度下降算法&#xff0c;来计算 y w * x 先计算出梯度&#xff0c;再进行梯度的更新 import numpy as np import matplotlib.pyplot as pltx_data [1.0,…

2024 前端面试题(GPT回答 + 示例代码 + 解释)No.21 - No.40

本文题目来源于全网收集&#xff0c;答案来源于 ChatGPT 和 博主&#xff08;的小部分……&#xff09; 格式&#xff1a;题目 h3 回答 text 参考大佬博客补充 text 示例代码 code 解释 quote 补充 quote 上一篇链接&#xff1a;2024 前端面试题&#xff08;GPT回答 示例…

深度学习领域的最新前沿:2024年的关键突破与趋势

文章目录 导言01 深度学习的基本原理和算法1.1 神经网络&#xff08;Neural Networks&#xff09;1.2 前馈神经网络&#xff08;Feedforward Neural Network&#xff09;1.3 反向传播算法&#xff08;Backpropagation&#xff09;1.4 激活函数&#xff08;Activation Function&…

基于HTML5实现动态烟花秀效果(含音效和文字)实战

目录 前言 一、烟花秀效果功能分解 1、功能分解 2、界面分解 二、HTML功能实现 1、html界面设计 2、背景音乐和燃放触发 3、燃放控制 4、对联展示 5、脚本引用即文本展示 三、脚本调用及实现 1、烟花燃放 2、燃放响应 3、烟花canvas创建 4、燃放声音控制 5、实际…

五个编程原则:Rob Pike‘s 5 Rules of Programming

原文 https://users.ece.utexas.edu/~adnan/pike.html Rob Pike’s 5 Rules of Programming Rule 1. You can’t tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don’t try to second guess and put in a speed hack until y…

用函数实现乘法口诀表

用函数实现乘法口诀表 实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定 如&#xff1a;输入9&#xff0c;输出99口诀表&#xff0c;输出12&#xff0c;输出1212的乘法口诀表。 思路&#xff1a; 1. 设计函数原型&#xff0c;不需要返回值&…

开源图形库Thor Vector Graphics:Paint类, Result、 CompositeMethod、 BlendMethod 枚举类型

0. 简介 开源图形库Thor Vector Graphics的Paint类是一个用于绘制图形的API类&#xff0c;提供了各种功能来控制绘制对象的外观和行为。所属头文件&#xff1a;thorvg.h 1. 成员函数与使用方法 Result rotate(float degree) noexcept&#xff1a;设置对象的旋转角度。 使用方…

idea基础配置

配置jre 【file】->【Project Structure】 设置SDK设置Language level 【Settings】->【Build,Execution,Deployment】->【Compiler】->【Java Compiler】设置Project bytecode version&#xff1a; 配置maven 【Settings】->【Build,Execution,Deployment】…

25届Javaer在2023的打怪升级之路

开头说一下基本信息&#xff1a;25届Java&#xff0c;二本&#xff0c;科班 刚刚结束第二段实习&#xff0c;回家过年准备春招&#xff0c;浅浅记录一下过去的一年 开始的原因&#xff1a; 虽然很不想回忆&#xff0c;但是走上Java的道路还是和前女友有些关系。 在今年年初…

搜索引擎枚举

我们可以利用Google 语法搜索子域名&#xff0c;例如要搜索百度旗下的子域名就可以 使用 “site:baidu.com” 语法&#xff0c;如图1-5所示。 Google 新闻 购物 地图 我料的31,400.000条结集(用B时0.17秒) 百度知道全球最大中文互动问答平台 hitps /izhidao baidu…

vue3 之 商城项目—结算模块

路由配置 chekout/index.vue <script setup> const checkInfo {} // 订单对象 const curAddress {} // 地址对象 </script> <template><div class"xtx-pay-checkout-page"><div class"container"><div class"w…

医院三基怎么搜题答案? #学习方法#学习方法#微信

在大学生的学习过程中&#xff0c;遇到难题和疑惑是常有的事情。然而&#xff0c;随着互联网的普及和技术的发展&#xff0c;搜题和学习软件成为了大学生们解决问题的利器。今天&#xff0c;我将向大家推荐几款备受大学生喜爱的搜题和学习软件&#xff0c;帮助我们更好地应对学…

分层钱包HD钱包

bc1 开头的通常指的是比特币&#xff08;Bitcoin&#xff09;的地址&#xff0c;这种格式遵循了比特币改进提案BIP 0173中定义的Bech32编码格式。Bech32地址也被称为"SegWit"地址&#xff0c;它们支持Segregated Witness功能&#xff0c;这是比特币网络为了提高区块链…

新冠:2022和2024两次新冠感染的对比

第一次 2022年底第一次放开管控&#xff0c;95%以上的人都感染了一次奥密克戎 症状 第一天&#xff1a;流涕&#xff0c;咽痛。 第二天&#xff1a;高烧40度&#xff0c;全身疼痛&#xff0c;动不了。没有胃口&#xff0c;头晕想吐。 吃了白加黑退烧药&#xff0c;清开灵颗粒…

python系统学习Day2

section3 python Foudamentals part one&#xff1a;data types and variables 数据类型&#xff1a;整数、浮点数、字符串、布尔值、空值 #整型&#xff0c;没有大小限制 >>>9 / 3 #3.0 >>>10 // 3 #3 地板除 >>>10 % 3 #1 取余#浮点型&#xff…

现阶段适用于 单一架构 还是 分布式架构 ?

单体架构&#xff1a; 优势&#xff1a;简单直接&#xff0c;易于理解和开发&#xff0c;适用于小型应用或刚刚开始的项目。劣势&#xff1a;扩展性受限&#xff0c;只能通过增加服务器的数量来提高处理能力&#xff1b;所有模块都部署在一个单独的服务器或容器中&#xff0c;…

Linux实用指令

Linux实用指令 1.指定运行级别 运行级别说明&#xff1a; 0 &#xff1a;关机 1 &#xff1a;单用户【找回丢失密码】 2&#xff1a;多用户状态没有网络服务 3&#xff1a;多用户状态有网络服务 4&#xff1a;系统未使用保留给用户 5&#xff1a;图形界面 6&#xff1a;系统重…

MySQL5.7升级到MySQL8.0的最佳实践分享

一、前言 事出必有因&#xff0c;在这个月的某个项目中&#xff0c;我们面临了一项重要任务&#xff0c;即每年一次的等保测评整改。这次测评的重点是Mysql的一些高危漏洞&#xff0c;客户要求我们无论如何必须解决这些漏洞。尽管我们感到无奈&#xff0c;但为了满足客户的要求…

Apache 神禹(shenyu)源码阅读(三)——被网关路由的后端服务 Client 向 Admin 注册的数据传输(Client端)

前言 在真正测试 Divide 插件时&#xff0c;想要知道后端服务&#xff08;以下称为 Client&#xff09;是如何将自己的信息注册到管理台&#xff08;以下称为 Client&#xff09;。这里后端服务用的是 shenyu 自带的 http 的例子&#xff0c;项目名字为 shenyu-examples-http。…