spring RedisTemplate RedisLockRegistry opsForXxx 基本使用总结以及介绍

news2024/11/16 21:01:51

一、基本介绍

RedisTemplatespring 对 redis 操作的高度封装,基本已经满足所有使用场景。
若存在其他拓展使用我们可以自行封装工具类对基本操作进行组装。

RedisLockRegistry 对 redis 锁的一些封装

二、不同环境下依赖以及基本配置

2.1 spring-boot 下依赖

(版本按需替换)

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      <version>3.1.2</version>
    </dependency>

可通过 @Autowired 直接注入

@Autowired
private RedisTemplate redisTemplate

配置该类的序列化和反序列化类(可选,存在默认值)

@Configuration
public class RedisConfig { 
 // 设置Redis序列化方式 默认使用的JDKSerializer序列化 即转为字节存储 在redis 客户端中没有可读性 一般使用 StringRedisSerializer 或 FastJsonRedisSerializer
    @Bean 
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
         // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer()); 
        // value序列化
        redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
        // Hash key序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer()); 
        // Hash value序列化
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        
        return redisTemplate;
    }
}

若使用 FastJsonRedisSerializer 做反序列化需要引入 fastJson 依赖
(版本按需替换)

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.76</version>
    </dependency>
2.2 一般 spring,spring-mvc 环境

核心依赖为
(版本按需替换)

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>2.7.0</version>
    </dependency>

但如果使用
(版本按需替换)

	<dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-redis</artifactId>
        <version>4.3.19.RELEASE</version>
    </dependency>

该包内部也包含了 spring-data-redis 依赖

若引用jedispool 则还需引入
(版本按需替换)此包也是redis 最基础的依赖,但由于更名 所以也叫 jedis

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.10.2</version>
        </dependency>

此类 redisTemplate 初始化动作 以及基本封装
实际内部数据可以通过读取配置文件或者 静态utils 工具类来设置,来获取

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.integration.redis.util.RedisLockRegistry;
import redis.clients.jedis.JedisPoolConfig;

public class RedisReg {

    private static RedisTemplate<String, String> redisTemplate;
    private static RedisLockRegistry redisLockRegistry;
    
    // 静态代码块做初始化
    static {
        JedisPoolConfig poolConfig = new JedisPoolConfig();

        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(redis地址);
        factory.setPort(redis端口);
        factory.setPassword(若存在密码则复制);
        factory.setPoolConfig(redis 连接池);
        // 在 spring bean初始化完成后执行
        factory.afterPropertiesSet();

        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        // key 序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value 序列化
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        // 在 spring bean初始化完成后执行
        redisTemplate.afterPropertiesSet();
        
        RedisReg.redisTemplate = redisTemplate;

        RedisReg.redisLockRegistry =
                new RedisLockRegistry(factory, "redis-lock(任意不重复即可)", 超时时间-毫秒);
    }

    public static RedisTemplate<String, String> getRedisTemplate() {
        return redisTemplate;
    }

    public static RedisLockRegistry getRedisLockRegistry() {
        return redisLockRegistry;
    }
}

三、redisTemplate 基本使用

redisTemplate初始化完成并获取到 redisTemplate 后即可执行一些基本操作

根据 redis 的基本类型redisTemplate提供了对应的各种操作方式

3.1 Spring提供的Redis数据结构的操作类

ops 即 英文 Operations 操作缩写,For 后跟对应的操作对象类型
在这里插入图片描述
常用的一般为前四个,即 Stirng,List,Set, Zset, Hash
Hash 常用来存储和对象类型 Map 类型

3.3 string 类基本操作

set一类在这里插入图片描述
补充说明

第一个 携带 offset 偏移量的为:用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始

setIfAbsent: 如果不存在则赋值 并返回true ,相对的如果已经存在key 则返回false 也意味着赋值失败 ifPresent 则相反
setBit: 将二进制第offset位值变为value

get一类在这里插入图片描述

// 在指定key 的value 后追加内容
redisTemplate.opsForValue().append(key, value)

// 获取字符串长度
redisTemplate.opsForValue().size(key)
	

递增
在这里插入图片描述
递减
在这里插入图片描述

3.4 list 类基本操作

push 加入操作
在这里插入图片描述
rightPopAndLeftPush: 为从一个key 对应的list 队尾获取一个元素,并将该元素放到 目的队列的最左边

获取操作

// 获取列表指定范围内的元素(start开始位置, 0是开始位置,end 结束位置, -1返回所有)
redisTemplate.opsForList().range(key, start, end);

指定获取 index 一类
在这里插入图片描述
pop 取出动作
在这里插入图片描述
从左侧或者右侧移除一个元素并取出,若没有元素时阻塞队列等待到超时或者直到出现可以移除并取出的元素

// 在指定索引处插入值
redisTemplate.opsForList().set(key, index, value)
// 指定 key 下存储的list 的值的长度
redisTemplate.opsForList().size(key)
// 删除集合中值等于value的元素(index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素; index<0, 从尾部开始删除第一个值等于value的元素)
redisTemplate.opsForList().remove(key, index, value)
// 将List列表进行剪裁
redisTemplate.opsForList().trim(key, start, end)
3.5 set 类基本操作

差集
在这里插入图片描述
交集
在这里插入图片描述
并集
在这里插入图片描述
结果获取(count 表个数)
在这里插入图片描述

// 添加元素
redisTemplate.opsForSet().add(key, values)
// 删除单个或多个值
redisTemplate.opsForSet().remove(key, values....)
// 移除并返回一个随机元素
redisTemplate.opsForSet().pop(key)
// 集合长度
redisTemplate.opsForSet().size(key)
// 是否包含某一个值
redisTemplate.opsForSet().isMember(key, value)
// 遍历set类似于Interator(ScanOptions.NONE为显示所有的)
redisTemplate.opsForSet().scan(key, options)

        Cursor<String> dwa = redisTemplate.opsForSet().scan("dwa", ScanOptions.NONE);
        while (dwa.hasNext()) {
           
        }
3.6 hash 类基本操作

基本用于存储对象类型,或map

// 获取指定key 下,对象的某一个属性,有则返回无则为null
redisTemplate.opsForHash().get(key, field)
// 获取所有键值对
redisTemplate.opsForHash().entries(key)
// 获取所有hashkey
redisTemplate.opsForHash().keys(key)
// 获取所有hashkey 下的值
redisTemplate.opsForHash().values(key)
// 获取hash 中所有字段数量
redisTemplate.opsForHash().size(key)
// 删除一个或多个hashkey
redisTemplate.opsForHash().delete(key, fields....)
// 是否存在hasKey
redisTemplate.opsForHash().hasKey(key, field)
// 获取可遍历键值对 ScanOptions.NONE为获取全部键对
redisTemplate.opsForHash().scan(key, options)
// 为指定hash key 对应整数字段做自增
redisTemplate.opsForHash().increment(key, field, increment)

在这里插入图片描述
补充:hashKey 不存在时增加

3.7 zSet类型

有序集合

// 添加元素(有序集合是按照元素的score值由小到大进行排列)
redisTemplate.opsForZSet().add(key, value, score)

// 删除对应的value,value可以为多个值
redisTemplate.opsForZSet().remove(key, values)

// 增加元素的score值,并返回增加后的值
redisTemplate.opsForZSet().incrementScore(key, value, delta)

// 返回元素在集合的排名,有序集合是按照元素的score值由小到大排列
redisTemplate.opsForZSet().rank(key, value)

// 返回元素在集合的排名,按元素的score值由大到小排列
redisTemplate.opsForZSet().reverseRank(key, value)

// 获取集合中给定区间的元素(start 开始位置,end 结束位置, -1查询所有)
redisTemplate.opsForZSet().reverseRangeWithScores(key, start,end)

// 按照Score值查询集合中的元素,结果从小到大排序
redisTemplate.opsForZSet().reverseRangeByScore(key, min, max) 
redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, min, max)

// 返回值为:Set<ZSetOperations.TypedTuple<V>>
// 从高到低的排序集中获取分数在最小和最大值之间的元素
redisTemplate.opsForZSet().reverseRangeByScore(key, min, max, start, end)

// 根据score值获取集合元素数量
redisTemplate.opsForZSet().count(key, min, max)

// 获取集合的大小
redisTemplate.opsForZSet().size(key)
redisTemplate.opsForZSet().zCard(key)

// 获取集合中key、value元素对应的score值
redisTemplate.opsForZSet().score(key, value)

// 移除指定索引位置处的成员
redisTemplate.opsForZSet().removeRange(key, start, end)

// 移除指定score范围的集合成员
redisTemplate.opsForZSet().removeRangeByScore(key, min, max)

// 获取key和otherKey的并集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)
redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey)

// 获取key和otherKey的交集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)
redisTemplate.opsForZSet().intersectAndStore(key, otherKey, destKey)

// 遍历集合 类似迭代器 iterator
Cursor<TypedTuple<Object>> scan = opsForZSet.scan("hahaha", ScanOptions.NONE);
        while (scan.hasNext()){
            ZSetOperations.TypedTuple<Object> item = scan.next();
            System.out.println(item.getValue() + ":" + item.getScore());
        }

部分参考:
参考连接1
参考连接2
脚本之家等

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

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

相关文章

【python】当当书籍数据抓取分析与可视化(代码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Java多线程-第20章

Java多线程-第20章 1.创建线程 Java是一种支持多线程编程的编程语言。多线程是指在同一程序中同时执行多个独立任务的能力。在Java中&#xff0c;线程是一种轻量级的子进程&#xff0c;它是程序中的最小执行单元。Java的多线程编程可以通过两种方式实现&#xff1a;继承Threa…

【李肯C语言小册.目录】小册价值、内容目录汇总、加群方法 | 必看收藏.

小册订阅戳这里&#xff1a;【C语言小册 必读】为什么有这份专栏&#xff1f;解决什么问题&#xff1f;有哪些价值&#xff1f;是否值得订阅&#xff1f;-CSDN社区 订阅后&#xff0c;记得加微VX找我&#xff0c;发zhi付截图&#xff0c;备注【C语言小册】&#xff0c;拉你进本…

关于 SLO,我们需要了解什么?

什么是 SLO&#xff1f; SLO&#xff08;Service Level Objective&#xff09;是服务质量目标的短语缩写。它通常指的是维护系统的最高级别的目标&#xff0c;或服务等级协议&#xff08;SLA&#xff09;中的服务质量目标。它能够定义客户和用户在使用软件系统时所期望的服务质…

在直播间抢到好多实惠东东,全靠抖音支付

前不久我特别喜欢的一位主播的直播间做活动,很多我放在购物车里好久的心仪好物都有秒杀惊喜价。更让我开心的是,在拼手速抢这些秒杀好物的时候,我都成功了!这主要是因为我用了抖音支付,付款环节特别丝滑顺畅,让我在抖音的购物体验直接原地提升了几个level! 可能有朋友现在还是…

使用Docker安装Jenkins,解决插件安装失败,版本太低等问题

如果已经遇到插件安装部分失败&#xff0c;Jenkins版本太低&#xff0c;又要换什么清华镜像地址&#xff0c;不要犹豫&#xff0c;直接以下步骤卸载重装就好了 开始安装 yum 更新到最新 yum update到Jenkins官网查找最新的LST版本 最后的版本号一定要带&#xff0c;指定下载具…

9款高效绘图神器,提升你的工作效率

在日常工作或生活中&#xff0c;我们必须绘制各种图表、流程图、思维导图等图形&#xff0c;或者想用画笔描述自己的想法。然而&#xff0c;我们在许多绘图软件面前感到困惑。我们不知道哪个绘图软件好&#xff0c;也没有足够的时间一一尝试 在接下来的空间里&#xff0c;我们…

jmeter做接口自动化测试,你可能只是个新手!

jmeter 这个工具既可以做接口的功能测试&#xff0c;也可以做自动化测试&#xff0c;还可以做性能测试&#xff0c;其主要用途就是用于性能测试。但是&#xff0c;有些公司和个人&#xff0c;就想用 jmeter 来做接口自动化测试。 你有没有想过呢&#xff1f; 下面我就给大家讲…

深入了解小程序设计,六个关键要点全解析!

微信小程序开启了互联网软件的新使用模式。在各种微信小程序争相抢占流量的同时&#xff0c;如何设计微信小程序&#xff1f;让用户感到舒适是设计师在产品设计初期应该考虑的问题。那么如何做好微信小程序的设计呢&#xff1f;即时设计总结了以下设计指南&#xff0c;希望对准…

ProgrammingError: nan can not be used with MySQL

该错误怎么发生的&#xff1f; 我们先在本地创建测试表&#xff1a; CREATE TABLE users_test (id int NOT NULL AUTO_INCREMENT COMMENT 主键,trade_account varchar(50) DEFAULT NULL COMMENT 交易账号,username varchar(50) DEFAULT NULL,email varchar(100) DEFAULT NULL…

Cesium.CustomShader颜色值显示错误

官方示例&#xff1a; Cesium Sandcastle 测试过程&#xff1a; 1、修改示例&#xff0c;把customshader中的fragmentShaderText替换为如下代码 void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {//注意&#xff1a;下述颜色的b值是0.1&#x…

手把手教会你--办公软件--Word--持续更新

有什么问题&#xff0c;请尽情问博主&#xff0c;QQ群796141573 1.1 Word排版基础1 保存和命名Ⅰ自动保存 2 建立标准的编辑环境(1)显示编辑标记(2)打开标尺(3)打开导航窗格 3 高效的鼠标/键盘手势(1)连续选中内容--shift(2)跳选内容--ctrl(3)矩形选择内容--alt(4)回到文档开头…

全球79%的程序员都在考虑跳槽,你呢?

​在最近二十年中&#xff0c;全球行业都经历了一次数字化变革&#xff0c;各行各业对于技术开发的比重越来越高&#xff0c;而作为技术开发核心的开发人员们对于一个企业的未来发展也变得越来越重要。因此各企业对于技术人才的竞争变得火热&#xff0c;并且这个热度一年高过一…

SSM框架详解:结构创建与注解应用

文章目录 1. 引言2. SSM框架项目结构创建2.1 目录结构2.2 说明 3. 注解的应用3.1 Controller3.2 Service3.3 Repository3.4 Autowired3.5 RequestMapping3.6 Select、Insert等 4. 结语 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢…

传统家装“死气沉沉”?VR智慧家装提供VR可视化方案

传统家装市场虽然处于成熟期&#xff0c;但是对于装修小白的户主来说&#xff0c;难以解决的痛点依旧还有很多。很多家装公司所谓的设计师&#xff0c;不一定全都具备设计知识&#xff0c;也不懂得从客户的需求出发&#xff0c;多重因素导致家装行业“死气沉沉”。 为了打破装修…

振南技术干货集:各大平台串口调试软件大赏(4)

注解目录 &#xff08;串口的重要性不言而喻。为什么很多平台把串口称为 tty&#xff0c;比如 Linux、MacOS 等等&#xff0c;振南告诉你。&#xff09; 1、各平台上的串口调试软件 1.1Windows 1.1.1 STCISP &#xff08;感谢 STC 姚老板设计出 STCISP 这个软件。&#xf…

如何熟练使用vim工具?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

宠物店管理系统服务预约会员小程序效果如何

很多人都会养宠物&#xff0c;随着生活品质提升&#xff0c;尤其以年轻人为主的消费者在宠物食品、医疗、购买消费等方面有较高的消费属性&#xff0c;而在线下也有大量从业者&#xff0c;互联网程度及智慧化门店提升及客户赋能&#xff0c;线下经营的同时还需要线上发展拓客引…

C/C++ 实现FTP文件上传下载

FTP&#xff08;文件传输协议&#xff09;是一种用于在网络上传输文件的标准协议。它属于因特网标准化的协议族之一&#xff0c;为文件的上传、下载和文件管理提供了一种标准化的方法&#xff0c;在Windows系统中操作FTP上传下载可以使用WinINet库&#xff0c;WinINet&#xff…

设计模式-创建型模式之工厂设计模式

文章目录 五、工厂方法六、抽象工厂 五、工厂方法 工厂方法&#xff0c;使用工厂可以像使用人员屏蔽对象创建的细节&#xff0c;使用者无需指定具体的类即可使用功能&#xff0c;达到信息隐蔽的作用&#xff0c;便于后期的维护&#xff0c;修改和扩展。 在看工厂方法前还有一…