django中使用redis

一. django 中使用 redis

方式一: 直接使用

通用方式 : 在其他框架中也可以使用

eg :一个页面被访问了多少次

import redis

# 创建连接池
pool = redis.ConnectionPool(max_connections=200, host='127.0.0.1', port=6379)

def text(request):
    # 使用连接池
    conn = redis.Redis(connection_pool=pool)

    # 每访问一次,数量加一
    # “ incr ” :redis的一个方法,调用一次,page_view 的 vulue 就会 +1
    conn.incr('page_view')
    res = conn.get('page_view')
    return HttpResponse(f'当前页面被看了{str(res, encoding="utf-8")}次', )

方式二: 模块

  1. 下载:
pip install django-redis
  1. 配置:文件配置中配置
CACHES = {
    # default 名字随意
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},

            # """ 后续还有会用户名,密码 等相关配置""""
        }
    }
}
  1. 使用:
# 导入 get_redis_connection
from django_redis import get_redis_connection

def text(request):
    # 每次从池中取一个链接
    conn = get_redis_connection(alias="default")
    conn.incr('page_view')
    res = conn.get('page_view')
    return HttpResponse(f'当前页面被看了{str(res, encoding="utf-8")}次', )

方式三(与django缓存结合)

  1. 配置
CACHES = {
    # default 名字随意
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},

            # """ 后续还有会用户名,密码 等相关配置""""
        }
    }
}
  1. 使用

(1):cache.set() 设置的 value 可以是任意类型, 因此比较好用
(2):底层用 pickle 实现的

class Student(object):                                 # 定义一个类
    name = "张三"
    age = 18

stu = Student()                                        # 实例化一个对象

from django.core.cache import cache

def text(request):
    # cache.set("pv", stu)
    res = cache.get("pv")
    print(res.name, res.age)
    return HttpResponse("ok")

二. redis 使用

1. 字符串

import redis
conn = redis.Redis()

res = conn.方法名(...参数)
print(res)

(1). 设置值

set

# key : key
# value : value
# ex : 过期时间(秒)
# px : 过期时间(毫秒)
# nx : 为 True 时,name 不存在时,才可以设置。value 存在时,不修改不设置。
# xx : 为 True 时,name 存在时,才可以设置,value 存在时则修改。value 不存在,不会设置新值。
set(key, value, ex=None, px=None, nx=False, xx=False)

setex:设置过期时间, 过期时间秒

setex(key, value, time)

psetex:设置过期时间, 过期时间毫秒

psetex(key, time_ms, value)

setnx

setnx(key, value)
# 等同于
set('name','666',nx=True)

mset:批量设置

mset(*args, **kwargs)

# eg:
mset({'name': 'xxx', 'age': 19, 'height': 183, 'weight': 140})

getset:获取值然后设置新值, value 新值。

getset('key','value')

setrange

# offset 偏移量
setrange(key, offset, value)

(2). 获取值

get:单个获取

get(key)

mget:批量获取

get(keys, *args)

# eg:
conn.mget('name','age')
conn.mget(['name','hobby','height'])

getrange:获取起始和结束位置的字符串, 前闭后闭, 取字节

getrange(key, start, end)

(3). 其他

# 统计字节长度
strlen(key)

# 自增
# num 一次增加的个数
incr(key)
incrby(key, num)
incrbyfloat(key)

# 自减
decr(key)
decrby(key, num)

# 追加
append(key, value)

# 关闭
close()

(4). 操作比特位

setbit(key, offset, value)
getbit(key, offset)
bitcount(key, start=None, end=None)
bitop(operation, dest, *keys)

2. hash

import redis
conn = redis.Redis(decode_responses=True)

res = conn.方法名(...参数)
print(res)

(1)设置值

hset:设置单个

hset(name, key, value)

hmset:设置多个

hmset(name, mapping)

# eg:
hmset('user-info-02',mapping={'name':'zhangsan','age':18})
后面的版本可能如下:
hset('user-info-02',mapping={'name':'zhangsan','age':18})

(2)获取值

hget:获取单个

hget(name,key)

# eg:
hset('user-info-01','name','lqz')
hset('user-info-01','age',19)
hset('user-info-01','hobby','篮球')

hmget:获取多个

hmget(name, keys, *args)

# eg:
hmget('user-info-01','name','age','hobby')
hmget('user-info-01',['name','age','hobby'])

hgetall:获取全部

hgetall(name)

# eg:
hgetall('user-info-01')

hlen:获取长度

hlen(name)

# eg:
hlen('user-info-01')

hkeys:获取所有 key

hkeys(name)

# eg:
hkeys('user-info-01')

hvals:获取所有 value

hvals(name)

# eg:
hvals('user-info-01')

hscan: 按量(count)获取值

# cursor: 偏移量
# count :取的个数

# 获取的数量会在 count 左右,不准确。
res = hscan(name, cursor count)

# 还回值是 <cursor: 偏移量, data: 数据>
# 可以根据偏移量再次取值
(cursor, data) = res

hscan_iter: 按量(count)获取值

for item in conn.hscan_iter('map_demo',count=10):
    print(item)

(3)判断是否存在

1 是存在,0 是不存在

hexists(name, key)

# eg:
hexists('user-info-01','hobby')

(4)删除值

hdel(name, *keys)

# eg:
hdel('user-info-01','hobby','age')

(5)自增

有会自增,没有会创建并自增

hincrby(name, key)

# eg:
hincrby('user-info-01','age')

3. list

import redis
conn = redis.Redis(decode_responses=True)

res = conn.方法名(...参数)
print(res)

(1)设置值

name 是列表的名字

在最 左/右 边添加值

# 从最左边
lpush(name, value)
# 从最右边
rpush(name, value)

# eg:
# conn.lpush('girls','lyf')
# conn.lpush('girls','dlrb')

插入指定位置

lset(name, index, value)

name 存在时, 将 value 添加到列表的最 左/右 边

lpushx(name, value)
rpushx(name, value)

在前面或后面插入值, 以 refvalue 为基准。

linsert(name, where, refvalue, value))

# eg:
linsert('girls','before','lyf','shlyf')
linsert('girls','after','lyf','bjlyf')

将 list1 弹出的数据,加到 list2 中

rpoplpush(list1, list2)

(2)获取值

按索引获取值

lindex(name, index)

切片取值

lrange(name, start, end)

(3)保留值

切片保留值, 保留 start-end 之间的值

ltrim(name, start, end)

(4)删除值

lrem(name, value, num)

# eg:
# 从左侧删除一个符合条件
lrem('girls',1,'刘亦菲')
# 从右侧删除一个符合条件
lrem('girls',-1,'刘亦菲')
# 删除所有符合条件
lrem('girls',0,'刘亦菲')

lpop(name), rpop(name)

# 从右向左弹出
rpop(name)
# 从左向右弹出
rpop(name)

(5)阻塞式操作

具体细节百度

BLPOP (阻塞式左弹出)

BRPOP (阻塞式右弹出)

BRPOPLPUSH (阻塞式右弹出并左推)

4. 通用操作

delete(*names)

exists(name)

keys(pattern='*')

expire(name ,time)

rename(src, dst)

move(name, db)

randomkey()

type(name)
posted @ 2023-04-26 12:02  codegjj  阅读(131)  评论(0编辑  收藏  举报