redis
一、介绍
- redis是一个软件,用于在内存中存取数据(支持持久化);
- mysql是一个软件,用于在硬盘中存取数据
- 由于速度快:
(1)可作缓存,用于保存一些不常改变的数据
(2)临时数据
(3)消息队列
- 在服务器上安装redis(linux系统)
(1)包管理:yum install redis
(2)源码安装:
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0.6.tar.gz
cd redis-3.0.6
make
(3)运行: src/redis-server src/redis-server & 后台运行
- 安装python操作redis的模块(自己电脑)
在cmd中输入:pip3 install redis
二、redis基本操作
string操作,redis中的string在内存中按照一个name对应一个value来存储
(1)set 和get
- set(name,value,ex=None,px=None,nx=False,xx=False)
设置值时,默认,不存在则创建,存在则修改
ex:过期时间(秒)
px:过期时间(毫秒)
nx:如果设置为True,则只有name不存在时,当前set操作才执行
xx:如果设置为True,则只有name存在时,当前set操作才执行
- get(name) 获取值
例: conn = redis.Redis(host='192.168.11.85',port=6379) """ # conn.set('k1',"sdfsdf") # data = conn.get('k1') """
补充:
- setnx(name,value) 设置值,只有name不存在时,执行设置操作(添加)
- setex(name,value,time) 设置值,参数time,过期时间(数字秒或timedelta对象)
- mset(*args,**kwargs) 批量设置值 如:mset(k1='v1',k2='v2') 或 mget({'k1':'v1','k2':'v2'})
- mget(keys,*args) mget('ylr','wpq') 或 r.mget(['ylr','wpq'])
- getset(name,value) 设置新值并获取用来的值
- getrange(key,start,end)
获取子序列(根据字节获取,非字符)
参数:key,redis的name
start,起始位置(字节)
end,结束位置(字节) 如: "武沛齐" ,0-3表示 "武"
- setrange(name,offset,value)
修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
参数: offset,字符串的索引,字节(一个汉字三个字节)
value,要设置的值
(2)Hash操作,redis中Hash在内存中的存储格式如下图

hset(name,key,value)
- name对应hash中设置一个键值对(不存在,则创建;否则,修改)
- hsetnx(name,key,value)当name对应的hash中不存在当前key时则创建(相当于添加)
hmset(name,mapping)
- 在name对应的hash中批量设置键值对
- mapping,字典,{'k1':'v1','k2':'v2'}
hget(name,key)
- 在name对应的hash中根据key获取value
hmget(name,keys,*args)
- 在name对应的hash中获取多个key值
- keys,要获取key集合,['k1','k2']
- *args,要获取的key, k1,k2...
hgetall(name)
- 获取name对应的hash中键值对的个数
hscan_iter(name,match=None,count=None)
- 利用yield封装hscan创建生成器,实现分批去redis中获取数据
- match,匹配指定key,默认None表示所有key
- count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
例: import redis """ { k1:667, n1:{ k1:v1, k2:v2, k3:v3 }, n2:{ k1:v1, k2:v2, } } """ conn = redis.Redis(host='192.168.11.85',port=6379) # conn.hset('n1','k1','v1') # conn.hset('n1','k2','v2') # conn.hset('n1','k3','v3') # v1 = conn.hget('n1','k3') # print(v1) # # # conn.hmset('xx', {'k1':'v1', 'k2': 'v2','k3':'v3'}) # v2 = conn.hmget('xx', 'k1', 'k2') # v3 = conn.hmget('xx', ['k1', 'k2']) # # conn.hset('fullstack7','num',10) # conn.hincrby('fullstack7','num',amount=-5) # v1 = conn.hget('fullstack7','num') # print(v1) # data = conn.hgetall('n1') # print(data) # # data = conn.hscan_iter('n1',match="h*",count=2) # # 第一次,获取2个 # # 第二次,获取1个 # for item in data: # print(item) # conn.hset('n2','k1','v1') # conn.hset('n2','k2','v2') # conn.expire('n2',5) # v1 = conn.hgetall('n2') # print(v1) # PS: 做Session
三、redis优化
连接池:可以实现多个redis实例共享一个连接池,使用单例模式保持连接池永远使用一个
import redis pool = redis.ConnectionPool(host='192.168.11.85', port=6379,max_connections=50) conn = redis.Redis(connection_pool=pool)
# 使用方法(另一个py文件) conn.set('foo', 'Bar') print(conn.get('foo'))
四、django框架中redis的组件使用
from django.shortcuts import render,HttpResponse from utils.redis_pool import POOL #连接池 import redis import django_redis # redis.ConnectionPool.from_url() # POOL = redis.ConnectionPool(host='192.168.11.85', port=6379, max_connections=50) def test(request): conn = redis.Redis(connection_pool=POOL) conn = django_redis.get_redis_connection("default") conn.hset('shopping_car',request.user.id,{}) conn.hget() return HttpResponse('...')

浙公网安备 33010602011771号