Redis数据库

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保持后台运行
  1. 进入 DOS窗口
  2. 在进入Redis的安装目录
  3. 输入:redis-server --service-install redis.windows.conf --loglevel verbose ( 安装redis服务 )
  4. 输入:redis-server --service-start ( 启动服务 )
  5. 输入: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

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值