标签: spring-data-redis

Spring Data Redis -- 如何在 Spring Data Redis 中为变量提供别名?

在下面的代码中,如果我想在redis数据库中将id存储为student_id,将name存储为student_name,并且我不想更改java代码中的变量名称。有没有办法为变量提供别名,就像我们在 spring data jpa 中所做的那样,我们在 @Column 注释中指定列的名称。如果有人有相同的解决方案,请帮助我。

@RedisHash("Student")
public class Student implements Serializable
{
   @Id
   private Long id;
   private String name;

   private float marksObtained;
   private String schoolName;
}
Run Code Online (Sandbox Code Playgroud)

spring redis spring-data spring-data-redis spring-boot

5
推荐指数
0
解决办法
641
查看次数

如何为 Redis 中的数据建模以获得复杂的数据结构?

我参考了链接:http://panuoksala.blogspot.com/2015/09/redis-many-to-many.html来开发下面的代码。我已经实现了一些代码,看起来到目前为止什么都无法实现

获取用户1组:

hget User:1 Groups
Run Code Online (Sandbox Code Playgroud)

不产生结果。

我想从数据建模的角度获得更多答案。我已经对如下代码进行了建模,但它没有按照我的要求工作 -

组.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("groups")
public class Group {
    @Id
    private Long groupId;
    private String name;

    private List<User> users;
}
Run Code Online (Sandbox Code Playgroud)

和用户.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("users")
public class User {
    @Id
    private Long userId;
    private String name;
    List<Group> groups;
}
Run Code Online (Sandbox Code Playgroud)

用户组测试.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserGroupTest extends RepositoryTestSupport{
    @Autowired UserRepository userRepository;
    @Autowired GroupRepository groupRepository;

    @Before
    public void setUp() {

        // User -> Group relations 
        Group group1 = Group.builder().groupId(1L).name("Nature-Group").build();
        Group …
Run Code Online (Sandbox Code Playgroud)

spring redis jedis spring-data-redis spring-boot

5
推荐指数
0
解决办法
758
查看次数

从不同的微服务读取相同的缓存

我使用 spring-data-redis(2.1.5.RELEASE) 和 jedis(2.10.2) 客户端从作为 spring-boot 应用程序运行的不同服务连接到我的 azure redis 实例。

通过实现以下配置,两个服务具有相同的缓存方法并指向相同的缓存。我面临的问题是,当一个服务尝试读取另一服务创建的缓存值时,会发生反序列化异常。

例外:

org.springframework.data.redis.serializer.SerializationException:无法反序列化;嵌套异常是 org.springframework.core.serializer.support.SerializationFailedException:无法反序列化有效负载。字节数组是DefaultDeserializer相应序列化的结果吗?嵌套异常是 org.springframework.core.NestedIOException:无法反序列化对象类型;嵌套异常是 java.lang.ClassNotFoundException

注意:我仅使用 redis 来缓存从数据库读取的数据。

微服务1的Redis缓存配置

public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
    return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}

@Bean
public RedisCacheManager cacheManager() {
    Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
    cacheNamesConfigurationMap.put("employers", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
    cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));

    RedisCacheManager manager = new RedisCacheManager(redisCacheWriter(), RedisCacheConfiguration.defaultCacheConfig(), cacheNamesConfigurationMap);
    manager.setTransactionAware(true);
    manager.afterPropertiesSet();

    return manager;
}
Run Code Online (Sandbox Code Playgroud)

微服务2的Redis缓存配置

public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
    return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}

@Bean
public RedisCacheManager cacheManager() {
    Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
    cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));

    RedisCacheManager manager …
Run Code Online (Sandbox Code Playgroud)

spring-data-redis spring-boot azure-redis-cache

5
推荐指数
1
解决办法
2710
查看次数

JedisConnectionException - 读取超时错误

我正在尝试使用 Spring Data Redis + Jedis 组合连接到 AWS ElastiCache Redis。[Redis 集群已启用,因此它具有集群配置端点,具有 3 个分片 - 每个分片有 1 个主节点 + 2 个副本节点]

我收到读取超时错误。

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

AWS Redis 服务器版本:5.0.3 / 集群模式:已启用 / SSL:已启用 / 身份验证:已启用(通过密码)

库 -- Spring-data-redis : 2.1.6.Release / jedis : 2.9.0

Telnet 适用于 AWS Redis 所有节点和 6379 端口上的集群配置端点。

我单独尝试了Redisson,它连接到AWS Redis,没有任何问题。

因此,Redis 本身没有问题,Spring Data Redis 与 Jedis 结合使用会出现问题。

我的代码看起来像这样 -

        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
        redisClusterConfiguration.setClusterNodes(listOfRedisNode);
        redisClusterConfiguration.setPassword(passwordString);


        JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
        jedisClientConfiguration.connectTimeout(Duration.ofSeconds(60));
        jedisClientConfiguration.useSsl();
        jedisClientConfiguration.usePooling();


        JedisConnectionFactory jedisConnectionFactory …
Run Code Online (Sandbox Code Playgroud)

java amazon-web-services jedis spring-data-redis redis-cluster

5
推荐指数
1
解决办法
6243
查看次数

Spring Data REDIS - 具有奇怪前缀的哈希键,并且 HSCAN 无法正确返回结果

我将 spring boot (无关)与 spring-data-redis:jar:2.0.9 结合使用,它使用 lettuce 连接到我的 REDIS。我使用的哈希结构包含大约 100 个键。在这些键下,我放置了一些类型也不相关的对象:

private static final String HASH_KEY_NAME = "myspecialhashes:somekey";

@Autowired
private RedisTemplate<String, MyDto> myDtoRedisTemplate;
Run Code Online (Sandbox Code Playgroud)

现在我只是将对象列表放入哈希中,使用它们的 id 作为键:

myDtoRedisTemplate.opsForHash().put(HASH_KEY_NAME, dto.getId(), dto);
Run Code Online (Sandbox Code Playgroud)

这工作得很好,并且从哈希中检索所有元素都很好,并且仅检索键

List allDtosRaw = myDtoRedisTemplate.opsForHash().values(HASH_KEY_NAME);
Run Code Online (Sandbox Code Playgroud)

另外,在列出键时:

myDtoRedisTemplate.boundHashOps(HASH_KEY_NAME).keys()
Run Code Online (Sandbox Code Playgroud)

看起来不错,返回的密钥集以以下内容开头:

(java.util.LinkedHashSet<E>) [fakeservicetest:dummy3:write, fakesingle:dummy:sub1:write, ....
Run Code Online (Sandbox Code Playgroud)

由于有很多键,我希望能够使用 HSCAN 过滤以令牌开头的对象列表,而不是获取所有键并在我的 Java 应用程序中过滤它们。所以,这就是我如何进行 HSCAN 来获取所有以“fake”开头的哈希条目

List filteredDtosRaw = new LinkedList<>();
ScanOptions scanOptions = ScanOptions.scanOptions().match("fake*").count(10000).build();
Cursor cursor = myDtoRedisTemplate.boundHashOps(HASH_KEY_NAME).scan(scanOptions);
        cursor.forEachRemaining(filteredDtosRaw ::add);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这返回零结果。我尝试了各种方法来解决这个问题并取得了一些成果。最终我转向 redis 命令行来看看 REDIS 是如何看待这一切的

redis-cli HSCAN "myspecialhashes:somekey" 0 MATCH "fake*" COUNT 1000
Run Code Online (Sandbox Code Playgroud)

确实是零结果。接下来的事情是查看其中的所有键并查看哈希中实际包含的内容

redis-cli …
Run Code Online (Sandbox Code Playgroud)

java redis lettuce spring-data-redis

5
推荐指数
1
解决办法
5155
查看次数

使用 ssl 在 AWS 上使用 Spring-boot-starter-data-redis 启动错误

所以,今天遇到了一个有趣的问题,弄乱了 spring-boot-starter-data-rest。我的用例是在 Redis 上存储一些具有一定过期时间的数据,以便在该时间过去后它将被驱逐。我已配置好所有内容,并且可以在本地 redis 上正常运行,没有任何问题。当尝试使用安全连接 (SSL) 在 AWS 上使用它时,它会成为一个问题,并且是一个示例错误:

           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
           at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
           at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
           at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
           at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
           at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
           at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
           at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
           at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
           at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)
           at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)
           at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
           at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191)
           at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180)
           at com.springbootapp.config.Application.main(Application.java:16)
           ... 6 more
   Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: ERR Unsupported CONFIG parameter: notify-keyspace-events; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR Unsupported CONFIG parameter: notify-keyspace-events
           at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:44)
           at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:36)
           at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:37)
           at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:37)
           at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:210)
           at org.springframework.data.redis.connection.jedis.JedisConnection.setConfig(JedisConnection.java:633)
           at org.springframework.session.data.redis.config.ConfigureNotifyKeyspaceEventsAction.configure(ConfigureNotifyKeyspaceEventsAction.java:63)
           at org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration$EnableRedisKeyspaceNotificationsInitializer.afterPropertiesSet(RedisHttpSessionConfiguration.java:167) …
Run Code Online (Sandbox Code Playgroud)

spring-data spring-data-redis spring-boot

5
推荐指数
2
解决办法
2031
查看次数

spring-data-redis,空列表属性值变为null

我正在将一些微服务从 SpringBoot1.5 移植到 2.1。

我们正在使用 spring-data-redis。似乎默认的内部移动从 jedis 到 lettuce。

问题是我们现在观察到一些奇怪的行为,当我们保存一个对象然后检索它时,有一个微小的差异:

空列表属性将替换为 null。

这是一个例子:

//repo 
public interface TestRepository extends CrudRepository<Test, String> {}

...

//object
@RedisHash(timeToLive = 60) 
public static class Test{
    @Id private String id;
    int age;
    List<String> friends;
}

...

//saving then retreiving
Test test = new Test("1", 15, Collections.emptyList());
System.out.println(test);
testRepository.save(test);

Test testGet = testRepository.findById("1").get();
System.out.println(testGet);
Run Code Online (Sandbox Code Playgroud)

发生的事情是这样的:

//before
{
  "id": "1",
  "age": 15,
  "friends": []
}

//after 
{
  "id": "1",
  "age": 15
}
Run Code Online (Sandbox Code Playgroud)

空列表friends消失了。这种新行为会在许多地方影响我们的代码,导致 NullPointerException 等。

显然,有多个可用的序列化器,但这似乎没有任何效果。任何想法? …

serialization lettuce spring-data-redis spring-boot

5
推荐指数
1
解决办法
1480
查看次数

为什么 spring-data-redis ZSetOperations 范围操作返回 Set 而不是 SortedSet?

ZSETs 用于在 redis 中存储排序集。我用于spring-data-redisZSetOperations。

所有范围方法都返回Set<>而不是SortedSet<>,我想知道其背后的原因是什么?

请参阅: https: //github.com/spring-projects/spring-data-redis/blob/master/src/main/java/org/springframework/data/redis/core/ZSetOperations.java#L207

另外,由于这些不返回排序集,所有反向范围操作是否都会变得多余,因为无论如何都不会维护顺序,并且我们不能只获取索引处的任何元素?

我可能会遗漏一些非常明显的东西,请原谅我在这件事上的天真。


我的用例:

我正在存储带有日期的值作为分数。我想获取两个日期之间的所有值,检查计数并使用最近的日期。

我本来打算做类似的事情:

// get reverse sorted values, with most recent date being on top 
SrotedSet<String> values = zSetOperations.rangeByScore(key, this.getBeginDate(), this.getEndDate());
// check values size and do values.get(0) i.e. the most recent date.
Run Code Online (Sandbox Code Playgroud)

但返回类型rangeByScoreSet,因此没有“get”操作。

  • 我必须获得分数范围,然后自己对它们进行排序。

  • 或者我必须转换为数组并获取元素。

  • 或者做类似的事情values.iterator().next()

java spring redis spring-data-redis zset

5
推荐指数
0
解决办法
1329
查看次数

如何在spring redis实体中使用复合键作为id,相当于@embedded id

我正在使用 Spring Data Redis 存储库来检索和持久化到 Redis 中。但我需要 id 由 2 个字段组成。如何才能实现这一目标?有没有相当于@EmbeddedId的方法?

java key composite redis spring-data-redis

5
推荐指数
0
解决办法
884
查看次数

无法连接Redis;嵌套异常是 io.lettuce.core.RedisConnectionException 使用 ReactiveRedisTemplate

我是反应式编程的新手。我需要连接到 Redis 来保存和获取一些数据。Redis 实例存在于云中。我使用 Lettuce Connection 工厂来建立连接。

与redis建立连接时,请求失败。这是我的 Redis 配置类:

package com.sap.slh.tax.attributes.determination.springwebfluxdemo.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.scheduling.annotation.EnableAsync;

import com.sap.slh.tax.attributes.determination.springwebfluxdemo.model.TaxDetails;
import com.sap.slh.tax.attributes.determination.springwebfluxdemo.model.TaxLine;
import com.sap.slh.tax.attributes.determination.springwebfluxdemo.util.JsonUtil;

@Configuration
@EnableAsync
public class RedisConfig {
    private static final Logger log = LoggerFactory.getLogger(RedisConfig.class);

    @Value("${vcap.services.redis.credentials.hostname:10.11.241.101}")
    private String host;

    @Value("${vcap.services.redis.credentials.port:36516}")
    private int port;

    @Value("$vcap.services.redis.credentials.password:123456788")
    private String password;

    @Bean
    public ReactiveRedisConnectionFactory reactiveRedisConnectionFactory() { …
Run Code Online (Sandbox Code Playgroud)

redis lettuce spring-data-redis reactive spring-data-redis-reactive

5
推荐指数
1
解决办法
9万
查看次数