我的问题是,在分布式Web应用程序中,可以使用Redis Store获取有效会话RedisOperationSessionRepository.(我的意思是我不想编写显式代码将其放入Redis存储区然后再读取它,我想了解框架或spring-data-redis库是否提供了这一点).
我知道Spring Redis能够恢复会话和服务器重启,如果会话仍然有效,也会保留登录(因为它由Redis支持)
我正在寻找的功能之一是获取当前在应用程序中的所有可能的登录用户.我知道SessionRegistryImpl,这个方法.但我注意到Redis不支持此方法,并且在服务器重新启动后,不会返回登录用户.
public List<Object> getAllPrincipals() {
return new ArrayList<Object>(principals.keySet());
}
Run Code Online (Sandbox Code Playgroud)
我可以尝试的功能之一是Spring Session 1.1.0,Spring会话用户名查找.
我试过,它确实返回了我有效的会话结果,但问题是我仍然需要知道使用此应用程序的所有当前有效用户名.(我不知道如何使用Redis Store获取它们,我再次可以存储在Redis中并获取它们,但我想知道是否有更好的方法).
这是一段代码,如果我知道会话ID,这是我可以从当前使用该系统的众多用户之一获得当前用户的方式.
final Session session = redisOperationsSessionRepository.getSession(sessionid);
final Object obj = session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
if (obj instanceof SecurityContext) {
final SecurityContext context = (SecurityContext) obj;
final Authentication authentication = context.getAuthentication();
if (authentication != null) {
final Object principal = authentication.getPrincipal();
if (principal != null && principal instanceof CurrentUser) {
return (CurrentUser) principal;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用上面的逻辑来获取所有当前用户,但是我应该再次使用所有有效的会话ID,我不知道如何从Redis商店获取.
新更新: …
我正在使用Spring Data Repository保存新条目.每个条目我的TTL为10秒.
当我保存带索引的条目时,这是我在Redis中得到的
127.0.0.1:6379> keys *
1) "job:campaignId:aa"
2) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be"
3) "job:recipient:dd"
4) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be:phantom"
5) "job:listId:cc"
6) "job:accountId:bb"
7) "job"
8) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be:idx"
Run Code Online (Sandbox Code Playgroud)
到期后,我仍然有数据:
127.0.0.1:6379> keys *
1) "job:campaignId:aa"
2) "job:recipient:dd"
3) "job:listId:cc"
4) "job:accountId:bb"
5) "job"
6) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be:idx"
Run Code Online (Sandbox Code Playgroud)
没有任何TTL.
他们为什么不删除自己?我怎么能这样做?
我已经看到几个线程中的答案,但没有为我工作,因为偶尔会出现问题,如果有任何人有任何想法,请问这个问题.
我使用的是jedis版本2.8.0,Spring Data redis版本1.7.5.和我们的缓存应用程序的redis服务器版本2.8.4.
我有多个缓存,用redis保存,get请求是从redis完成的.我使用spring数据redis API来保存和获取数据.
所有保存和获取工作正常,但偶尔低于例外:
Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool | org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolorg.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:198)
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:345)
org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:129)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:92)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:79)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:191)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:166)
org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:88)
org.springframework.data.redis.core.DefaultHashOperations.get(DefaultHashOperations.java:49)
Run Code Online (Sandbox Code Playgroud)
我的redis配置类:
@Configuration
public class RedisConfiguration {
@Value("${redisCentralCachingURL}")
private String redisHost;
@Value("${redisCentralCachingPort}")
private int redisPort; …Run Code Online (Sandbox Code Playgroud) 我试图在spring-boot应用程序中使用spring-data-redis来处理redis.我创建JedisConnectionFactory如下:
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName("localhost");
configuration.setPort(6379);
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(configuration);
Run Code Online (Sandbox Code Playgroud)
它抛出了异常:
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute(Ljava/lang/String;)Ljava/util/Optional;
at org.springframework.data.redis.repository.configuration.RedisRepositoryConfigurationExtension.registerBeansForRoot(RedisRepositoryConfigurationExtension.java:88)
at org.springframework.data.repository.config.RepositoryConfigurationDelegate.registerRepositoriesIn(RepositoryConfigurationDelegate.java:118)
at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.registerBeanDefinitions(AbstractRepositoryConfigurationSourceSupport.java:59)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:352)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:143)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:336)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:246)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:270)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:524)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
at com.test.redis.RedisTesterApplication.main(RedisTesterApplication.java:11)
Run Code Online (Sandbox Code Playgroud)
我的build.gradle:
dependencies {
compile('org.springframework.data:spring-data-redis:2.0.2.RELEASE')
compile('redis.clients:jedis:2.9.0')
compile('org.json:json:20160810')
compile('org.springframework.boot:spring-boot-starter:1.4.2.RELEASE')
compile("org.springframework:spring-web")
compile('org.slf4j:slf4j-api:+')
}
Run Code Online (Sandbox Code Playgroud)
是因为spring-boot和spring-data-redis的不兼容的依赖版本?我怎么知道要使用哪个版本?
我有一组看起来像这样的缓存方法:
@Cacheable(value = "myCacheName", keyGenerator = "myKeyGenerator")
public Product getProduct(ProductRequest request) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我需要为这些方法返回的对象设置不同的生存时间(有效期)。
问题:根据文档,提供的方法是在方法的返回类型上使用@RedisHash(timeToLive=…?)或@TimeToLive批注。但是,我不想使用与缓存相关的逻辑来污染我的域类。另外,我的某些方法返回的字符串或无法修改的类的对象。我希望以更可配置的方式实现它。还有一个名为的配置属性spring.cache.redis.time-to-live,但是它在所有地方都应用相同的生存时间。
问题:是否可以在方法级别指定生存/失效时间间隔?或一般来说,如何以更优雅的方式实现它?
我已经集群了 redis 并尝试使用 redisTemplate 在其中插入数据。当它到达试图放置数据的行时,我收到以下错误。“redis.clients.jedis.exceptions.JedisMovedDataException:MOVED”org.springframework.data.redis.ClusterRedirectException:重定向:插槽7319到IP地址:6379。嵌套异常是 redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 7319 IP 地址:6379
任何想法?redisConnectionFactory bean 中的 hostName 是集群的配置端点。
return items -> {
HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();
items.forEach(item -> {
hashOps.put((item.getProgramName()), item.getProgramName(), item.toJson().toString());
});
};
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
redisConnectionFactory.setHostName(hostName);
redisConnectionFactory.setPort(port);
return redisConnectionFactory;
}
@Bean(name = "redisTemplate")
public RedisTemplate<String, String> redisTemplate() {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setDefaultSerializer(new StringRedisSerializer());
return redisTemplate;
}
Run Code Online (Sandbox Code Playgroud) 我们正在从 spring boot 版本 1.5.2 升级到 2.0.0。我发现 spring data redis 默认使用生菜,不需要连接池管理,只使用单个底层 tcp 连接。我们还使用 ConcurrentMetadatStore 来执行像 putIfAbsent 这样的原子/阻塞操作。在没有连接池的情况下使用自动配置的 LettuseConnectionFactory 或配置 LettuceConnectionFactory 以使用池是否可以?
我在 spring boot 2.0 中使用 redis。
我希望将存储在 redis 中的数据设置为 TTL。
于是找了个办法,写了下面的示例代码。
人.java
@Data
@Builder
@RedisHash("Person")
public class Person implements Serializable {
@Id
private Long id;
private PersonInfo info;
}
Run Code Online (Sandbox Code Playgroud)
个人信息.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PersonInfo implements Serializable {
private String name;
private Long age;
}
Run Code Online (Sandbox Code Playgroud)
RedisConfig.java
@Configuration
@Slf4j
public class RedisConfig extends CachingConfigurerSupport {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Value("${spring.redis.expiretime}")
private Long expireTime;
@Bean
public LettuceConnectionFactory lettuceConnectionFactory() {
log.info("Info -> Lettuce Connection Factory");
LettuceConnectionFactory lettuceConnectionFactory …Run Code Online (Sandbox Code Playgroud) 在我们的Spring 4项目中,我们希望有涉及Redis和Hibernate的数据库事务.每当Hibernate失败时,例如由于乐观锁定,Redis事务也应该中止.
这似乎有用
一旦事务包含多个Redis调用,并且Hibernate配置为参与事务,连接绑定和多线程似乎就会出现问题.线程被卡住RedisConnectionUtils.bindConnection(),可能是因为JedisPool连接耗尽.
这可以如下再现.
@Service
public class TransactionalService {
@Autowired
@Qualifier("redisTemplate")
private RedisTemplate<String, Object> redisTemplate;
@Transactional
public void processTask(int i){
redisTemplate.convertAndSend("testChannel", new Message());
redisTemplate.convertAndSend("testChannel", new Message());
}
}
Run Code Online (Sandbox Code Playgroud)
我们使用ThreadPoolTaskExecutor核心池大小为50来模拟多线程事务.
@Service
public class TaskRunnerService {
@Autowired
private TaskExecutor taskExecutor;
@Autowired
private TransactionalService transactionalService;
public void runTasks() {
for (int i = 0; i < 100; i++) {
final int j = i;
taskExecutor.execute(new Runnable() {
@Override
public void run() {
transactionalService.processTask(j); …Run Code Online (Sandbox Code Playgroud) multithreading transactions redis spring-data spring-data-redis
我的弹簧启动项目配置如下.
@SpringBootApplication
@EnableTransactionManagement
@EnableCaching
@EnableScheduling
@EnableAsync
public class Application {
String redisHost = "localhost";
int redisPort = 6379;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(redisHost);
factory.setPort(redisPort);
factory.setUsePool(true);
return factory;
}
@Bean
RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
@Bean
public CacheManager cacheManager() {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate());
return cacheManager;
}
}
Run Code Online (Sandbox Code Playgroud)
我也跟随maven对pom的依赖.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我在定义端口上的本地计算机上运行了一个单独的redis服务器.另外在我的服务类中,我有@Cacheable,@ CachePut等注释来支持缓存.
我可以毫无错误地启动Spring启动应用程序,并且CRUD操作也可以.但似乎它没有使用定义的redis缓存.我使用'redi …
redis ×7
spring-boot ×4
java ×3
spring ×3
spring-data ×3
jedis ×2
lettuce ×1
spring-cache ×1
transactions ×1