一.Redis key相关操作:

1.del key [key..]

删除一个或多个key,如果不存在则忽略

2.keys pattern

keys模式匹配,符合glob风格通配符,glob风格的通配符规则:

? 匹配一个字符

  • 匹配任意个包括0个字符

[]匹配任一个字符,可以使用-表示一个范围

\x 匹配x,用于转义字符

如:keys * 查看所有key, keys *o* 查看包含o字符的key

KYES命令需要遍历redis中所有键,当键数量较多时会影响性能,因此不建议在生产中使用

3.exists key

检查key是否存在该DB中,存在返回1否则0

4.rename key newkey

rename更名,如果key与newkey相同或者key不存在则发生错误

5.type key

检查key类型,返回值有:none(不存在), string(字符串), list(数组), set(集合), zset(有序集合), hash(哈希)

其他

1.randomkey 数据库中随机返回一个key,若数据库为空则返回nil

2.TTL key 返回给定key的剩余生存时间(time to live),秒为单位,如果没有设置则返回-1

3.expire key seconds 设置key过期时间.

4.PERSIST key 移除给定key的过期时间

5.move key db 将key 移动到另一个数据库中,如果另一个db存在该同名key或者原db没有对应的key则move无任何效果.

二.Redis key 设计

Redis键值设计并没有一致性要求,对于复杂的key,一般使用冒号做分割符.较好的实践是:对象类型:对象ID:对象属性, 如:user:1:sex 处理成set user:1:sex 男 表示表user中id为1的用户性别设置男性.

对于多个单词推荐使用.分割.

对于上述key 的设计,在编程语言中如Python也很好处理:

>>> s = "user:1:sex"
>>> s.split(':')[2:]
['sex'] 

三.User表设计实现

一般一张User表包含以下字段: id,username,sex,is_active,is_admin,avatar,login_count,last_login_date 等.这里选择Redis实现并用Django完成登陆注册功能.

对于user表Redis Key的设计,我们有两种方案:

(1).user:1:username的形式

(2).user:1 username value hash类型的设计

能够使用hash尽量使用,它比String的效率会高很多!

这里选择hash类型在命令行下设置如下:

127.0.0.1:6379> hmset user:1 username BeginMan pwd root sex 1 is_active 1 is_admin 1 avatar http://beginman.sinaapp.com/site_media/img/my.jpg login_count 0
OK
127.0.0.1:6379> hgetall user:1
1) "username"
2) "BeginMan"
3)"pwd"
4)"root"
5) "sex"
6) "1"
7) "is_active"
8) "1"
9) "is_admin"
10) "1"
11) "avatar"
12) "http://beginman.sinaapp.com/site_media/img/my.jpg"
13) "login_count"
14) "0"

这里先设置了一个管理员用户,那么在django中相当于执行manage.py createsuperuser. 这里还有个字段last_login_date没有写入,KV(key-value)数据库不像关系型数据库那样必须保持一致性,在后期只要用户登陆过那么就设置该字段,同时login_count累加.

然后再定义一个表用来记录用户名对应的ID,如下:

127.0.0.1:6379> set "us:BeginMan:id" 1
OK

Django完成该登陆的流程:

(1).检查该用户是否存在Redis中

(2).匹配Redis,us,pwd,若匹配成功则跳转成功页面

登陆表单类:

class LoginForm(forms.Form):
    us = forms.CharField(label=u'用户名',max_length=100,widget=forms.TextInput(
            attrs={'class': 'form-control', 'placeholder': u'用户名', 'required': '', 'autofocus': ''}
        ),
    )
    pwd = forms.CharField(label=u'密码',widget=forms.PasswordInput(
            attrs={'class': 'form-control', 'placeholder': u'密码', 'required': ''}
        )
    )

view方法:

# coding=utf-8
__author__ = 'beginman'
from django.shortcuts import render
from django.http import HttpResponseRedirect
from form import LoginForm
import redis
import datetime
r = redis.StrictRedis(host='localhost', port='6379', db=0)

def home(request):
    return render(request, 'index.html')

def usLogin(request):
    context = {}
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            us = form.cleaned_data['us']
            pwd = form.cleaned_data['pwd']
            if r.exists('us:%s:id' %us):        # 检查是否存在该用户关系键值
                uid = r.get('us:%s:id' %us)     # 获取该用户在user表中对应的id
                if r.exists('user:%s' %uid):    # 检查是否存在该用户键值(如user:1)
                    us_, pwd_ = r.hmget('user:%s' %uid, 'username', 'pwd')  # 获取该用户的用户名密码
                    if us_ == us and pwd_ == pwd:   # 校验成功
                        r.hincrby('user:%s' %uid, 'login_count', 1)     # 登陆次数累加
                        r.hset('user:%s' %uid, 'last_login_date', datetime.datetime.now())  # 添加最近登陆
                        return HttpResponseRedirect('/')

        context['msg'] = u'账号或密码错误'
        context['form'] = form

    form = LoginForm()
    context['form'] = form
    return render(request, 'login.html', context)

登陆后我们在Redis中看看该记录:

127.0.0.1:6379> hgetall user:1
 1) "username"
 2) "BeginMan"
 3) "sex"
 4) "1"
 5) "is_active"
 6) "1"
 7) "is_admin"
 8) "1"
 9) "avatar"
10) "http://beginman.sinaapp.com/site_media/img/my.jpg"
11) "login_count"
12) "1"                           # 登陆次数+1
13) "pwd"
14) "root"
15) "last_login_date"   # 添加了登陆时间
16) "2014-08-01 10:26:47.711227"

Redis&Django实现blog平台该项目已经放置在github.

四.参考资料

1.Redis 键

Redis & Python/Django 简单用户登陆的更多相关文章

  1. python django简单的登陆实现

    实现方法: 1,可以先定义一个基础的页面访问路径 例如:http://127.0.0.1:8000/index/  定义index路径 在urls urlpatterns = [ url(r'^ind ...

  2. python实现简单的登陆认证(含简单的文件操作)

    需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(本 ...

  3. [作业] Python入门基础--用户登陆

    让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定登陆 #__author:Mifen #date: 2018/11/28 import time #自定义本地用户名和密码 user_nam ...

  4. 自动化测试(二)如何用python写一个用户登陆功能

    需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...

  5. Python - Django - 简单分页的实现

    models.py: from django.db import models class Book(models.Model): title = models.CharField(max_lengt ...

  6. python django简单操作

    准备: pip3 install  django==1.10.3 cmd django-admin startproject  guest  创建一个guest的项目 cd guest manage. ...

  7. python django 简单接口测试页面

    项目创建订单只能是接口创建的,之前都是用jar包放到jmeter里调用下单,给产品或者运维用不太方便,就想用django写一个带前端界面的下单web程序 项目结构 代码,比较渣 # coding=ut ...

  8. Python实现简单登陆验证(文件操作)

    利用python编写一个简单的登陆验证 代码主要功能: 利用Python实现简单的登陆验证,代码主要有两个部分组成: 第一部分:登陆页面,作用是实现用户名和密码的输入 利用两个输入函数input()来 ...

  9. Django的用户认证

    Django中用户登陆的实例: 逻辑流程 1.客户端发起请求,根据url规则会首先转至index函数, 2.在index函数上添加一个装饰器('@login_required',django自带).加 ...

随机推荐

  1. Two Sum & Add Two Numbers

    Two Sum 题目:https://leetcode.com/problems/two-sum/ class Solution(object): def twoSum(self, nums, tar ...

  2. MVC 路由模块内核原理

    .net网站第一次运行的时候 执行global文件的application_start方法 注册路由信息   RouteConfig.RegisterRoutes(RouteTable.Routes) ...

  3. upgrade-php-5-1-to-php-5-3-using-yum-on-centos

    wget -q -O - http://www.atomicorp.com/installers/atomic | shyum upgrade phpyum -y remove atomic-rele ...

  4. [转载]tail No space left on device

    转载http://www.chenxie.org/?p=717 # tail -f ../logs/catalina.outtail: cannot watch `../logs/catalina.o ...

  5. Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个 ...

  6. App开发的过程

    直播App开发的过程 第一步:分解直播App的功能,我们以X客为例 视频直播功能,这是一款直播App最主要的功能,要能支持视频直播RTMP推流,使画面传输流畅.清晰(美颜后的清晰,你懂的聊天功能,用户 ...

  7. java堆内存与栈内存

    java的内存分为两种,堆内存与栈内存: 堆内存用来存放数组和new的对象,比如一个文件,字节流是存放在堆中,栈内存为这个文件开辟一个索引,也就是这个文件的地址,并且保存在栈中.对象由GC处理释放内存 ...

  8. 【原】java环境变量配置&& jdk配置 && 各配置的意义

    本配置需要新建JAVA_HOME和classpath两个: JAVA_HOME 指明JDK安装路径.(在安装好java之后就该配置) classpath 为java加载类(class or lib)路 ...

  9. sqlplus实现上下翻页设置

    环境: 操作系统:red hat 5.8 OS 数据库:oracle 11g 11.2.0.1 安装软件:IO-Tty-1.07.tar. Term-ReadLine-Gnu-1.16.tar.uni ...

  10. LINUX RHEL AS 4 + ORACLE10G安装详解

    第一部分:LINUX RHEL AS 4 安装 运行提示: 1)按键盘的前后键可以调节光标所在的位置 2)在选项前面的括号中打上*号或者去掉*号,选中这条选项用空格键操作 3)在vi编辑文件时,键盘按 ...