Redis客户端(Jedis、RedisTemplate、Redisson)

1. 简介

        Redis作为一个当下很火热的非关系型数据库,Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库,需要借助于市面上的开源客户端,如Jedis、Spring Data Redis、Redisson,它们可以作为操作Redis非关系型数据库的桥梁。

2. 实例

2.1 Jedis

Jedis 是一个用 Java 编写的 Redis 客户端库,它提供了丰富的 API 来访问 Redis 支持的所有数据结构。Jedis 是同步的和阻塞的,这意味着在执行操作时,当前线程会被阻塞直到操作完成。

2.1.1 添加依赖

在Spring中集成Jedis。

<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>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>

2.1.2 添加配置

application.yml:

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

生成bean:

package com.xiaokai.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;/*** Author:yang* Date:2024-12-09 13:42*/
@Component
public class JedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Beanpublic Jedis jedisClient() {Jedis jedis = new Jedis(new HostAndPort(host, port));return jedis;}
}

2.1.3 测试

package com.xiaokai;import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.Jedis;/*** Author:yang* Date:2024-12-09 10:58*/
@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate Jedis jedisClient;@Testpublic void testJedis() {String s = jedisClient.set("jedis", "jedis");log.info("设置成功:{}", s);String value = jedisClient.get("jedis");log.info("获取成功:{}", value);}
}# 设置成功:OK
# 获取成功:jedis

可以看到Redis中已经存下了当前key-value

127.0.0.1:6379> get jedis
"jedis"

2.1.4 Jedis API

2.1.4.1 连接与断开连接
  • Jedis jedis = new Jedis("localhost", 6379);:创建一个新的 Jedis 实例连接到本地的 Redis 服务器。

  • jedis.connect();:建立连接(现在这个步骤通常是自动的,不建议手动调用)。

  • jedis.disconnect();:断开连接。

2.1.4.2 键操作
  • jedis.exists(String key);:检查给定的键是否存在。

  • jedis.del(String key);:删除给定的键。

  • jedis.keys(String pattern);:返回匹配给定模式的所有键。

  • jedis.ttl(String key);:返回给定键的剩余生存时间(以秒为单位)。

2.1.4.3 字符串(String)操作
  • jedis.set(String key, String value);:设置键的值。

  • jedis.get(String key);:获取与给定键相关联的值。

  • jedis.append(String key, String value);:将值追加到键的当前值。

  • jedis.incr(String key);:将键的值增加 1。

  • jedis.decr(String key);:将键的值减少 1。

2.1.4.4 列表(List)操作
  • jedis.lpush(String key, String... values);:将一个或多个值插入到列表的头部。

  • jedis.rpush(String key, String... values);:将一个或多个值插入到列表的尾部。

  • jedis.lpop(String key);:移除并返回列表的第一个元素。

  • jedis.rpop(String key);:移除并返回列表的最后一个元素。

  • jedis.lrange(String key, long start, long end);:返回列表中指定范围内的元素。

2.1.4.5 集合(Set)操作
  • jedis.sadd(String key, String... members);:向集合添加一个或多个成员。

  • jedis.smembers(String key);:返回集合中的所有成员。

  • jedis.srem(String key, String... members);:移除集合中的一个或多个成员。

  • jedis.sismember(String key, String member);:检查成员是否是集合的成员。

2.1.4.6 有序集合(Sorted Set)操作
  • jedis.zadd(String key, double score, String member);:向有序集合添加一个成员。

  • jedis.zrange(String key, long start, long end);:返回有序集合中指定范围内的成员。

  • jedis.zrem(String key, String... members);:移除有序集合中的一个或多个成员。

  • jedis.zscore(String key, String member);:返回成员的分数。

2.1.4.7 哈希(Hash)操作
  • jedis.hset(String key, String field, String value);:将哈希表的字段设置为值。

  • jedis.hget(String key, String field);:获取哈希表中字段的值。

  • jedis.hgetAll(String key);:获取哈希表中所有的字段和值。

  • jedis.hdel(String key, String... fields);:删除哈希表中的一个或多个字段。

2.1.4.8 发布/订阅(Pub/Sub)操作
  • jedis.publish(String channel, String message);:发布消息到频道。

  • JedisPubSub jedisPubSub = new JedisPubSub() {...};:创建一个新的 JedisPubSub 实例来订阅频道。

2.1.4.9 事务
  • jedis.multi();:开始一个事务。

  • jedis.exec();:执行事务。

2.1.4.10 脚本
  • jedis.eval(String script, int keyCount, String... params);:执行 Lua 脚本。

2.2 Spring Data Redis

Spring Data Redis 是 Spring 提供的一套操作 Redis 的抽象,它包括 RedisTemplateStringRedisTemplate 等模板类,简化了 Redis 的操作。Spring Data Redis 默认使用 Lettuce 作为客户端,但也支持 Jedis。

2.2.1 添加依赖

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

2.2.2 添加配置

application.yml:

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

序列化配置:

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 org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.DefaultBaseTypeLimitingValidator;
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 使用StringRedisSerializer来序列化keyStringRedisSerializer stringRedisSerializer = new StringRedisSerializer();template.setKeySerializer(stringRedisSerializer);template.setHashKeySerializer(stringRedisSerializer);// 使用Jackson2JsonRedisSerializer来序列化valueJackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 配置ObjectMapper以处理多态objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(),ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.PROPERTY);objectMapper.setDefaultTyping(new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL,new DefaultBaseTypeLimitingValidator(Object.class)).init(null,Jackson2JsonRedisSerializer.Typing.NON_FINAL,null).inclusion(JsonTypeInfo.As.PROPERTY));jsonRedisSerializer.setObjectMapper(objectMapper);template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);template.afterPropertiesSet();return template;}
}

注:如果不设置序列化器,默认使用jdk序列化,存储的key为\xac\xed\x00\x05t\x00\x04test

2.2.3 测试

@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedis() {try{redisTemplate.opsForValue().set("test", "test");log.info("设置成功");}catch (Exception e){log.error("设置失败", e);}String test = (String) redisTemplate.opsForValue().get("test");log.info("获取成功:{}", test);String bless = (String) redisTemplate.opsForValue().get("Bless");log.info("获取成功:{}", bless);}@Testpublic void testRedisList() {redisTemplate.opsForList().leftPush("list", "1");redisTemplate.opsForList().leftPush("list", "2");redisTemplate.opsForList().leftPush("list", "3");String list = (String) redisTemplate.opsForList().rightPop("list");log.info("获取成功:{}", list);}@Testpublic void testRedisMap() {redisTemplate.opsForHash().put("user", "key1", "value1");}
}

注:RedisTemplate可以直接使用,不需要去生成一个专有bean。

2.2.4 相关API

2.2.4.1 设置和获取键值
  • set(key, value):设置键值。

  • opsForValue().set(key, value):设置字符串(简单值)。

  • opsForValue().get(key):获取字符串值。

  • opsForValue().getAndSet(key, value):将旧的值替换为新的值,并返回旧的值。

2.2.4.2 过期时间操作
  • expire(key, timeout, unit):设置键的过期时间。

  • getExpire(key):返回键的剩余过期时间。

  • getExpire(key, unit):返回剩余过期时间并且指定时间单位。

2.2.4.3 键的操作
  • hasKey(key):判断键是否存在。

  • delete(key):删除单个键。

  • delete(Collection<K> keys):批量删除键。

  • keys(pattern):查找匹配的键值,返回一个 Set 集合类型。

2.2.4.4 列表操作
  • opsForList().leftPush(key, value):在列表左侧插入值。

  • opsForList().rightPush(key, value):在列表右侧插入值。

  • opsForList().multiGet(keys):批量获取列表中的值。

2.2.4.5集合操作
  • opsForSet().add(key, value):向集合中添加元素。

  • opsForSet().members(key):获取集合中的所有成员。

2.2.4.6 有序集合操作
  • opsForZSet().add(key, value, score):向有序集合中添加元素。

  • opsForZSet().range(key, start, end):获取有序集合中指定范围的元素。

2.2.4.7 哈希操作
  • opsForHash().put(key, hashKey, hashValue):向哈希中添加键值对。

  • opsForHash().entries(key):获取哈希中的所有键值对。

2.2.4.8 地理空间操作
  • opsForGeo().add(key, geoLocation):向地理空间添加位置。

  • opsForGeo().radius(key, circle):根据半径查询地理空间中的位置。

2.2.4.9 事务操作
  • execute(SessionCallback action):执行 Redis 事务。

2.2.4.10 流操作
  • opsForStream().add(record):向 Redis 流中添加记录。

  • opsForStream().read(recordClass, StreamOffset):从 Redis 流中读取记录。

2.3 Redisson

Redisson 是一个基于 Java 的 Redis 客户端库,它提供了多种分布式数据结构和服务,如分布式锁、原子变量、集合等。Redisson 支持多种 Redis 模式,包括单机、主从、集群和哨兵模式。

2.3.1 添加依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.6</version>
</dependency>

2.3.2 添加配置

application.yml(使用配置文件)

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

2.3.3 测试

@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate RedissonClient redissonClient;@Testpublic void testRedissonClient() {RBucket<String> bucket = redissonClient.getBucket("test");bucket.set("test");log.info("设置成功");String test = bucket.get();log.info("获取成功:{}", test);RBucket<Object> bless = redissonClient.getBucket("Bless");bless.set("Bless");String value = (String) bless.get();log.info("获取成功:{}", value);}}

注:

  • 配置文件不需要额外的bean可以直接使用。

  • 编程式使用:

单机模式

Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("password").setDatabase(0);
RedissonClient redisson = Redisson.create(config);

集群模式

Config config = new Config();
ClusterServersConfig clusterConfig = config.useClusterServers().addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001").addNodeAddress("redis://127.0.0.1:7002");
clusterConfig.setPassword("password");
RedissonClient redisson = Redisson.create(config);

2.3.4 相关API

2.3.4.1 连接与断开连接
// 创建 Redisson 客户端实例,默认连接到本地的 Redis 服务器
RedissonClient redisson = Redisson.create();// 断开连接
redisson.shutdown();
2.3.4.2 键操作
// 检查给定的键是否存在
boolean exists = redisson.getKeys().exists("key");// 删除给定的键
redisson.getKeys().delete("key");// 返回匹配给定模式的所有键
Set<String> keys = redisson.getKeys().getKeysByPattern("pattern");// 返回给定键的剩余生存时间(以秒为单位)
long ttl = redisson.getKeys().getTTL("key");
2.3.4.3 字符串(String)操作
// 设置键的值
RBucket<String> bucket = redisson.getBucket("key");
bucket.set("value");// 获取与给定键相关联的值
String value = bucket.get();// 将值追加到键的当前值
long length = bucket.append("value");// 将键的值增加 1
RAtomicLong atomicLong = redisson.getAtomicLong("key");
atomicLong.increment();// 将键的值减少 1
atomicLong.decrement();
2.3.4.4 列表(List)操作
// 将一个或多个值插入到列表的头部
RList<String> list = redisson.getList("list");
list.leftPush("value");// 将一个或多个值插入到列表的尾部
list.rightPush("value");// 移除并返回列表的第一个元素
String element = list.leftPop();// 移除并返回列表的最后一个元素
element = list.rightPop();// 返回列表中指定范围内的元素
List<String> range = list.range(0, -1);
2.3.4.5 集合(Set)操作
// 向集合添加一个或多个成员
RSet<String> set = redisson.getSet("set");
set.add("value");// 返回集合中的所有成员
Set<String> members = set.readAll();// 移除集合中的一个或多个成员
set.remove("value");// 检查成员是否是集合的成员
boolean isMember = set.contains("value");
2.3.4.6 有序集合(Sorted Set)操作
// 向有序集合添加一个成员
RScoredSortedSet<String> sortedSet = redisson.getScoredSortedSet("sortedSet");
sortedSet.add(10.0, "value");// 返回有序集合中指定范围内的成员
List<String> range = sortedSet.getValues(0, -1);// 移除有序集合中的一个或多个成员
sortedSet.remove("value");// 返回成员的分数
Double score = sortedSet.getScore("value");
2.3.4.7 哈希(Hash)操作
// 将哈希表的字段设置为值
RMap<String, String> map = redisson.getMap("map");
map.fastPut("field", "value");// 获取哈希表中字段的值
String value = map.get("field");// 获取哈希表中所有的字段和值
Map<String, String> entries = map.readAllMap();// 删除哈希表中的一个或多个字段
map.fastRemove("field");
2.3.4.8 发布/订阅(Pub/Sub)操作
// 发布消息到频道
RTopic<String> topic = redisson.getTopic("channel");
topic.publish("message");// 创建一个新的订阅实例来订阅频道
topic.addListener(String.class, (channel, message) -> {System.out.println("Received message: " + message);
});
2.3.4.9 事务
// 开始一个事务
TransactionResult result = redisson.multi();// 执行事务中的所有命令
result.exec();
2.3.4.10 脚本
// 执行 Lua 脚本
RScript script = redisson.getScript();
RObject eval = script.eval(RScript.Mode.READ_ONLY, "return redis.call('get', KEYS[1])", RScript.ReturnType.VALUE, "myKey");

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

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

相关文章

沈阳理工大学《2024年811自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《沈阳理工大学811自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

2023 年 408 大题解析

讲解视频推荐&#xff1a; 【BOK408真题讲解-2023】 一、数据结构 1. 算法题&#xff08;图的邻接矩阵&#xff09;13’ 已知有向图 G 采用邻接矩阵存储&#xff0c;类型定义如下&#xff1a; typedef struct{ //图的类型定义int num Vertices, numEdges; //图的顶点数和有…

蓝桥杯刷题——day3

蓝桥杯刷题——day3 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 每张票据有唯一的 ID 号&#xff0c;全年所有票据的 ID 号是连续的&#xff0c;但 ID 的开始数码是随机选定的。因为工作人员疏忽&#xff0c;在录入 ID 号的时候发生了一处错误&#xff0c;造…

nginx.conf 请求时间部分参数说明新手教程

下面来说下nginx.conf 的部分参数&#xff0c;配置如下&#xff1a; http {include mime.types;default_type application/octet-stream;client_max_body_size 1000M;#log_format main $remote_addr - $remote_user [$time_local] "$request" # …

【R语言】基础知识

一、对象与变量 R语言中的所有事物都是对象&#xff0c;如向量、列表、函数&#xff0c;变量、甚至环境等。它的所有代码都是基于对象object的操作&#xff0c;变量只是调用对象的手段。 1、对象 在R语言中&#xff0c;对计算机内存的访问是通过对象实现的。 # 字符型向量 …

【SpringBug】lombok插件中@Data不能生成get和set方法

一&#xff1a;问题引入 可以看到我们在类UserInfo上写了Data注解&#xff0c;但是在测试文件中生成的反编译target文件Us二Info中没有get和set方法 二&#xff1a;解决方法 1&#xff1a;Spring升级问题&#xff08;解决了我的问题&#xff09; 原因是Spring官方进行了升级…

Java版-图论-最短路-Floyd算法

实现描述 网络延迟时间示例 根据上面提示&#xff0c;可以计算出&#xff0c;最大有100个点&#xff0c;最大耗时为100*wi,即最大的耗时为10000&#xff0c;任何耗时计算出来超过这个值可以理解为不可达了&#xff1b;从而得出实现代码里面的&#xff1a; int maxTime 10005…

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了&#xff0c;能搜到这篇文章说明你了解 总之就是一个单片机重启程序&#xff0c;设定好超时时间&#xff0c;在超时时间内没有喂狗&#xff0c;单片机就会复位 主要应用在单片机异常重启方面&#xff0c;比如程序跑飞&#xff08;注意程序跑飞时你就…

uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能

前言 这次的标题有点长&#xff0c;主要是想要表述的功能点有点多&#xff1b; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分&#xff0c;可以单击预览大图&#xff0c;同时在预览界面可以双指放大缩小图片并且可以移动查看图片&#xff0c;双击放大&#xff0…

【Hive】-- hive 3.1.3 伪分布式部署(单节点)

1、环境准备 1.1、版本选择 apache hive 3.1.3 apache hadoop 3.1.0 oracle jdk 1.8 mysql 8.0.15 操作系统:Mac os 10.151.2、软件下载 https://archive.apache.org/dist/hive/ https://archive.apache.org/dist/hadoop/ 1.3、解压 tar -zxvf apache-hive-4.0.0-bin.tar…

Java报错Communications link failure

"Communications link failure" 是一个常见的错误提示&#xff0c;通常与数据库连接问题有关&#xff0c;尤其是在使用 Java 应用程序时连接 MySQL 或其他数据库时。以下是一些可能的原因及解决方法&#xff1a; 可能原因&#xff1a; 数据库服务未启动&#xff1a;…

备注的英语及英语简称

一、 备注的英文及英语简称如下&#xff1a; 英文&#xff1a;remark&#xff1b;note&#xff1b;comment&#xff1b;caption&#xff1b; annotation。简称&#xff1a;rmk&#xff1b;note&#xff1b;cmt&#xff1b;cap&#xff1b;anno。 备注的英文表达 1. Remark&a…

SpringBoot Scan作用记录

‌ServletComponentScan‌ ServletComponentScan‌是Spring框架提供的一个注解,用于扫描并注册Servlet、Filter和Listener组件。这个注解使得Spring能够自动检测和管理这些组件,而无需在web.xml中手动配置,从而简化项目的配置和管理‌ @ServletComponentScan注解被添加到主…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…

求解球面的一组正交标架

目录 求解球面的一组正交标架 求解球面的一组正交标架 球面 r ( u , v ) ( a cos ⁡ u cos ⁡ v , a cos ⁡ u sin ⁡ v , a sin ⁡ u ) \mathbf{r}(u,v)\left(a\cos u\cos v,a\cos u\sin v,a\sin u\right) r(u,v)(acosucosv,acosusinv,asinu), 求得 r u ( − a sin ⁡ u c…

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”

近期&#xff0c;《咬文嚼字》杂志发布了2024年度十大流行语&#xff0c;“智能向善”位列其中&#xff0c;过去一年时间里&#xff0c;深度伪造、AI诈骗等话题屡次登上热搜&#xff0c;AI技术“野蛮生长”引发公众担忧。今年9月&#xff0c;全国网络安全标准化技术委员会发布了…

【系统思辨】两难与虚假两难

怎么做都不好 前面有两条路&#xff0c;做事情有两种方法&#xff0c;也就是说有两种可能的选择&#xff0c;无论哪一种选择&#xff0c;都有利有弊&#xff0c;让人们处于进退维谷的困境。这类问题的特征就是&#xff0c;无论你的决定是什么&#xff0c;都会失去另一半&#…

详解多租户架构下的资源隔离模式

文章目录 0.简介1.多租户概念1.1 基本概念1.2 单租户 vs 多租户 2.实现方案2.1 独立数据库方案2.1.1 优点2.1.2 缺点2.1.3 应用场景 2.2 共享数据库&#xff0c;独立 Schema2.2.1 优点2.2.2 缺点2.2.3 应用场景 2.3 共享数据库、共享Schema、共享表2.3.1 优点2.3.2 缺点2.3.3 应…

SMMU软件指南SMMU编程之寄存器

安全之安全(security)博客目录导读 本博客介绍了SMMUv3的编程接口&#xff1a; • SMMU寄存器 • 流表&#xff08;Stream table&#xff09; • CD&#xff08;Context Descriptor&#xff09; • 事件队列&#xff08;Event queue&#xff09; • 命令队列&#xff08;…

分布式 窗口算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 窗口算法 & 总结》《分布式 & 窗口算法 & 问题》 参考文献 《【算法】令牌桶算法》 固定窗口算法 简介 固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个…