一.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. LeetCode(三)

    最长不重复子串 public class Solution { public int lengthOfLongestSubstring(String s) { if(s==null || s.leng ...

  2. php 解析 视频 信息 封面 标题 图片 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视

    原文地址:http://www.lianyue.org/2013/2497/ <?php /** * 解析 视频信息 类 * * 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视 ** ...

  3. Swift 遍历数组元素

    ..<Array.count { Array[index] } for (index, element) in Array.enumerate() { print(("\(index+ ...

  4. centos下 redis安装配置及简单测试

    1:安装redis(使用的的环境是centos6.7 redis-2.6.14) 将redis-2.6.14.tar.gz文件拷贝到/usr/local/src 目录下 解压文件  tar zxvf ...

  5. tar 压缩去除目录

    tar zcvf fd.tar.gz  *  --exclude=file1 --exclude=dir1 注意: 1.yes: --exclude=file1 no: --exclude file1 ...

  6. 玩转React样式

    很久很久以前,就有人用CSS来时给HTML内容添加样式.CSS可以最大限度的分离样式和内容,选择器也可以很方便的给某些元素添加样式.你根本找不到任何不用CSS的理由. 但是在React这里就是另外一回 ...

  7. Activity之间的通信

    通常Activity之间的通信有三种方式:单向不传参数通信.单项传参数通信和双向通信. 这几种传递方式都需要通信使者Intent.以下将用代码来辅助理解. 1.单向不传递参数通信 public cla ...

  8. C常用数据类型长度

    1.整型数据类型 2.无符号整型数据类型 3.字符型数据类型 char  字节数  1: 4.浮点型数据类型

  9. 写在Python前

    Python是用C编写的一种解释型语言,和shell一样,变量可以直接使用,而且就像C中的宏替换,但是Python同样支持进行底层的调用,可以很容易的和各种语言进行融合,俗称"胶水语言&qu ...

  10. Asp.net中HttpRequest.Params与Reques.Item之异同

    今天才注意到HttpRequest.Params与HttpRequest.Item这两个玩意竟然有微妙的不同.上午的时候同事被坑了发现这玩意的说明还真微妙. 场景再现: 前台提交一个POST请求到后台 ...