一.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. CentOS 6.3 安装 phpmyadmin

    安装phpMyAdminphpMyAdmin是一个网络接口,通过它可以管理你的MySQL数据库.首先,我们使CentOS系统RPMForge软件库的phpMyAdmin,而不是官方的CentOS 6. ...

  2. Ubuntu遇到Please ensure that adb is correctly located at '...adb.exe' and can be executed 问题解决方法

    上次我们在SDK更新的到最新的Android L版本之后,我发现我的ADT和android指定的版本不对应,我的ADT是22版本的,android L需要23版本以上的,版本不对应的话就无法加载这个S ...

  3. [MOSEK] Mosek求解中遇到的奇葩内存问题

    在使用mosek优化库的时候,使用http://docs.mosek.com/7.0/capi/MSK_getxx_.html的 MSKrescodee MSK_getxx ( MSKtask_t t ...

  4. Centos7 mysql-community-5.7.11编译安装

    安装环境 [root@localhost ~]# cat /etc/centos-release CentOS Linux release 7.0.1406 (Core) 0x01 准备工作 1.到m ...

  5. unreal3对象属性自动从配置文件中加载的机制

    unrealscript中有两个与属性自动配置相关的关键字: config/globalconfig 当把它们应用于属性时,对象在创建后,该属性的初始值会被自动设置为相对应ini文件中的值. 举例来说 ...

  6. Having关键字

    Having关键字:用于对整组整组地过滤(对比,where仅仅是一行一行地过滤.) 查询每个住址各住多少人? 查询住址的会员人数超过2人的住址. 注意,出现顺序where>group by> ...

  7. Eclipse安装配置以及java项目和类的创建

    1.Eclipse的安装: 双击此应用程序 进入安装界面 选择下一步 更改路径将此默认路径改为 确定之后下一步更改jre的安装路径 在之前安装的java文件夹下新建一个jre文件夹 将jre安装在里边 ...

  8. Android 6.0 新功能及主要 API 变更

    运行时权限 这个版本中引入了新的权限模型,现在用户可以在运行时直接管理应用程序的权限.这个模型基于用户对权限控制的更多可见性,同时为应用程序的开发者提供更流畅的应用安装和自动升级.用户可以为已安装的每 ...

  9. ubuntu 14.04加入五笔输入法

    快捷键"ctrl+AIt+T",弹出终端,输入以下指令 //先卸载IBUS输入法 killall ibus-daemon sudo apt- get purge ibus ibus ...

  10. 高效快捷解决一个TextView显示多种字体的控件SpannableTextView

    这个控件本人强烈推荐,它会使得布局非常的简单且高效: 下面这个布局如果是你,你会用多少层?多少控件生成? 告诉你吧,一个SpannableTextView控件就搞定了! 它把TextView和Span ...