Enregistrer le dernier accès de l'utilisateur avec Redis

J'avais l'habitude d'enregistrer le dernier temps d'accès de l'utilisateur dans DB, mais je veux le mettre à jour fréquemment, mais DB devient un goulot d'étranglement, donc je l'ai remplacé par redis.

avantage

lastaccess.py


from datetime import datetime

import pytz
import redis


class UserLastAccess(object):

    def __init__(self, user_id):
        self._user_id = user_id
        self._client = redis.StrictRedis()
        self._key = self.__class__.__name__

    @property
    def accessed_at(self):
        timestamp = self._client.zscore(self._key, self._user_id)
        if timestamp:
            d = datetime.fromtimestamp(int(timestamp))
            return pytz.timezone('Asia/Tokyo').normalize(pytz.utc.localize(d))

        return None

    def touch(self):
        now = pytz.utc.localize(datetime.utcnow())
        timestamp = now.strftime('%s')

        self._client.zadd(self._key, timestamp, self._user_id)

        return pytz.timezone('Asia/Tokyo').normalize(now)


class LastAccessedAtMixin(object):

    @property
    def user_last_access(self):
        return UserLastAccess(self.id)

    @property
    def last_accessed_at(self):
        return self.user_last_access.accessed_at

    def touch(self):
        return self.user_last_access.touch()


class User(LastAccessedAtMixin):

    def __init__(self, user_id):
        self.id = user_id

Exemple d'utilisation

ex


user = User('1000')
user.touch()  # => datetime.datetime(2014, 10, 6, 21, 55, 27, 654918, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
user.last_accessed_at  # => datetime.datetime(2014, 10, 6, 21, 55, 27, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)

Recommended Posts

Enregistrer le dernier accès de l'utilisateur avec Redis
Django: enregistrez l'agent utilisateur et gérez-le avec l'administrateur
accès mongodb avec pymongo
J'ai essayé de gérer plusieurs utilisateurs (octroi de droits d'accès) avec ansible