[PYTHON] Zeichnen Sie die letzte Zugriffszeit des Benutzers mit Redis auf

Früher habe ich die letzte Zugriffszeit des Benutzers in der Datenbank aufgezeichnet, aber ich möchte sie häufig aktualisieren, aber es wird zu einem Engpass in der Datenbank, daher habe ich sie durch redis ersetzt.

Vorteil

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

Anwendungsbeispiel

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

Zeichnen Sie die letzte Zugriffszeit des Benutzers mit Redis auf
Django: User Agent aufzeichnen und mit Admin verwalten
Mongodb Zugang mit Pymongo
Ich habe versucht, mehrere Benutzer (Gewähren von Zugriffsrechten) mit ansible zu verwalten