zoukankan      html  css  js  c++  java
  • 【python】-- Redis简介、命令、示例

    Redis简介

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

     Redis 与其他 key - value 缓存产品有以下三个特点:

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份。

    Redis 优势:

    • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
    • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    • 原子 – Redis的所有操作都是原子性的(意思就是要么成功执行要么失败完全不执行),单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

    Redis与其他key-value存储的区别:

    • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

    • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

    一、Linux下redis安装:

    1、下载、解压、编译

    $ wget http://download.redis.io/releases/redis-4.0.6.tar.gz
    $ tar xzf redis-4.0.6.tar.gz
    $ cd redis-4.0.6
    $ make

    make完后 redis-4.0.6目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:

    2、启动服务端

    $ src/redis-server

    3、启动客户端

    $ src/redis-cli

    4、测试验证

    127.0.0.1:6379> set name test
    OK
    127.0.0.1:6379> get name
    "test"
    

     最新版本安装:查看

    二、Rides的操作命令

    1、对value的操作命令:

    exists(key):确认一个key是否存在
    del(key):删除一个key
    type(key):返回值的类型
    keys(pattern):返回满足给定pattern的所有key
    randomkey:随机返回key空间的一个key
    rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
    dbsize:返回当前数据库中key的数目
    expire:设定一个key的活动时间(s)
    ttl:获得一个key的活动时间
    select(index):按索引查询
    move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
    flushdb:删除当前选择数据库中的所有key
    flushall:删除所有数据库中的所有key
    

    2、对String操作的命令

    set(key, value):给数据库中名称为key的string赋予值value
    get(key):返回数据库中名称为key的string的value
    getset(key, value):给名称为key的string赋予上一次的value
    mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value
    setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
    setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
    mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i
    msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i
    incr(key):名称为key的string增1操作
    incrby(key, integer):名称为key的string增加integer
    decr(key):名称为key的string减1操作
    decrby(key, integer):名称为key的string减少integer
    append(key, value):名称为key的string的值附加value
    substr(key, start, end):返回名称为key的string的value的子串
    

    3、对List操作的命令

    rpush(key, value):在名称为key的list尾添加一个值为value的元素
    lpush(key, value):在名称为key的list头添加一个值为value的 元素
    llen(key):返回名称为key的list的长度
    lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
    ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
    lindex(key, index):返回名称为key的list中index位置的元素
    lset(key, index, value):给名称为key的list中index位置的元素赋值为value
    lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0从 头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。 lpop(key):返回并删除名称为key的list中的首元素 rpop(key):返回并删除名称为key的list中的尾元素 blpop(key1, key2,… key N, timeout):lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对 keyi+1开始的list执行pop操作。
    brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
    rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
    

    4、对Set(无序集合)操作的命令

    sadd(key, member):向名称为key的set中添加元素member
    srem(key, member) :删除名称为key的set中的元素member
    spop(key) :随机返回并删除名称为key的set中一个元素
    smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
    scard(key) :返回名称为key的set的基数
    sismember(key, member) :测试member是否是名称为key的set的元素
    sinter(key1, key2,…key N) :求交集
    sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合
    sunion(key1, key2,…key N) :求并集
    sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合
    sdiff(key1, key2,…key N) :求差集
    sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合
    smembers(key) :返回名称为key的set的所有元素
    srandmember(key) :随机返回名称为key的set的一个元素
    

    5、zset(sorted set有序集合)操作的命令

    zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
    zrem(key, member) :删除名称为key的zset中的元素member
    zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
    zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
    zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
    zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
    zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
    zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素 zcard(key):返回名称为key的zset的基数 zscore(key, element):返回名称为key的zset中元素element的score zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素 zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素
    zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行 AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素 的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
    

    6、对Hash操作的命令

    hset(key, field, value):向名称为key的hash中添加元素field<—>value
    hget(key, field):返回名称为key的hash中field对应的value
    hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
    hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
    hincrby(key, field, integer):将名称为key的hash中field的value增加integer
    hexists(key, field):名称为key的hash中是否存在键为field的域
    hdel(key, field):删除名称为key的hash中键为field的域
    hlen(key):返回名称为key的hash中元素个数
    hkeys(key):返回名称为key的hash中所有键
    hvals(key):返回名称为key的hash中所有键对应的value
    hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
    

    7、持久化

    save:将数据同步保存到磁盘
    bgsave:将数据异步保存到磁盘
    lastsave:返回上次成功将数据保存到磁盘的Unix时戳
    shundown:将数据同步保存到磁盘,然后关闭服务
    

    8、远程服务控制

    info:提供服务器的信息和统计
    monitor:实时转储收到的请求
    slaveof:改变复制策略设置
    config:在运行时配置Redis服务器

    详细Redis命令演示说明:查看

    三、Python操作Redis示例

    1、redis-py

    redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

    import redis
     
    r = redis.Redis(host="192.168.1.64", port=6379)
    r.set("foo", "Bar")
    print(r.get("foo"))
    

    2、redis-py连接池

    redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。

    import redis
    
    pool = redis.ConnectionPool(host="192.168.1.64", port=6379)
    
    r = redis.Redis(connection_pool=pool)
    r.set("foo", "bar")
    print(r.get("foo"))

    3、redis-py管道

    redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

    import redis
     
    pool = redis.ConnectionPool(host="192.168.1.64", port=6379)
     
    r = redis.Redis(connection_pool=pool)
     
    # pipe = r.pipeline(transaction=False)
    pipe = r.pipeline(transaction=True)
     
    pipe.set("name","test")
    pipe.set("role", "ceo")
     
    pipe.execute()
    

    4、发布订阅

    4.1、对发布订阅进行封装

    import redis
     
    class RedisHelper(object):
     
        def __init__(self):
            self.__conn = redis.Redis(host="localhost")
            self.chan_sub = 'fm104.5'
            self.chan_pub = 'fm104.5'
     
        def public(self,msg):
            "发布"
            self.__conn.publish(self.chan_pub,msg)  #发布消息
            return  True
     
        def subscribe(self):
            "订阅"
            pub = self.__conn.pubsub() #打开收音机
            pub.subscribe(self.chan_sub) #调频道
            pub.parse_response() #准备接收
            return pub
    

    4.2 、发布者

    from monitor.redis_helper import RedisHelper
     
    obj = RedisHelper()
    redis_sub = obj.subscribe()
     
    while True:
        msg = redis_sub.parse_response() #第2次准备接收动作
        print(msg)

    4.3 、订阅者 

    from monitor.redis_helper import RedisHelper
     
     
    obj = RedisHelper()
    obj.public("hello world")  #发布消息
    

    4.4、redis命令演示订阅发布

    发布:

    127.0.0.1:6379> help publish
     
      PUBLISH channel message
      summary: Post a message to a channel
      since: 2.0.0
      group: pubsub
     
    127.0.0.1:6379> publish "fm104.5" helloword   #publish 频道   消息
    (integer) 1

    订阅:

    127.0.0.1:6379> help subscribe
     
      SUBSCRIBE channel [channel ...]
      summary: Listen for messages published to the given channels
      since: 2.0.0
      group: pubsub
     
    127.0.0.1:6379> subscribe "fm104.5"   #subscribe  频道,可以订阅多个频道
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "fm104.5"
    3) (integer) 1

    redis.py源码

  • 相关阅读:
    牛客寒假算法集训 1
    求逆序数——树状数组
    牛客网 被3整除的子序列 区间dp
    SICNU 2019 winter training #2(codeforces #531 Div3)
    iOS 给已有的类添加属性.
    coredata实践
    IOS 数据库升级
    获取当前屏幕显示的viewcontroller
    ios 自顶一个view
    mac 修改文件夹权限.
  • 原文地址:https://www.cnblogs.com/Keep-Ambition/p/8056862.html
Copyright © 2011-2022 走看看