java redis remove_在Java中使用redisTemplate操作缓存的方法示例

本文详细介绍了在Java中使用redisTemplate操作Redis缓存的方法,包括List和Hash的数据类型。通过实例展示了如何进行添加、删除、查询等操作,并解释了各方法的作用和使用场景,帮助开发者更好地理解和使用Redis缓存。
摘要由CSDN通过智能技术生成

背景

在最近的项目中,有一个需求是对一个很大的数据库进行查询,数据量大概在几千万条。但同时对查询速度的要求也比较高。

这个数据库之前在没有使用Presto的情况下,使用的是Hive,使用Hive进行一个简单的查询,速度可能在几分钟。当然几分钟也并不完全是跑SQL的时间,这里面包含发请求,查询数据并且返回数据的时间的总和。但是即使这样,这样的速度明显不能满足交互式的查询需求。

我们的下一个解决方案就是Presto,在使用了Presto之后,查询速度降到了秒级。但是对于一个前端查询界面的交互式查询来说,十几秒仍然是一个不能接受的时间。

虽然Presto相比Hive已经快了很多(FaceBook官方宣称的是10倍),但是对分页的支持不是很友好。我在使用的时候是自己在后端实现的分页。

在这种情况下应用缓存实属无奈之举。讲道理,优化应从底层开始,自底而上。上层优化的方式和效率感觉都很有局限。

为什么要使用缓存

前端查询中,单次查询的匹配数据量有可能会达到上百甚至上千条,在前端中肯定是需要分页展示的。就算每次查询10条数据,整个查询也要耗时6-8s的时间。想象一下,每翻一页等10s的场景。

所以,此时使用redis缓存。减少请求数据库的次数。将匹配的数据一并存入数据库。这样只有在第一次查询时耗费长一点,一旦查询完成,用户点击下一页就是毫秒级别的操作了。

使用redisTemplate

Spring封装了一个比较强大的模板,也就是redisTemplate,方便在开发的时候操作Redis缓存。在Redis中可以存储String、List、Set、Hash、Zset。下面将针对List和Hash分别介绍。

List

Redis中的List为简单的字符串列表,常见的有下面几种操作。

hasKey

判断一个键是否存在,只需要调用hasKey就可以了。假设这个Key是test,具体用法如下。

if (redisTemplate.hasKey("test")) {

System.out.println("存在");

} else {

System.out.println("不存在");

}

range

该函数用于从redis缓存中获取指定区间的数据。具体用法如下。

if (redisTemplate.hasKey("test")) {

// 该键的值为 [4, 3, 2, 1]

System.out.println(redisTemplate.opsForList().range("test", 0, 0)); // [4]

System.out.println(redisTemplate.opsForList().range("test", 0, 1)); // [4, 3]

System.out.println(redisTemplate.opsForList().range("test", 0, 2)); // [4, 3, 2]

System.out.println(redisTemplate.opsForList().range("test", 0, 3)); // [4, 3, 2, 1]

System.out.println(redisTemplate.opsForList().range("test", 0, 4)); // [4, 3, 2, 1]

System.out.println(redisTemplate.opsForList().range("test", 0, 5)); // [4, 3, 2, 1]

System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [4, 3, 2, 1] 如果结束位是-1, 则表示取所有的值

}

delete

删除某个键。

List test = new ArrayList<>();

test.add("1");

test.add("2");

test.add("3");

test.add("4");

redisTemplate.opsForList().rightPushAll("test", test);

System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [1, 2, 3, 4]

redisTemplate.delete("test");

System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // []

size

获取该键的集合长度。

List test = new ArrayList<>();

test.add("1");

test.add("2");

test.add("3");

test.add("4");

redisTemplate.opsForList().rightPushAll("test", test);

System.out.println(redisTemplate.opsForList().size("test")); // 4

leftPush

我们把存放这个值的地方想象成如图所示的容器。

container

4cbd69d7c08c8b25e675bc22e92cded8.png

并且取数据总是从左边取,但是存数据可以从左也可以从右。左就是leftPush,右就是rightPush。leftPush如下图所示。

left-push

cbd6e8a7c20ad0a5ddf83a72cab27246.png

用法如下。

for (int i = 0; i < 4; i++) {

Integer value = i + 1;

redisTemplate.opsForList().leftPush("test", value.toString());

System.out.println(redisTemplate.opsForList().range("test", 0, -1));

}

控制台输出的结果如下。

[1]

[2, 1]

[3, 2, 1]

[4, 3, 2, 1]

leftPushAll

基本和leftPush一样,只不过是一次性的将List入栈。

List test = new ArrayList<>();

test.add("1");

test.add("2");

test.add("3");

test.add("4");

redisTemplate.opsForList().leftPushAll("test", test);

System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [4, 3, 2, 1]

当然你也可以这样

redisTemplate.opsForList().leftPushAll("test", test);

System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [4, 3, 2, 1]

leftPushIfPresent

跟leftPush是同样的操作,唯一的不同是,当且仅当key存在时,才会更新key的值。如果key不存在则不会对数据进行任何操作。

redisTemplate.delete("test");

redisTemplate.opsForList().leftPushIfPresent("test", "1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值