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")}次', )
方式二: 模块
- 下载:
pip install django-redis
- 配置:文件配置中配置
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},
# """ 后续还有会用户名,密码 等相关配置""""
}
}
}
- 使用:
# 导入 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缓存结合)
- 配置
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):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)