python中对redis的支持
对字符串的操作
set mset get mget getset等
import redis
pool = redis.ConnectionPool(host='localhost',port=6379)
conn = redis.Redis(connection_pool=pool)
#添加 同名则修改
conn.set('a',1)
# 批量添加
# conn.mset(k1="v1",k2="v2")
conn.mset({'k3':5,'k4':6})
# 批量获取
result = conn.mget({'k1','k2'}) # [None, None]
print(result)
result = conn.mget('k3','k4') # [b'5', b'6']
print(result)
# 设置新值并获取原来的值
r = conn.getset('a','abc')
print(conn.get('a')) # b'abc'
对列表的操作
import redis
pool = redis.ConnectionPool(host='localhost', port=6379)
conn = redis.Redis(connection_pool=pool)
# 保存顺序为: 3,2,1
conn.lpush('oo', 1, 2, 3)
# 返回个数
print(conn.llen('oo')) # 3
print(conn.lrange('oo', 0, -1)) # [b'3', b'2', b'1']
# 在name对应的列表的某一个值前或后插入一个新值
conn.linsert('oo', 'AFTER', 2, 'alex')
# 对name对应的list中的某一个索引位置重新赋值
'''
# 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:
# 1、获取name对应的所有列表
# 2、循环列表
# 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
def list_iter(name):
"""
自定义redis列表增量迭代
:param name: redis中的name,即:迭代name对应的列表
:return: yield 返回 列表元素
"""
list_count = r.llen(name)
for index in xrange(list_count):
yield r.lindex(name, index)
# 使用
for item in list_iter('pp'):
print item
'''
对hash的操作
import redis
pool = redis.ConnectionPool(host='localhost', port=6379)
conn = redis.Redis(connection_pool=pool)
hash = {'a1': 'b1', 'a2': 'b2', 'a3': 3}
conn.hmset('key1', hash)
conn.hset('key2', 't1', 'edg')
print(conn.hget('key1', 'a1')) # b'b1'
print(conn.hmget('key1', ['a1', 'a2'])) # [b'b1', b'b2']
print(conn.hget('key2', 't1')) # b'edg'
redis事务
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,
如果想要在一次请求中指定多个命令,
则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。
'''
import redis
pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True)
pipe.multi()
pipe.set('name', 'alex')
pipe.set('role', 'sb')
pipe.execute()
在Django中的运用Redis进行缓存操作
- 一个细节问题:
当我们以不同的方式获取资源,无论是搜索,分页,查询,html,json,都会产生不同的key,因此他们对应的缓存也是不同的