Redis数据库
1.简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
优点:
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
2.redis为非关系型数据库
数据库可以分为关系型(采用了关系模型来组织数据的数据库。)和非关系型(分布式的,且一般不保证遵循ACID原则的数据存储系统。)
-
关系型:
- 优点:
- 通过事务处理保持数据的一致性
- 数据更新的开销很小
- 可以进行Join等复杂查询
- 20多年的技术历程,技术成熟
- 缺点:
- 数据读写必须经过sql解析,大量数据、高并发下读写性能不足
- 为保证数据一致性,需要加锁,影响并发操作
- 无法适应非结构化的存储
- 大量数据集中到一台服务区处理,使服务器不堪重负
- “阻抗失谐”,即数据库中存储的对象与实际的对象实体有一定的差别
- 扩展困难
- 数据库庞大,价格昂贵
- 优点:
-
非关系型:
- 优点:
- 处理高并发、大批量数据的能力强
- 支持分布式集群,负载均衡,性能高
- 解决“阻抗失谐”问题
- 内存级数据库,查询速度快
- 存储格式多,支持key-value形式、文档形式、图片形式
- 没有多表连接查询机制的限制,扩展性高
- 缺点:
- 技术起步晚,维护工具以及技术资料有限
- 不支持sql工业标准
- 没有join等复杂的连接操作
- 事务处理能力弱
- 没有完整性约束,对于复杂业务场景支持较差
- 优点:
3.redis安装
安装包官方下载地址:https://github.com/MSOpenTech/redis/releases。
.exe安装方式不做赘述,下面介绍的是压缩包的安装方式(windows环境)
1,下载 Redis-x64-xxx.zip 并解压到redis的文件夹(我这里是解压到c盘)
2,切换目录到 C:\redis 运行 redis-server.exe redis.windows.conf
3, 另启一个cmd窗口,原来的不要关闭,切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379 。
4 ,设置键值对 set Key value 取出键值对 get key
- redis保持后台运行
- 进入 DOS窗口
- 在进入Redis的安装目录
- 输入:redis-server --service-install redis.windows.conf --loglevel verbose ( 安装redis服务 )
- 输入:redis-server --service-start ( 启动服务 )
- 输入:redis-server --service-stop (停止服务)
4.redis的相关操作
4.1字符串
请注意:
-
name:键名
-
value:键值
-
set(name,value,ex=None,px=None,nx=False,xx=False)**:设置键值
- ex:过期时间(秒)
- px:过期时间(毫秒)
- nx:True时,name不存在才会执行set操作
- xx:True时,name存在才会执行set操作
-
get(name):获取键值
-
setnx(name,value):设置键值(name不存在则设置,否则不做操作)
-
setex(name,value,time):设置键值(name存在会覆盖)
- time:过期时间(秒)
-
psetex(name,time_ms,value):设置键值(name存在会覆盖)
- time_ms:过期时间(毫秒)
-
mset(args,kwargs):批量设置键值
-
mget(keys,args):批量获取键值
- keys:键列表
- args:键元组
-
getset(name,value):获取旧值并设置新值
-
setrange(name,offset,value):修改键值
- offset:起始位置(从此位置开始修改),若name不存在,且offset>0,则在前面补上offset个0x00,再加上value,为name的新值
-
getrange(name,start,end):获取值并截取
- start:起始位置(字节),包含起始位置
- end:结束位置(字节),包含结束位置
-
setbit(name,offset,value):对name对应的值的二进制位进行操作
setbit函数的功能是对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
-
getbit(name,offset):对name对应的值的二进制位进行操作
-
strlen(name):获取name对应值的长度
-
incr(name,amount):name不存在,则name=amount,name存在,则name对应的值+amount
- amount:自增值
-
decr(name,amount):name不存在,则name=amount,name存在,则name对应的值-amount
- amount:自减值
-
append(key,value):在key对应的值后面追加value
- value:追加的值
4.2HASH操作
请注意:
-
name:键
-
key:字典中的键
-
value:字典的值
-
hset(name,key,value):存储字典
-
hget(name,key):获取name对应的字典中对应key的值
-
hmset(name,mapping):存储字典
- mapping:字典,如:{“info”:”shenzhen”,”age”:18}
-
hmget(name,keys,args):获取字典的值
- name:键 不能是数字 包括‘1’
- keys:字典键,如:hmget(“name”,[“info”,”age”])
- args:字典键,如:hmget(“name”,”info”,”age”)
-
hgetall(name):获取字典(dict格式)
-
hlen(name):获取字典的长度
-
hkeys(name):获取字典的所有key
-
hvals(name):获取字典的所有value
-
hexists(name,key):name对应的字典中是否存在键key
-
hdel(name,args):删除name对应的字典中的键值对
- args:字典的key元组
-
hincrby(name,key,amount):name对应的字典中,若key存在,则key对应的值+amount,否则key=amount
- amount:自增值(整数)
-
hincrbyfloat(name,key,amount):name对应的字典中,若key存在,则key对应的值+amount,否则key=amount
- amount:自增值(浮点数)
-
hscan(name,cursor=0,match=None,count=None):迭代式获取,对于数据大的数据非常有用,hscan可以实现分片式获取,避免一次性获取完毕,将内存撑爆
- cursor:游标
- match:匹配的key,默认None,表示所有的key
- count:每次分片最少获取个数,默认None表示采用Redis默认分片个数
# 第一次
cursor1,data = r.hscan("province",cursor=0)
# 第二次
cursor2,data = r.hscan("province",cursor=cursor1)
...
依次迭代,当返回的游标值为0时表示全部获取完毕,值得注意的是只有当"province"对应的字典中含有大量数据时,redis才会有采取分片操作(大概在513条数据左右)
- hscan_iter(name,match,count):利用yield封装hscan创建生成器,实现分批去redis中获取数据
- match:匹配的key,默认None,表示所有的key
- count:每次分片最少获取个数,默认None表示采用Redis默认分片个数
4.3列表相关操作
注意:
-
name:键
-
value:值(列表)
-
lpush(name,value):存储列表(往前(左)插入)
-
rpush(name,value):存储列表(往后(右)插入)
-
lpushx(name,value):在name对应的list中添加元素,name不存在不操作
- 值添加到列表的最前面
-
llen(name):获取name对应的list的长度
-
linsert(name,where,refvalue,value):在name对应的list中refvalue的前后插入value
- where:before或after
- refvalue:list中的某个值,与where配合确定位置后插入value
- value:插入的值
-
lset(name,index,value):修改name对应的list中指定位置的值
- index:索引位置
-
lrem(name, count, value):删除name对应的list中的指定值
- count:0:删除所有配到的指定值;count为正数时:从匹配到该值的位置时,删除count个;count为负数时:从后往前匹配,从匹配到该值的位置时,删除count个
- value:删除的指定值
-
lpop(name):删除name对应的list中的第一个值
-
lindex(name,index):获取name对应的list中指定位置的值
- index:索引位置
-
lrange(name,start,end):获取name对应的list中切片后的值
- start:起始位置(包括)
- end:结束位置(包括)
-
ltrim(name,start,end):移除name对应的list中,不在start-end之间的值
- start:起始位置(包括)
- end:结束位置(包括)
-
rpoplpush(src,dst):移除src对应的list中最右边(即最后)的元素,并将其加到dst中对应list的最左边(即最前)
- src:键
- dst:键
-
brpoplpush(src,dst,timeout=0):移除src对应的list中最右边(即最后的元素),并将其加到dst中对应list的最左边(即最前)
- src:键
- dst:键
- timeout:当src没有值,阻塞!阻塞时间
4.4集合相关操作
请注意:
-
name:键
-
value:值(集合)
-
sadd(name,value):添加集合
-
scard(name):获取集合元素的个数
-
sdiff(keys,args):获取多个集合的差集
- kyes:键
- args:键
-
sdiffstore(dest,keys,args):获取keys对应集合,与args中多个集合的差集,并将其设置为dest对应的集合
- dest:键
- keys:键
- args:键,若args为空,dest对应的集合则为keys对应的集合
-
sinter(keys,args):获取多个集合的交集
- keys:键
- args:键
-
sinterstore(dest,keys,args):获取keys对应集合,与args中多个集合的交集,并将其设置为dest对应的集合
- dest:键
- keys:键
- args:键,若args为空,dest对应的集合则为keys对应的集合
-
sismember(name,value):判断value是否name对应集合中的成员
-
smembers(name):获取name对应的集合
-
smove(src,dst,value):将src中对应集合中的value移动到dst对应的集合的最左边(即最前面)
- src:键
- dst:键
- value:值
-
spop(name):移除name对应集合中最右边(即最后面)的元素
-
srandmember(name,number=None):获取name对应集合中随机元素
- number:获取number个元素,默认取一个元素
-
srem(name,value):删除name对应集合中的某些元素
-
sunion(keys,args):获取多个集合的并集
- keys:键
- args:键
4.5有序集合相关操作
注意:
name:键
- zadd(name,args,**kwargs):在name对应的有序集合中添加元素,分数越小,越靠前
- args:键值对,例如:’n1’,1,’n2’,2
- kwargs:键值对,例如:’n1’=1,’n2’=2
- zcard(name):获取name对应的有序集合的元素个数
- zcount(name,min,max):获取name对应的有序集合中,min<=分数<=max中的元素个数
- min:小值(分数)
- max:大值(分数)
- zincrby(name,value,amount):自增name对应的有序集合中,value对应的分数+amount,若value不存在,则插入value=amount
- value:值
- amount:分数自增值
- zrange(name,start,end,desc=False,withscores=False,score_with_func=float):获取name对应的有序集合中,start<=下标<=end的所有数据。
- start:起始位置
- end:结束位置
- desc:是否是倒序,默认False
- withscores:是否获取分数,默认False
- score_with_func:分数类型
- zrank(name,value):获取value在name对应的有序集合中的下标
- value:值
- zrem(name,values):删除在name对应的有序集合中value对应的分数
- values:值,如:values=”n1”,”n2”
- zremrangebyrank(name,min,max):删除在name对应的有序集合中,min<=下标<=max的数据
- min:小(下标)
- max:大(下标)
- zremrangebyscore(name,min,max):删除在name对应的有序集合中,min<=分数<=max的数据
- min:小(分数)
- max:大(分数)
- zscore(name,value):获取name对应的有序集合中value对应的分数
- value:值
- zinterstore(name,keys,aggregate=None):获取name对应的有序集合的交集,并使name指向这个交集
- keys:多个有序集合的键的元组,例:keys=(“zlist1”,”zlist2”)
- aggregate:聚合操作,值可以是:”MAX”,”MIN”,”SUM”,当遇到值相同,分数不同时,可以对分数做操作:取大值、取小值或取和值
- zunionstore(name,keys,aggregate=None):获取name对应的有序集合的并集,并使name指向这个并集
- keys:多个有序集合的键的元组,例:keys=(“zlist1”,”zlist2”)
- aggregate:聚合操作,值可以是:”MAX”,”MIN”,”SUM”,当遇到值相同,分数不同时,可以对分数做操作:取大值、取小值或取和值
4.6其他常用操作
name:键
- delete(name):删除Redis中的任意数据类型
- exists(name):判断键是否存在
- keys(pattern=””):获取符合规则的所有键
- pattern:通配符,默认获取所有。常见:”h”:h结尾的键;”h”:h开头的键;”hx”:h开头,x结尾的键;”h[ae]x”:获取名为hax或hex的键
- expaire(name,time):设置超时时间
- rename(src,dst):修改键名
- src:旧键名
- dst:新键名
- move(name,db):将键移动至其他db
- name:键
- db:db序号
- randomkey():随机获取key
- type(name):获取键对应的数据类型
redies其他操作 https://blog.csdn.net/weixin_40207795/article/details/79848975
5.python连接radis
redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。
5.1普通连接
import redis
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses='utf-8')
5.2连接池连接
redis-py使用connection_pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。
可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池
import redis
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) #创建一个给连接池
r = redis.Redis(connection_pool=pool) #从连接池中取出一个连接
也可以在seeting.py里建立一个连接池,需要使用时调用即可
CACHES = {
"default":{
"BACKEND":"django_redis.cache.RedisCache",
"LOCATION":"redis://127.0.0.1:6379",
"OPTIONS":{
"CLIENT_CLSAA":"diango_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS":{"max_connections":100},
# "PASSWORD":'121352',
}
}
}
详细资料:https://www.cnblogs.com/zhangrenguo/p/10513310.html