用于django.contrib.sessions的基于redis的django会话引擎。
django-redisession的Python项目详细描述
用于django.contrib.sessions的基于redis的django会话引擎。
此引擎支持将会话数据存储为redis字符串,或将会话分发到redis散列以更有效地使用redis存储(redis服务器上没有太多额外的cpu开销)。refs http://antirez.com/post/redis-weekly-update-7.html和http://redis.io/topics/memory-optimization,您可能需要调整redis conf以供实际使用。该技术在下面称为散列模式)。
安装
- 需要django版本>;=1.3
- pip install django-redisession或在源python setup.py install中。
- 将redisession添加到当前设置文件中已安装的应用程序。
- 在设置文件中设置SESSION_ENGINE='redisession.backend'。
配置
- django重新发布的配置选项可以放在dictREDIS_SESSION_CONFIG:
- SERVER–如果设置为dict,则该值将用作redis.redis()的参数,以生成redis连接实例。如果设置为一个字符串,那么Django将得到一个用于查找现有连接实例中的值,如下所示。
- USE_HASH–如果设置为true(散列模式),django重新会话将把会话存储为redis散列的项。HASH_KEY_GENERATOR将用于生成相应的redis密钥。如果设置为false,会话的数据将存储为由KEY_GENERATOR生成的redis键的redis字符串值。MD5生成的会话密钥的分发不如SHA1生成的会话密钥,但仍然可以接受。
- KEY_GENERATOR–在哈希模式下为会话生成redis密钥或redis哈希字段名的调用。callable接受session_key作为唯一参数。默认值从会话密钥(通常是十六进制字符串)生成二进制字符串,MD5为16字节。注意如果您正在自定义它,请打开LOG_KEY_ERROR,然后运行测试./manage.py test redisession,以“确保”KEY_GENERATOR与会话密钥一起工作。对于传入的django 1.5中包含“0-9a-z”的会话密钥,可以在redisession/backend.py中检查注释。
- HASH_KEY_GENERATOR–在哈希模式下,为redis散列生成redis密钥的可调用项。默认值使用会话密钥二进制字符串的前两个字节,因此将会话分发到65536哈希。其他调度逻辑或密钥前缀可以通过自定义此选项来实现。注意如果您正在自定义它,请打开LOG_KEY_ERROR,然后运行测试./manage.py test redisession,以“确保”HASH_KEY_GENERATOR与会话密钥一起工作。对于传入的django 1.5中包含“0-9a-z”的会话密钥,可以在redisession/backend.py中检查注释。
- HASH_KEYS_CHECK_FOR_EXPIRY–可以在哈希模式下生成redis密钥以检查是否删除过期会话。callable接受redis连接实例作为参数。默认值将redis.randomKey应用100次以采样关键点。
- COMPRESS_LIB–用于压缩会话数据的压缩库的模块名,留空可禁用压缩。默认为'snappy',refssnappy和python-snappy。压缩库应该支持压缩和解压缩,如zlib、lzo等。一个慢的库可能具有更高的压缩比,这意味着web服务器上的负载更高,但在与redis通信时IO更少。所以你要权衡一下。
- COMPRESS_MIN_LENGTH–要尝试压缩的会话数据的最小长度。默认为400。
- LOG_KEY_ERROR–日志键错误是由错误键引起的还是由配置错误引起的HASH_KEY_GENERATOR还是KEY_GENERATOR。默认为false。
示例:
# default: distributes sessions to 65536 Redis Hashes, # use binary string form of session_key, # applys Redis.randomkey 100 times to sample hash keys # to check for deleting expired session, # try to compress data (length >= 400) by using snappy. REDIS_SESSION_CONFIG = { 'SERVER': {}, 'USE_HASH': True, 'KEY_GENERATOR': lambda x: x.decode('hex'), 'HASH_KEY_GENERATOR': lambda x: x[:4].decode('hex'), 'HASH_KEYS_CHECK_FOR_EXPIRY': lambda r: (reduce(lambda p,y :p.randomkey(), xrange(100), r.pipeline()).execute()), 'COMPRESS_LIB': 'snappy', 'COMPRESS_MIN_LENGTH': 400, 'LOG_KEY_ERROR': False }
# use session thru Redis get/set. store session key just as it is, hex string. REDIS_SESSION_CONFIG = { 'USE_HASH': False, 'KEY_GENERATOR': lambda x: x }
# almost as above, but add key prefix 's:' for Redis keys REDIS_SESSION_CONFIG = { 'USE_HASH': False, 'KEY_GENERATOR': lambda x: 's:'+x }
# use Redis connection instance through redisession.helper.get_redis # here django-redisession will try to use Redis connection instance 'foo' REDIS_SESSION_CONFIG = { 'SERVER': 'foo' } # see following REDIS_CONFIG = { 'default': {'db':1}, 'foo': {'db':2, unix_socket_path='/tmp/bar'} }
# Here are some other possible settings of 'HASH_KEYS_CHECK_FOR_EXPIRY' # Fetching and scaning ALL keys and ALL of their fields. Use with caution. lambda r: r.keys() # Sampling 100 hash keys out of 65536 possible slots. # This is useful if the number of actually used slots is closer to 65536. lambda r: (map(lambda x:('%04x'%x).decode('hex'), random.sample(xrange(65536), 100)))
可以使用redisession.helper.get_redis按名称创建和获取全局redis连接实例。首先,在设置文件中设置REDIS_CONFIG,这类似于django中的dbs设置。例如:
REDIS_CONFIG = { # 'name': arguments passed to redis.Redis to build a connection instance, as dict items 'default': {'port':63790, 'db':1}, 'foo': {'db':2, unix_socket_path='/tmp/bar'}, 'session': {'db':3}, }
然后
>>> from redisession.helper import get_redis >>> r = get_redis() # get Redis connection instance of name 'default' >>> r = get_redis('foo') # or of name 'foo' >>> r = get_redis('session') # use db 3 for sessions only >>> r.info()
安全性
建议将存储会话的redis服务器与其他用途隔离。 你可以通过使用一个单独的数据库来实现,比如上面redis配置中的conf'session', 或者在密钥生成器中指定唯一的密钥前缀。 有关可能的安全问题,请参阅https://www.djangoproject.com/weblog/2011/sep/09/security-releases-issued/ 以及https://code.djangoproject.com/changeset/16759
以哈希模式清除过期会话
run django command ^{tt29}$ in shell or cronjob.
测试
^{tt30}$. It uses your REDIS_SESSION_CONFIG settings for tests, so corresponding Redis server should be available.