[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis

简介: [Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis

3.3 在Java中操作Redis
3.3.1 准备工作
引入jedis依赖


redis.clients
jedis
4.3.2

1
2
3
4
5
创建Redis连接,并测试连接
public class Main {
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");//redis连接池
try (Jedis jedis = jedisPool.getResource()){//获取数据源
String ping = jedis.ping();
System.out.println(ping);
}
}
}
1
2
3
4
5
6
7
8
9
返回pong,说明连接成功.

3.3.2 关于String的操作
get,set.
public class Main {
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");//redis连接池
try (Jedis jedis = jedisPool.getResource()){//获取数据源
stringTest(jedis);
}
}
private static void stringTest(Jedis jedis){
jedis.set("key1","value1");//set一次只可以设置一个键值对
jedis.set("key2","value2");
jedis.set("key3","value3");
String key1 = jedis.get("key1");
String key2 = jedis.get("key2");
String key3 = jedis.get("key100");
System.out.println(key1);
System.out.println(key2);
System.out.println(key3);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

mset,mget
private static void stringTest2(Jedis jedis){
jedis.flushAll();
jedis.mset("key1","value1","key2","value2","key3","value3");//key和value交替设置
List list = jedis.mget("key1","key2","key3");//由于value的值可以重复,所以使用的是list来接收
System.out.println(list);
}
1
2
3
4
5
6

在mset的时候,key和value是交替设置的.在mget接收value的时候,由于value的值是可以重复的.所以我们使用List来接收.

exists,del
private static void stringTest3(Jedis jedis){
jedis.flushAll();
jedis.set("key1","value1");
Boolean ret = jedis.exists("key1");//返回Boolean,即该key是否存在
System.out.println(ret);
Long ret1 = jedis.del("key1");//返回的是Long类型,即删除成功的个数
System.out.println(ret1);
}
1
2
3
4
5
6
7
8
exists返回的是Boolean,即该key是否存在,del返回的是Long类型,即删除成功的个数.

keys
private static void stringTest4(Jedis jedis){
jedis.flushAll();
jedis.set("key1","value1");
jedis.set("key2","value2");
jedis.set("key3","value3");
jedis.set("key4","value4");
jedis.set("key100","value100");
Set keys = jedis.keys("");//由于key不可以重复,所以我们使用set来接收
System.out.println(keys);
Set keys1 = jedis.keys("key?");//?只匹配一个字符
System.out.println(keys1);
Set keys2 = jedis.keys("key
");//*可以匹配多个字符
System.out.println(keys2);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

expire,ttl
private static void stringTest5(Jedis jedis) throws InterruptedException {
jedis.flushAll();
jedis.set("key1","value1");
jedis.set("key2","value2");
jedis.set("key3","value3");
jedis.set("key4","value4");
jedis.expire("key1",5);
Long key1 = jedis.ttl("key1");
System.out.println(key1);
Thread.sleep(6000);//阻塞6秒
boolean ret = jedis.exists("key1");
System.out.println(ret);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

append
private static void stringTest6(Jedis jedis){
jedis.flushAll();
jedis.set("key1","value1");
jedis.append("key1", "aaa");
System.out.println(jedis.get("key1"));
}
1
2
3
4
5
6

getrange,setrange
getrange获取指定字符串区间的字符,setrange设置指定字符串区间的字符.
private static void stringTest7(Jedis jedis){
jedis.flushAll();
jedis.set("key1","value1aaaa");
System.out.println(jedis.getrange("key1", 0, 4));
jedis.setrange("key1",0,"bbbbb");
System.out.println(jedis.getrange("key1",0,4));
}
1
2
3
4
5
6
7

setnx
如果存在key,则不设置,返回0,不存在,则设置
private static void stringTest8(Jedis jedis){
jedis.flushAll();
jedis.set("key1","value1");
long setnx = jedis.setnx("key1", "value1");
System.out.println(setnx);
}
1
2
3
4
5
6

setex
设置键值对,并设置过期时间
private static void stringTest9(Jedis jedis) throws InterruptedException {
jedis.flushAll();
jedis.setex("key1",2,"value1");
Thread.sleep(3000);
String s = jedis.get("key1");
System.out.println(s);
}
1
2
3
4
5
6
7

incr,decr
给指定的key对应的value+1或-1
private static void stringTest10(Jedis jedis){
jedis.flushAll();
jedis.set("key1","1");
jedis.incr("key1");
System.out.println(jedis.get("key1"));
jedis.decr("key1");
System.out.println(jedis.get("key1"));
}
1
2
3
4
5
6
7
8

incrby,decrby
private static void stringTest11(Jedis jedis){
jedis.flushAll();
jedis.set("key1","1");
jedis.incrBy("key1",2);
System.out.println(jedis.get("key1"));
jedis.decrBy("key1",2);
System.out.println(jedis.get("key1"));
}
1
2
3
4
5
6
7
8

3.3.3 关于List的操作
lpush,lpop
private static void listTest1(Jedis jedis){
jedis.flushAll();
jedis.lpush("list1","v1","v2","v3");
System.out.println(jedis.lpop("list1"));
System.out.println(jedis.lpop("list1"));
System.out.println(jedis.lpop("list1"));
}
1
2
3
4
5
6
7

rpush,rpop
private static void listTest2(Jedis jedis){
jedis.flushAll();
jedis.rpush("key1","v1","v2","v3");
System.out.println(jedis.rpop("key1"));
System.out.println(jedis.rpop("key1"));
System.out.println(jedis.rpop("key1"));
}
1
2
3
4
5
6
7

lrange
查看指定下标区间的元素
private static void listTest3(Jedis jedis){
jedis.flushAll();
jedis.rpush("key1","v1","v2","v3");
System.out.println(jedis.lrange("key1",0,1));//左闭右闭
}
1
2
3
4
5

blpop
private static void listTest4(Jedis jedis){
jedis.flushAll();
jedis.lpush("key1","v1");
System.out.println(jedis.blpop(0, "key1"));
System.out.println(jedis.blpop(5, "key1"));
}
1
2
3
4
5
6

brpop和blpop同理,这里不再赘述.

lindex
获取指定下标的元素
private static void listTest5(Jedis jedis){
jedis.flushAll();
jedis.lpush("key1","v1","v2","v3");
System.out.println(jedis.lindex("key1", 2));
}
1
2
3
4
5

linsert
在指定的元素之前或者之后插入指定元素.
private static void listTest6(Jedis jedis){
jedis.flushAll();
jedis.lpush("key1","v1","v2");
jedis.linsert("key1", ListPosition.BEFORE,"v2","100");
System.out.println(jedis.lrange("key1",0,-1));
}
1
2
3
4
5
6

llen
private static void listTest7(Jedis jedis){
jedis.flushAll();
jedis.rpush("key1","v1","v2","v3");
System.out.println(jedis.llen("key1"));
}
1
2
3
4
5

3.3.4 关于Hash的操作
hset,hget
private static void hashTest1(Jedis jedis){
jedis.flushAll();
jedis.hset("key1","field1","value1");
jedis.hset("key1","field2","value2");
jedis.hset("key1","field3","value3");
System.out.println(jedis.hget("key1", "field1"));
System.out.println(jedis.hget("key1", "field2"));
System.out.println(jedis.hget("key1", "field3"));
}
1
2
3
4
5
6
7
8
9

hexists,hdel
private static void hashTest2(Jedis jedis){
jedis.flushAll();
jedis.hset("key1","field1","value1");
jedis.hset("key1","field2","value2");
jedis.hset("key1","field3","value3");
System.out.println(jedis.hexists("key1", "field1"));
System.out.println(jedis.hexists("key1", "field100"));
jedis.hdel("key1","field1");
System.out.println(jedis.hgetAll("key1"));
}
1
2
3
4
5
6
7
8
9
10

hkeys,hvals
private static void hashTest3(Jedis jedis){
jedis.flushAll();
jedis.hset("key1","field1","value1");
jedis.hset("key1","field2","value2");
jedis.hset("key1","field3","value3");
System.out.println(jedis.hkeys("key1"));//获取所有的key
System.out.println(jedis.hvals("key1"));//获取所有的val
}
1
2
3
4
5
6
7
8

hmget
private static void hashTest4(Jedis jedis){
jedis.flushAll();
jedis.hset("key1","field1","value1");
jedis.hset("key1","field2","value2");
jedis.hset("key1","field3","value3");
System.out.println(jedis.hmget("key1","field1","field2"));
}
1
2
3
4
5
6
7

hlen
private static void hashTest5(Jedis jedis){
jedis.flushAll();
jedis.hset("key1","field1","value1");
jedis.hset("key1","field2","value2");
jedis.hset("key1","field3","value3");
System.out.println(jedis.hlen("key1"));
}
1
2
3
4
5
6
7

hincrby,hincrbyfloat
private static void hashTest6(Jedis jedis){
jedis.flushAll();
jedis.hset("key1","field1","2");
jedis.hincrBy("key1","field1",1);
System.out.println(jedis.hget("key1","field1"));
jedis.hincrByFloat("key1","field1",1.5);
System.out.println(jedis.hget("key1","field1"));
}
1
2
3
4
5
6
7
8

3.3.5 关于set的操作
sadd,smember
private static void setTest1(Jedis jedis){
jedis.flushAll();
jedis.sadd("key1","m1","m2","m3");
jedis.sadd("key1","m1");
System.out.println(jedis.smembers("key1"));
}
1
2
3
4
5
6

srem,sismember
private static void setTest2(Jedis jedis){
jedis.flushAll();
jedis.sadd("key1","m1","m2","m3");
System.out.println(jedis.smembers("key1"));
jedis.srem("key1","m1");
System.out.println(jedis.smembers("key1"));
System.out.println(jedis.sismember("key1", "m1"));
System.out.println(jedis.sismember("key1", "m2"));
}
1
2
3
4
5
6
7
8
9

scard
private static void setTest3(Jedis jedis){
jedis.flushAll();
jedis.sadd("key1","m1","m2","m3");
System.out.println(jedis.scard("key1"));
}
1
2
3
4
5

sinter
private static void setTest4(Jedis jedis){
jedis.flushAll();
jedis.sadd("key1","m1","m2","m3");
jedis.sadd("key2","m2","m3","m4");
System.out.println(jedis.sinter("key1","key2"));
}
1
2
3
4
5
6

sunion和sdiff是同样的道理,这里不再赘述.

3.3.6 关于zset的操作
zadd,zrange,zrangeWithScores
private static void zsetTest1(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
System.out.println(jedis.zrange("key1",0,-1));
System.out.println(jedis.zrangeWithScores("key1",0,-1));//返回的是带有分数的二元组
}
1
2
3
4
5
6
7
8

zrem,zcard
private static void zsetTest2(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
jedis.zrem("key1","guanyu");
System.out.println(jedis.zcard("key1"));
System.out.println(jedis.zrangeWithScores("key1",0,-1));
}
1
2
3
4
5
6
7
8
9

zcount
返回指定分数区间的所有key
private static void zsetTest3(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
System.out.println(jedis.zcount("key1",90,91));
}
1
2
3
4
5
6
7

zpopmax,zpopmin
private static void zsetTest4(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
System.out.println(jedis.zpopmax("key1"));
System.out.println(jedis.zpopmin("key1"));
}
1
2
3
4
5
6
7
8

zrank
按升序的顺序返回指定元素的排名
private static void zsetTest5(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
System.out.println(jedis.zrank("key1","guanyu"));
}
1
2
3
4
5
6
7

zscore
获取指定元素的分数.
private static void zsetTest6(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
System.out.println(jedis.zscore("key1","zhaoyun"));
}
1
2
3
4
5
6
7

zincrby
给指定的元素加上指定的分数
private static void zsetTest7(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
jedis.zincrby("key1",10,"zhaoyun");
System.out.println(jedis.zscore("key1","zhaoyun"));
}
1
2
3
4
5
6
7
8

zinterstore
private static void zsetTest8(Jedis jedis){
jedis.flushAll();
jedis.zadd("key1",90,"zhangfei");
jedis.zadd("key1",91,"zhaoyun");
jedis.zadd("key1",92,"guanyu");
jedis.zadd("key2",90,"zhangfei");
jedis.zadd("key2",91,"zhaoyun");
jedis.zadd("key2",93,"zhugeliang");
jedis.zinterstore("key3","key1","key2");
System.out.println(jedis.zrangeWithScores("key3",0, -1));
}
1
2
3
4
5
6
7
8
9
10
11

union和diff是同样的道理,这里不再赘述.

3.4 在Spring中操作Redis
3.4.1 准备工作

相关文章
|
15天前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
5月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
561 4
|
6月前
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
271 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
2月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
364 2
|
4月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
181 32
|
6月前
|
NoSQL Java API
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Spring Boot 集成 Redis
本文介绍了在Spring Boot中集成Redis的方法,包括依赖导入、Redis配置及常用API的使用。通过导入`spring-boot-starter-data-redis`依赖和配置`application.yml`文件,可轻松实现Redis集成。文中详细讲解了StringRedisTemplate的使用,适用于字符串操作,并结合FastJSON将实体类转换为JSON存储。还展示了Redis的string、hash和list类型的操作示例。最后总结了Redis在缓存和高并发场景中的应用价值,并提供课程源代码下载链接。
1644 0
|
6月前
|
NoSQL Java Redis
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 安装
本教程介绍在 VMware 虚拟机(CentOS 7)或阿里云服务器中安装 Redis 的过程,包括安装 gcc 编译环境、下载 Redis(官网或 wget)、解压安装、修改配置文件(如 bind、daemonize、requirepass 等设置)、启动 Redis 服务及测试客户端连接。通过 set 和 get 命令验证安装是否成功。适用于初学者快速上手 Redis 部署。
147 0
|
9月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
568 5
|
10月前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
604 2
|
10月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
270 0