'''
pip install redis redis 可以看成内存中的大字典 redis五大数据类型 --> 指的是第一层的value值的类型
- 字符串 "k1"
- 列表 [11,22,33,11]
- 集合 {11,22,33}
- 字典 {
'kk1':vv1,
'kk2':vv2,
'kk3':{} 这个value不能是字典,如果有需要,则需要转换成字符串的形式。
}
- 有序集合 {('alex',4),('standby',3),('egon',9)}
''' import redis conn = redis.Redis(host='10.0.0.2',port=6379) # 字符串
conn.set('k1','v1',ex=10)
conn.get('k1') # 列表
# 可以当消息队列来使用
conn.lpush('users','alex')
conn.rpush('users','eric')
conn.lpop('users')
conn.rpop('users') # 双向队列,可以hang住,可以模拟栈和队列, 爬虫,爬网页-广度优先和深度优先
conn.blpop('users',timeout=10)
conn.brpop('users',timeout=10) conn.expire('key','超时时间') count = conn.llen('users')
print(count) vals = conn.lrange('users',0,10)
print(vals) # redis针对列表类型,没有提供 iter 方法,需要自己实现
def list_scan_iter(key):
# count = conn.llen(key)
start = 0
step = 3
while True:
vals = conn.lrange(key,start,start+step)
start = start + step + 1
if not vals:
return
for val in vals:
yield val result = list_scan_iter('users')
for item in result:
print(item) # 集合 # 哈希 # 有序结合

遍历DB

import redis

conn = redis.StrictRedis(host='8.8.8.8', port=6379, db=8, password='1234567890')

cursor_num, keys = conn.execute_command('scan', 0, "count", 100)

while True:
print keys
if 0==int(cursor_num):
break
cursor_num, keys = conn.execute_command('scan', cursor_num, "count", 100)

  

Django通过redis实现session共享示例

安装插件 Django 1.11 以上版本才可以使用

pip2.7 install django-redis

配置插件

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.10.10.10:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"PASSWORD": "your_password_for_redis",
}
}
}

使用redis

from django_redis import get_redis_connection
conn = get_redis_connection("default")

使用redis存储session信息

class UserAuth(object):
def __init__(self, request, response=None, user=None, autologin=None):
self.request = request
self.response = response
if user:
self.uid = str(user.id)
self.name = str(user.username)
self.autologin = autologin
self.sessionkey = None
self.logger = get_logger('UserAuth') def session_check(self):
self.sessionkey = self.request.COOKIES.get('yoursessionkey', None)
if self.sessionkey and conn.exists('yoursessionkey_%s' % self.sessionkey):
return conn.hget('yoursessionkey_%s' % self.sessionkey, 'userinfo')
return None def set_cookie_session(self):
self.sessionkey = self.request.COOKIES.get('yoursessionkey', None)
ttl = 60*60*24 if self.autologin else 60*60
if not self.sessionkey:
# set cookie
h = hashlib.md5()
h.update(str(int(time.time())))
self.sessionkey = h.hexdigest()
self.response.set_cookie('yoursessionkey', h.hexdigest(), max_age=ttl)
self.logger.error('New sessionid: {} for {}'.format(self.sessionkey,self.name)) key = 'yoursessionkey_%s' % self.sessionkey
if not conn.exists(key):
# set session
conn.hset(key, 'userinfo', '_'.join([self.name,self.uid]))
conn.expire(key,ttl)
self.logger.error('New redis key: {}, ttl: {}'.format(key,ttl))
return True

登录的视图函数

def verify(raw_password,encoded):
# 以PBKDF2PasswordHasher这个算法为例
from django.contrib.auth.hashers import PBKDF2PasswordHasher
hasher = PBKDF2PasswordHasher()
algorithm, iterations, salt, hash = encoded.split('$', 3)
encoded2 = hasher.encode(raw_password, salt, int(iterations))
return encoded == encoded2 class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
autologin = forms.BooleanField(required=False)
next = forms.CharField(widget=forms.HiddenInput) def user_login(request):
next = request.GET.get('next',reverse('index'))
if 'POST' == request.method:
form = LoginForm(request.POST)
if form.is_valid():
name = form.cleaned_data['username']
pwd = form.cleaned_data['password']
autologin = form.cleaned_data['autologin']
user = UserInfo.objects.filter(username=name)
if user[0] and verify(pwd,user[0].password):
response = redirect(next)
user_auth = UserAuth(request, response, user[0], autologin)
if user_auth.set_cookie_session():
user.update(last_login=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
return response
context = {'form':form,'errors':'用户名或密码错误'}
return render(request,'login.html',context)
else:
context = {'form':form,'errors':'用户名或密码不能为空'}
return render(request,'login.html',context)
form = LoginForm({'next':next})
context = {'form':form}
return render(request,'login.html',context)

登录验证中间件

import re
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings class UserAuthMiddleware(MiddlewareMixin):
def process_request(self,request):
# Set white list which not check login
current_request_url = request.path_info
for url in settings.VALID_URL_LIST:
if re.match(url, current_request_url):
return None
user_auth = UserAuth(request)
if user_auth.session_check():
return None
else:
import urllib
params = urllib.urlencode({'next':request.path_info})
return redirect('/userlogin' + "?" + params)

  

参考:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

redis基本操作的更多相关文章

  1. 三、Redis基本操作——List

    小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...

  2. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  3. 一、Redis基本操作——String(原理篇)

    小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...

  4. Redis基本操作-20150608

    Redis基本操作-20150608 [http://my.oschina.net/u/241255/blog/206991]   Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存 ...

  5. 【原】Redis基本操作

    Redis基本操作 遍历操作 Pub-Sub server Lua脚本 Redis中的这些操作都是不分大小写的. 除了针对于具体类型的具体操作.还有一些其他操作. 遍历操作 SCAN cursor [ ...

  6. Redis基本操作——List

    Redis基本操作——List(原理篇) 学习过数据结构的同学,一定对链表(Linked List)十分的熟悉.相信我们自己也曾经使用过这种数据结构. 链表分为很多种:单向链表,双向链表,循环链表,块 ...

  7. Redis基本操作-list

    Redis的5种数据结构:string.list.hash.set和zset; Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数 ...

  8. Redis基本操作-string

    Redis的5种数据结构:string.list.hash.set和zset; Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数 ...

  9. jedis使用线程池封装redis基本操作

    redisclient jedis 经常使用的 操作 key value hash list set zset 的基本操作 package cn.zto.util; import java.util. ...

  10. Redis 基本操作(一)

    redis和普通的Key-Value结构不同,Redis的Key支持灵活的数据结构,除了strings,还有hashes.lists. sets 和sorted sets等结构.正是这些灵活的数据结构 ...

随机推荐

  1. Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】

    联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...

  2. [CF1132E]Knapsack【暴力搜索】

    你有一个容量为\(w\)的背包,和\(8\)件物品,重量分别为\(1~8\)的整数,分别有\(cnt_1 ... cnt_8\),求最大容量. 解法 笨蛋chh一开始打了一个背包模板乱搞压缩容量\(j ...

  3. [JLOI2016/SHOI2016]侦察守卫(树形dp)

    小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树. 游戏中有一种道具叫做侦查守卫,当一名玩家在一个点 ...

  4. centos7安装mha4mysql

    mysql搭建mha需要用的两个rpm包.(manager包和node包) 下载地址:https://download.csdn.net/download/dajdajdajdaj/10603389 ...

  5. 算法练习:求字符串的最长重复子串(Java实现)

    1. 求字符串的最长重复子串 例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa 算法思路:算法时间复杂度(O(n)) 1. 将这一个字符串先转成cha ...

  6. Ubuntu下搜狗输入法无法输入中文

    现象:无法打出中文,但是有输入框.如下图所示情形: 解决方法 删除配置文件,重启fcitx 配置文件在~/.config下的3个文件夹里SogouPY.SogouPY.users.sogou-qimp ...

  7. AOP实践--利用MVC5 Filter实现登录状态判断

    AOP有的翻译"面向切面编程",有的是"面向方面编程".其实名字不重要,思想才是核心,mvc的Filter让我们很 方便达到这种面向方面编程,就是在现有代码的基 ...

  8. react-native中的props

    效果图 大多数组件在创建时就可以使用各种参数来进行定制.用于定制的这些参数就称为props(属性). 以常见的基础组件Image为例,在创建一个图片时,可以传入一个名为source的 prop 来指定 ...

  9. jQuery ajax 传递JSON数组到Spring Controller

    jQuery ajax传递单个JSON对象到后台很容易,这里记录的是传递多个JSON对象组成的JSON数组到java 后台,并说明java如何解析JSON数组. 1.js代码 var relation ...

  10. 团体程序设计天梯赛(CCCC) L3013 非常弹的球 不同思路

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code