1. 简介
1、key-value存储系统,key为字符串类型,只能通过key对value进行操作
2、支持的数据类型
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
3、支持组从同步,数据从主服务器上向任意从服务器上同步
4、事务,允许一组命令在单一步骤下执行
5、原子性,都执行或都不执行
2. redis与mysql关系
- 存储区域:内存 硬盘
- redis 适合存放频繁使用的数据,由于在内存读取速度快,如:排行榜,计数; MySQL 存储冷数据
- mysql(主)+redis(辅),redis当做缓存来处理数据,与用户交互时查数据优先去redis,再去mysql
- 数据类型少,查询功能弱,开发效率较低,是个高速存储器,适合做缓存使用
3. 基本操作
- string
1、创建单个值set,多个值mset import redis r=redis.Redis (host='127.0.0.1',port=6379) r.set('foo','Bar') 2、取单个值get,取多个值mget print(r.mget('k3','k4')) # 根据key 取多个值 3、strlen.key #通过key取对应value值的长度 4、getrange(key, start, end) #切片获取指定的值 5、setrange(key,offset, value) # 修改值 指定索引offset修改成value 6、print(r.incr('nam',amount=4)) # 自增,key值存在在原有的值上加amount,key 值不存在创建key:amount 7、append(key, value) #追加
- Hash
1、创建hset(name, key, value) 2、批量创建 hmest(name,{'k1':'v1', 'k2': 'v2'}) 3、hget 取单个; hmget 取多个值 4、hgetall('key') #获取key 对应的所有值 5、hlen('key') #获取key对应的hash中键值对的个数 6、hkeys(name) # name 对应的所有key的值 7、hvals(name) # 所有value值 8、hdel(name,*keys) 指定hash的中key,删除键值对 8、hincrby(name, key, amount=1) #key 存在自增,不存在创建key:amount 注:hincrbyfloat 自增浮点数 9、hscan(name, cursor=0, match=None, count=None) 注:用于取大数据,迭代取值 参数: # name,redis的name # cursor,游标(基于游标分批取获取数据) # match,匹配指定key,默认None 表示所有的key # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 例: print(conn.hscan('k2',cursor=2,count=3)) print(conn.hscan_iter('k2')) for item in conn.hscan_iter('k2'): print(item)
- List
1、添加 lpush(name,values) # print(r.lpush('kk','ff',44,99)) 2、lpushx(name,value) # name 存在 从左边开始添加 3、llen(name) # 对应 list的个数 4、linsert(name, where, refvalue, value)) # 在某一个值的前或者后插入值 参数: # name,redis的name # where,BEFORE或AFTER(小写也可以) # refvalue,标杆值,即:在它前后插入数据(如果存在多个标杆值,以找到的第一个为准) # value,要插入的数据 5、lset(name, index, value) # 指定索引修改值 6、lrem(name, value, num) #在name对应的list中删除指定的值 参数: # name,redis的name # value,要删除的值 # num, num=0,删除列表中所有的指定值; num=2,从前到后,删除2个; num=-2,从后向前,删除2个 7、lpop(name) # #删除name对应的列表中左侧第一个元素 注: rpop 删除右侧第一个 8、lindex(name, index) # 根据索引取值 9、rpoplpush(src, dst) #将数据从一个列表添加到另一个列表 10、lrange(name, start, end) #分片获取数据 11、列表数据较大需要自定义增量迭代 def ll_sacn(name,count=2): index=0 while True: data_list=conn.lrange(name,index,index+count-1) if not data_list: return index=index+count for item in data_list: yield item for i in ll_sacn('ll'): print(i)
- Set 无序集合
- Sorted Set 有序集合 (排行榜应用)
- 其他操作
1、delete(*names) #删除任意数据类型 2、exists(name) #判断name是否存在 3、keys(pattern='*') # 根据模型匹配key值 4、expire(name ,time) #设置超时时间 5、rename(src, dst) # 重命名 6、scan(cursor=0, match=None, count=None) scan_iter(match=None, count=None) # 增量迭代获取key 7、move(name, db)) # name移动的指定的db下
4. 使用redis
4.1 在pychram 中使用
import redis #添加数据 r=redis.Redis (host='127.0.0.1',port=6379) r.set('foo','Bar') print(r.get('foo')) #连接池 pool =redis .ConnectionPool (host='127.0.0.1',port=6379) r=redis.Redis (connection_pool= pool) r.set('name',77) print(r.get('name'))
4.2 在Django中使用
- 方式一:
1、utils文件夹下,建立redis_pool.py import redis POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='1234',max_connections=1000) 2、视图函数中 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('设置成功')
- 方式二:
1、安装django-redis模块 2、在setting中配置 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", } } } 3、视图函数中 from django_redis import get_redis_connection conn = get_redis_connection('default') print(conn.hgetall('xxx'))