使用redis
我们介绍一下redis的使用吧经过按部就班的安装之后,服务端是默认开启的,可以查看本地服务,找到Redis
那我们也可以通过cmd终端开启客户端 ,需要先切盘,cd 是在本盘中更换目录 盘d:切到d盘,然后更换目录 cd e:/redis
这样就可以输入开启命令行了 Redis-cli,可以select 加上索引更换db,默认是db0。
也可以通过可视化软件,redis desktop manage来操作redis数据库,我们不妨对比navicat,更有助于我们掌握理解知识。
redis的数据类型
Redis支持五种数据类型:string
(字符串),hash
(哈希),list
(列表),set
(集合)及zset
(sorted set:有序集合)。
1、String(字符串)
一个key对应一个value。一个键最大能存储512MB。string类型是二进制安全的。 2、Hash(哈希)
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
每个 hash 可以存储 232 - 1 键值对(40多亿)。
3、List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
4、Set(集合)
Redis的Set是string类型的无序集合。值不重复。
sadd
添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,
如果 key 对应的 set 不存在则返回错误。
5、zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合。且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
python连接redis
方式一:实例化的对象连接
import redis r = redis.Redis(host='localhost',port = '6379') r.set('foo' ,'bar') print(r.get('foo'))
方式二:连接池
import redis pool = redis.ConnectionPool(host='127.0.0.1',port='6379') r = redis.Redis(connection_pool=pool) r.set('outer','inner') print(r.get('outer'))
python操作redis数据
-redis之字符串常用操作
set 和 get就是设置和获取值,前面已经提过
mset 和mget就是一次设置多个值和获取多个值
import redis conn = redis.Redis(host ='127.0.0.1',port ='6379') conn.mset({'k1':'v1',"k2":'v2'}) #批量设置值 print(conn.mget('k1', 'k2')) #批量获取 print(conn.mget(['k1', 'k2'])) #批量获取
incr就是增长,decr就是减少
conn.incr('age',2) #默认是有amount参数等于1 也可以自己传参数 conn.decr('age',3) #默认是有amount参数等于1 也可以自己传参数
append:字符串追加
conn.set('hub',12) conn.append('hub',4) print(conn.get('hub'))
得到的结果是:b'124'
redis之hash操作
hset 和 hget 单个哈希的设置与获取
conn.hset('h1','key1','val1') print(conn.hget('h1', 'key1'))
hmset和 hmget批量哈希的设置与获取
conn.hmset('h2',{'key1':'val1','key2':'val2'}) print(conn.hmget('h2', ['key1', 'key2']))
hgetall获取全部的key值,hlen哈希的长度
print(conn.hgetall('h2')) print(conn.hlen('h2'))
hdel删除hincrby自增
conn.hdel('h2','key1') #删除 conn.hset('h3','k1',1) #设置 conn.hincrby('h3','k1') #value自增,默认amount=1 ,也可以传参
hscan
增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆 参数: # name,redis的name # cursor,游标(基于游标分批取获取数据) # match,匹配指定key,默认None 表示所有的key # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
for i in range(10000): conn.hset('hash3','key%s'%i,'value%s'%i) # 生成的哈希是无序的
print(conn.hscan('hash3',0,count=100))
hscan_iter
利用yield封装hscan创建生成器,实现分批去redis中获取数据
参数: # match,匹配指定key,默认None 表示所有的key # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
for i in conn.hscan_iter('hash3',count=100): #每次100的取数据 防止内存撑爆 print(i)
redis之列表操作:
lpush设置值
conn.lpush('list2','a','b','c') print(conn.lindex('list2',2))
llen列表长度
conn.llen('list2') #可以加print打印出列表长度
linsert插入
conn.linsert('list2','after','c','bc')
lpop删除
在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素conn.lpop('list2') #山到最后一个就把整个name删除了
blpop阻塞态删除
类似于消费者生产者模型 我们先定义一个list1 通过模块导入实现单例
from redis import Redis conn=Redis() conn.lpush('list1',10)
在另一个py文件中引入list1
print(conn.lpop('list1')) #没有值可以阻塞住,可以实现分布式 # print(conn.blpop('list1'))
管道实现事物
conn=Redis() pipe = conn.pipeline(transaction=True) pipe.multi() pipe.set('name', 'alex') pipe.set('role', 'sb') pipe.execute()
django中应用redis
方式一:
新建redis_pool.py:
import redis POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='1234',max_connections=1000)
那么在视图函数中我们就可以引用了
import redis from django.shortcuts import render,HttpResponse from utils.redis_pool import POOL def index(request): conn = redis.Redis(connection_pool=POOL) conn.hset('kkk','age',18) return HttpResponse('设置成功') def order(request): conn = redis.Redis(connection_pool=POOL) conn.hget('kkk','age') return HttpResponse('获取成功')
方式二:
安装django-redis模块,在settings里面配置
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "123", } } }
在视图函数中:
from django_redis import get_redis_connection conn = get_redis_connection('default') print(conn.hgetall('xxx'))