访问Redis,还在只用RedisTemplatema吗?

本文介绍了使用RedisTemplate、JPARepository和Cache进行数据缓存的方法。RedisTemplate提供灵活的数据操作,而JPARepository通过注解简化了代码。Cache则通过配置实现了简单的缓存逻辑。文章探讨了不同方式的优缺点,适用于不同数据量和场景。
摘要由CSDN通过智能技术生成
  • 开始准备

  • RedisTemplate

  • JPA Repository

  • Cache

  • 总结

 

开始准备

开始之前我们需要有Redis安装,我们采用本机Docker运行Redis,主要命令如下

 

前面两个命令是启动redis docker,后两个是连接到docker,在使用redis-cli 去查看redis里面的内容,主要查看我们存在redis里面的数据。

RedisTemplate

我们可以从RedisTemplate开始,这是一种最易于理解的方式。让我们先看一下代码示例。我们需要定义一个POJO类,它将用于存储我们需要保存到Redis中的数据。这个POJO类可以包含各种属性,例如姓名、年龄、电子邮件地址等。然后,我们需要创建一个RedisTemplate对象,并将其与Redis服务器连接。一旦我们建立了连接,我们就可以使用RedisTemplate的各种方法来存储和检索数据。例如,我们可以使用opsForValue()方法将数据存储为值,或使用opsForHash()方法将数据存储为散列。此外,我们还可以使用RedisTemplate的其他方法来执行各种操作,例如删除、更新和查询数据。因此,使用RedisTemplate可以让我们更轻松地与Redis服务器交互,并提供更多的灵活性和功能。

一个很简单的BOOK类,三个字段:idnameauthor。再来一个RedisTemplate的Bean         

再定义一个使用这个RedisTemplate的Service类 

我们使用Hash来存储这个Book信息。Hash是一种非常高效的数据结构,它可以提供常数时间的插入和查找操作,这意味着无论数据的大小如何,查找数据的时间都是相同的。因此,我们可以在Redis中快速查找书名是否存在。如果存在,我们可以直接从缓存中返回数据,而不必从持久化存储中读取数据。如果不存在,我们可以从持久化存储中找到数据,并使用Template将其写入Redis中。这种方法是缓存的通用做法,它可以提高数据访问速度,减少服务器负载。使用起来非常方便,而且效果非常好。

我们这里为了简单没有使用持久化存储,就硬编码了几条数据,代码如下

 

 

我们调用 bookService.findOneBook("python")bookService.findOneBook("apache kafka"); 来把数据写入到换存中

我们来看下存储在Redis的数据长什么样子。

 

我们可以看到数据被存在了key是“\xac\xed\x00\x05t\x00\x04book”的一个Hash表中, Hash里面有两条记录。大家发现一个问题没有?

就是这个key不是我们想象的用“book”做key,而是多了一串16进制的码, 这是因为RedisTemplate使用了默认的JdkSerializationRedisSerializer 去序列化我们的key和value,如果大家都用Java语言那没有问题, 如果有人用Java语言写,有人用别的语言读,那就有问题,就像我开始的时候用hgetall "book"始终拿不到数据那样。

RedisTemplate也提供了StringRedisTemplate来方便大家需要使用String来序列化redis里面的数据。简单看下代码

使用上就没有那么方便,你就得自己写需要存的是哪个字段,读出来是哪个字段。 

如上图所示,使用客户端读出来看起来就比较清爽一些。也可以看到占用的Size会小很多,我们这个例子相差7倍,如果是数据量大,这个还是比较大的浪费。 

JPA Repository

我们知道使用JPA Repository来访问DataBase的时候,增删改查那样的操作能够很方便的实现,基本就是定义个接口,代码都不用写,Spring就帮我们完成了大部分的工作,那么访问Redis是不是也可以这样呢?答案是肯定的,我们来看代码 首先我们还是定义一个POJO

 

这个类与我们上面template上面的类的区别就是我们加了两个注解, 在类开头加了 @RedisHash(value = "cache-book", timeToLive = 600) 在字段上面加了@Id@Indexed 定义一个Repository的接口 

再定义一个service和上面那个例子template一样,缓存中有就到缓存中拿,没有就到持久化存储中找,并写入缓存 

代码很简单,简单到不敢相信是真的。还是一样,调用这个方法,我们来看存在Redis里面的数据

 

感觉存的内容有些多, 不用怕我们来看下各自存什么数据 首先看最短的一个

 

它里面存的是我们的id所有的value,可以用来判断id是否存在 再来看 

这个是我们数据存放的地方 

另外两个都是set, 存在在它们里面的数据是索引信息。由此可以看出通过JPA Repository 的方式,代码很少,而且存储的数据也很通用,个人觉得是比较理想的访问方法。

Cache

我们已经看了两种方式,在访问的时候遵循这样的模式:缓存中有就从缓存中返回,没有就从持久化存储中找,然后写入缓存,这部分代码我也不想自己写,那么Cache就是你的救星。

我们先看代码 我们这次使用内存数据库H2作为持久化存储, 放一个schema.sql在resouces下面

 

然后定义POJO 

完全是和数据库绑定的代码,和缓存没有任何关系 一个Repository来访问数据库 

定义一个service来调用它 

 

这里就比较关键了,在类上加上了注解 @CacheConfig(cacheNames = "cache-book") 在方法上面加上了Cacheable和CacheEvict, Cacheable这个方法就是用来实现逻辑,有就从缓存中拿,没有就从数据库拿的,CacheEvict是调用这个方法的时候清除缓存。

然后再启动入口程序的地方加上注解 @EnableJpaRepositories @EnableCaching(proxyTargetClass = true) 在配置文件application.properties中加上

 

这样就可以了, 感觉就是通过配置下就把缓存给完成了,非常的简单 我们来看Redis中是怎么存的 

看到没有,就是当成Redis里面的String来存的, 如果数据量比较小,那是非常的方便,如果数据量大,这种方式就有些问题了。

总结

 我们看了这三种方式,这里仅仅是做了个入门。其中,每个方式都有很多细节需要研究和使用。如果想要简单使用Redis存储数据,那么数据量就不能太大。一旦数据量变得很大,就需要进行一些自定义设置。这时,我们可以通过RedisTemplate来实现一些工作。除此之外,还有一些其他的工具可以帮助我们更好地管理和处理Redis的数据,比如Jedis和Lettuce等。在实际应用中,我们还需要考虑Redis的高可用性和安全性等方面,这些都需要我们仔细研究和实践。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永钊源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值