Class RedisSessionStore

  • All Implemented Interfaces:
    io.lettuce.core.pubsub.RedisPubSubListener<java.lang.String,​java.lang.String>, io.micronaut.session.SessionStore<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>, java.lang.AutoCloseable

    @Singleton
    @Primary
    @Requires(property="micronaut.session.http.redis.enabled",
              value="true")
    @Replaces(io.micronaut.session.InMemorySessionStore.class)
    public class RedisSessionStore
    extends io.lettuce.core.pubsub.RedisPubSubAdapter<java.lang.String,​java.lang.String>
    implements io.micronaut.session.SessionStore<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>, java.lang.AutoCloseable

    An implementation of the SessionStore interface for Redis. Partially inspired by Spring Session.

    Session serialization

    Sessions are stored within Redis hashes. The values contained within the sessions are serialized by the ObjectSerializer configured by RedisHttpSessionConfiguration.getValueSerializer() which by default uses Java serialization. The Jackson Micronaut module includes the ability the configure JSON serialization as an alternative.

    Storage Details

    Sessions are stored within Redis hashes by default prefixed with micronaut:session:sessions:[SESSION_ID]. The expiry of the hash is set to 5 minutes after the actual expiry and expired sessions are simply not returned by findSession(String)

    More exact session expiry entries are stored with keys micronaut:session:expiry:[SESSION_ID] and current active sessions are tracked within sorted set at the key micronaut:session:active-sessions. The entries within the set are sorted by expiry time and a scheduled job that runs every minute periodically touches the keys within the set that match the last minute thus ensuring Redis propagates expiry events in a timely manner.

    Redis Pub/Sub

    This implementation requires the Redis instance to have keyspace event notification enabled with notify-keyspace-events Egx. The implementation will attempt to enable this programmatically. This behaviour can be disabled with RedisHttpSessionConfiguration.isEnableKeyspaceEvents()

    Since:
    1.0
    • Constructor Summary

      Constructors 
      Constructor Description
      RedisSessionStore​(io.micronaut.session.SessionIdGenerator sessionIdGenerator, RedisHttpSessionConfiguration sessionConfiguration, io.micronaut.context.BeanLocator beanLocator, io.micronaut.core.serialize.ObjectSerializer defaultSerializer, java.util.concurrent.ExecutorService scheduledExecutorService, io.micronaut.context.event.ApplicationEventPublisher eventPublisher)
      Constructor.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void close()  
      java.util.concurrent.CompletableFuture<java.lang.Boolean> deleteSession​(java.lang.String id)  
      java.util.concurrent.CompletableFuture<java.util.Optional<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>> findSession​(java.lang.String id)  
      io.micronaut.core.serialize.ObjectSerializer getValueSerializer()
      Getter.
      void message​(java.lang.String channel, java.lang.String message)  
      void message​(java.lang.String pattern, java.lang.String channel, java.lang.String message)  
      io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession newSession()  
      java.util.concurrent.CompletableFuture<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession> save​(io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession session)  
      • Methods inherited from class io.lettuce.core.pubsub.RedisPubSubAdapter

        psubscribed, punsubscribed, subscribed, unsubscribed
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • REDIS_SESSION_ENABLED

        public static final java.lang.String REDIS_SESSION_ENABLED
        See Also:
        Constant Field Values
    • Constructor Detail

      • RedisSessionStore

        public RedisSessionStore​(io.micronaut.session.SessionIdGenerator sessionIdGenerator,
                                 RedisHttpSessionConfiguration sessionConfiguration,
                                 io.micronaut.context.BeanLocator beanLocator,
                                 io.micronaut.core.serialize.ObjectSerializer defaultSerializer,
                                 @Named("scheduled")
                                 java.util.concurrent.ExecutorService scheduledExecutorService,
                                 io.micronaut.context.event.ApplicationEventPublisher eventPublisher)
        Constructor.
        Parameters:
        sessionIdGenerator - sessionIdGenerator
        sessionConfiguration - sessionConfiguration
        beanLocator - beanLocator
        defaultSerializer - The default value serializer
        scheduledExecutorService - scheduledExecutorService
        eventPublisher - eventPublisher
    • Method Detail

      • getValueSerializer

        public io.micronaut.core.serialize.ObjectSerializer getValueSerializer()
        Getter.
        Returns:
        ObjectSerializer
      • message

        public void message​(java.lang.String channel,
                            java.lang.String message)
        Specified by:
        message in interface io.lettuce.core.pubsub.RedisPubSubListener<java.lang.String,​java.lang.String>
        Overrides:
        message in class io.lettuce.core.pubsub.RedisPubSubAdapter<java.lang.String,​java.lang.String>
      • message

        public void message​(java.lang.String pattern,
                            java.lang.String channel,
                            java.lang.String message)
        Specified by:
        message in interface io.lettuce.core.pubsub.RedisPubSubListener<java.lang.String,​java.lang.String>
        Overrides:
        message in class io.lettuce.core.pubsub.RedisPubSubAdapter<java.lang.String,​java.lang.String>
      • newSession

        public io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession newSession()
        Specified by:
        newSession in interface io.micronaut.session.SessionStore<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>
      • findSession

        public java.util.concurrent.CompletableFuture<java.util.Optional<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>> findSession​(java.lang.String id)
        Specified by:
        findSession in interface io.micronaut.session.SessionStore<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>
      • deleteSession

        public java.util.concurrent.CompletableFuture<java.lang.Boolean> deleteSession​(java.lang.String id)
        Specified by:
        deleteSession in interface io.micronaut.session.SessionStore<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>
      • save

        public java.util.concurrent.CompletableFuture<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession> save​(io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession session)
        Specified by:
        save in interface io.micronaut.session.SessionStore<io.micronaut.configuration.lettuce.session.RedisSessionStore.RedisSession>
      • close

        @PreDestroy
        public void close()
        Specified by:
        close in interface java.lang.AutoCloseable