【tower-boot 系列】redis集成

redis 介绍

Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。

redis 集成

一、核心装配

1、RedisTemplate 注入

 @Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory,ObjectMapper objectMapper, KeyStringSerializer keyStringSerializer) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);//key序列化方式RedisSerializer<String> defalutSerializer = template.getStringSerializer();//值序列化方式RedisSerializer<Object> jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);//设置key 的序列化方式template.setKeySerializer(keyStringSerializer);template.setHashKeySerializer(keyStringSerializer);//设置值 的序列化方式template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);//设置默认的序列化方式template.setDefaultSerializer(defalutSerializer);template.afterPropertiesSet();return template;}

2、自自定义key 序列化 , redisKeyPrefix前缀兼容多项目隔离

@Slf4j
public class KeyStringSerializer implements RedisSerializer<String> {private final Charset charset;public KeyStringSerializer() {this.charset = StandardCharsets.UTF_8;}@Autowiredprivate CustomRedisProperties redisProperties;@Overridepublic byte[] serialize(String s) throws SerializationException {String newValue = getKeyPrefix() + s;return newValue.getBytes(charset);}@Overridepublic String deserialize(byte[] bytes) throws SerializationException {String saveKey = new String(bytes, charset);String keyPrefix = getKeyPrefix();if (StrUtil.isNotBlank(keyPrefix)) {int indexOf = saveKey.indexOf(keyPrefix);if (indexOf > 0) {log.info("key缺少前缀");} else {saveKey = saveKey.substring(indexOf);}log.info("saveKey:{}", saveKey);}return saveKey;}private String getKeyPrefix() {return redisProperties.getRedisKeyPrefix();}

二、redis操作封装

注入bean实例,方便引用

    @Beanpublic RedisService redisService(ObjectMapper objectMapper, RedisTemplate<String, Object> redisTemplate) {return new DefaultRedisServiceImpl(objectMapper, redisTemplate);}

RedisService 接口实现

package com.hxl.redis.load;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;/*** @Author hxl* @description* @Date 2023-06-14 16:19**/
public interface RedisService {/*** *公共基础操作***/Boolean exists(String key);Boolean expire(String key, long timeout);Boolean expire(final String key, final long timeout, final TimeUnit unit);int delete(String... keys);Boolean delete(String key);/*** *基础类型(Integer、String、实体类等) 操作***/Boolean set(String key, Object value);Boolean set(String key, Object value, long expireTime);Boolean set(String key, Object value, long expireTime, TimeUnit timeUnit);String get(String key);<T> T getObject(String key, Class<T> type);<T> List<T> getObjectList(String key, Class<T> type);/*** *双向列表 list操作***/Long setCacheList(String key, Object value);Long setCacheList(String key, List<Object> values);Long setLeftCacheList(String key, Object value);Long setLeftCacheList(String key, List<Object> values);<T> T rightPop(String key, Class<T> type);<T> T leftPop(String key, Class<T> type);<T> List<T> getCacheList(String key, Class<T> type);Long size(String key);/*** *hash map操作**/Boolean hPut(String key, String hashKey, Object value);Boolean hPutAll(String key, Map<String, String> maps);Boolean hExists(String key, String field);Long hDelete(String key, Object... fields);Map<Object, Object> hGetAll(String key);Object hGet(String key, String field);List<Object> hMultiGet(String key, Collection<Object> fields);Long hSize(String key);/*** *set 集合 不重复**/boolean addSet(String key, Object value);boolean removeSet(String key, Object... value);Set<Object> getAllSet(String key);/*** *set 有序集合 不重复**/Boolean addZSet(String key, Object value, double score);Long removeZSet(String key, Object... value);/*** ZSet数据增加分数** @param key   key* @param value value* @param delta 分数* @return duuble*/Double incrZSet(String key, Object value, double delta);/*** 升序 区间查询** @param key key* @param min 最小分数* @param max 最大分数* @return Set<Object>*/Set<Object> zSetRangeByScore(String key, double min, double max);/*** 降序 区间查询** @param key key* @param min 最小分数* @param max 最大分数* @return Set<Object>*/Set<Object> zSetRangeDescByScore(String key, double min, double max);
}

具实现见:DefaultRedisServiceImpl

三、使用方法

1、pom 依赖

<dependency><groupId>com.hxl</groupId><artifactId>tower-boot-redis</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>

2、yml 配置

edisKeyPrefix 项目前缀,会默认拼接key前缀

spring:redis:host: 127.0.0.1port: 6379database: 0password:timeout: 5000lettuce:pool:max-active: 8max-idle: 8max-wait: -1min-idle: 0redisKeyPrefix: tower

github 项目地址:

https://github.com/sanxiaoshitou/tower-boot

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

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

相关文章

leetcode:468. 验证IP地址

验证IP地址 中等 249 相关企业 给定一个字符串 queryIP。如果是有效的 IPv4 地址&#xff0c;返回 “IPv4” &#xff1b;如果是有效的 IPv6 地址&#xff0c;返回 “IPv6” &#xff1b;如果不是上述类型的 IP 地址&#xff0c;返回 “Neither” 。 有效的IPv4地址 是 “x1.x…

【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch烟花特效 一、题目要求 编程实现 二、案例分析 1、角色分析

组件的props属性

目录 1&#xff1a;使用props的作用&#xff1a; 2&#xff1a;props自定义属性的用法&#xff1a; 3&#xff1a;集合v-bind使用自定义属性&#xff1a; 4&#xff1a;props自定义属性是只读的&#xff1a; 5&#xff1a;default默认值&#xff1a; 6&#xff1a;type值类…

ffmpeg 同时采集麦克风和摄像头并录制文件

命令 ffmpeg -f dshow -i video"Integrated Webcam" -f dshow -i audio"麦克风 (Realtek(R) Audio)" -vcodec libx264 -acodec mp3 1.mkv ffmpeg -f dshow -i video"Integrated Webcam" -f dshow -i audio"麦克风 (Realtek(R) Audio)&qu…

LeetCode哈希表:最长和谐子序列

LeetCode:哈希表&#xff1a;最长和谐子序列 题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums &#xff0c;请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的…

(Python) 特殊变量

整体 内置模块 name 用到的模块 对象 函数

掌握视频剪辑技巧:批量置入视频封面,提升视频品质

在当今数字化时代&#xff0c;视频已成为生活的重要组成部分。无论是观看电影、电视剧、综艺节目&#xff0c;还是分享个人生活、工作成果&#xff0c;视频都以其独特的魅力吸引着大众的视线。视频封面是视频内容的缩影&#xff0c;是观众对视频的第一印象。一个好的封面能吸引…

C语言面试之旅:掌握基础,探索深度(面试实战之c语言指针数组下篇)

没有什么人能一路单纯到底&#xff0c;但是要记住&#xff0c;别忘了最初的自己。 ----小新 一、引言 在C语言中&#xff0c;指针是一种特殊的数据类型&#xff0c;它存储的是内存地址。指针在C语言编程中扮演着重要的角色&#xff0c;能够有效地提高程序的效率和灵活性。理解…

ArrayList 与 顺序表 (附洗牌算法)!

曾经我也是一枚学霸&#xff0c;直到有一天想去学渣的世界看看&#xff0c;结果就找不到回去的路了。 目录 1. 线性表 2.顺序表 2.1 接口的实现 3. ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 4.4 ArrayList的扩…

Redis连接池参数过期策略慢查询日志

目录 bigKey bigKey危害 bigKey优化 连接池参数 删除策略 慢查询日志 redis.config配置 命令配置 showlog命令 bigKey bigKey危害 Redis阻塞,bigKey操作一般耗时久,Redis单线程, 其他客户端会排队等待网络拥堵,bigKey意味着每次获取需要很大流量, 假设单条数据1MB,并发…

[在不同进制下的长除法] 正整数的任意进制转换

正整数的任意进制转换 题目描述 将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为【2&#xff0c;36】&#xff0c;其中&#xff0c;用到的数码按从小到大依次为&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&…

Flutter PK jetpack compose区别和选择

Flutter诞生于Chrome团队&#xff0c;是一帮做Web的开发做的跨平台框架&#xff0c;从最开始的设计初衷&#xff0c;就是指向了跨平台这条路&#xff0c;而Compose&#xff0c;则是诞生于Android团队&#xff0c;是为了解决当前View的架构体系不能再继续适应申明式编程的范式而…

使用drawio图表,在团队中,做计划,设计和跟踪项目

使用drawio图表&#xff0c;在团队中&#xff0c;做计划&#xff0c;设计和跟踪项目 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部…

Redis中分布式锁的使用

在分布式系统中&#xff0c;如果使用JVM中的同步锁在高并发的场景下仍然会产生线程安全问题。首先我们来查看在多个服务器时为什么会产生线程安全问题&#xff0c;有这样一个案例&#xff0c;有一件商品购买规则为一个用户只能购买一次&#xff0c;如果使用同步锁锁住用户id&am…

AR助推制造业智能转型:实时远程协作与可视化引领生产创新

制造商面临着多方面的变革&#xff0c;技术的兴起催生了工业物联网&#xff08;IIoT&#xff09;&#xff0c;改变了现代工厂的外貌、系统和流程。同时&#xff0c;全球竞争压力和不断变化的员工队伍要求采用新的员工培训方法&#xff0c;并重新审视工人在工厂中的角色。尽管如…

Linux(13):例行性工作排程

例行性工程 听谓的排程是将工作安排执行的流程之意。 Linux 排程就是透过 crontab 与 at 这两个东西。 两种工作排程的方式&#xff1a; 一种是例行性的&#xff0c;就是每隔一定的周期要来办的事项&#xff1b; 一种是突发性的&#xff0c;就是这次做完以后就没有的那一种&a…

【算法】希尔排序

目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.希尔排序是直接插入排序的一种改进&#xff0c;其本质是一种分组插入排序 2.希尔排序采取了分组排序的方式 3.把待排序的数据元素序列按一定间隔进行分组&#xff0c;然后对每个分组进行直接插入排序 4.随着间…

QWebChannel 是 Qt 框架中用于在 Web 页面和 Qt 应用程序之间进行通信的类

QWebChannel 是 Qt 框架中用于在 Web 页面和 Qt 应用程序之间进行通信的类。 QWebChannel 类提供了一种机制&#xff0c;使得 Web 页面可以与 Qt 应用程序进行双向通信。通过 QWebChannel&#xff0c;可以将 Qt 应用程序中的对象暴露给 Web 页面&#xff0c;并通过信号和槽机制…

大型语言模型在实体关系提取中的应用探索

如今LLM(大语言模型)的问答与生成能力已被大家所熟知&#xff0c;很多用户已经亲身体会到了LLM为工作、生活带来的变革。其实&#xff0c;作为NLP(自然语言处理)的集大成者&#xff0c;LLM能为我们提供的能力不限于此。其基本胜任传统NLP技术所能承担的所有任务。如&#xff1a…

[开题报告]基于SpringBoot的艾滋病科普平台的设计与实现

1.选题背景 艾滋病&#xff08;艾滋病毒感染与免疫缺陷综合征&#xff09;是一种严重的传染病&#xff0c;对人类的健康和社会稳定造成了极大的影响。全球范围内&#xff0c;艾滋病已经成为公共卫生领域的重大挑战之一。尽管在科学研究和医疗技术方面取得了一定进展&#xff0…