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('...')

 

posted @ 2018-03-21 17:16  星雨5213  阅读(77)  评论(0)    收藏  举报