zoukankan      html  css  js  c++  java
  • Redis一(Redis-py与String操作)

    Redis

    介绍

      redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    特点:

    1. 以字典结构存储数据
    2. 允许通过TCP协议读取字典的内容
    3. 强大的缓存系统, 可以为每个键设置TTL, 以及按照一定规则自动淘汰不需要的键
    4. 支持使用列表的形式构造任务队列
    5. 数据存储在内存中也可以持久化到硬盘

    一、Redis安装和基本使用

    1、安装

    wget http://download.redis.io/releases/redis-3.2.8.tar.gz
    tar xzf redis-3.2.8.tar.gz
    cd redis-3.2.8
    make && make install

    redis安装在/usr/local/bin/目录

    redis-benchmark: ==> 性能测试工具
    redis-check-aof: ==> AOF文件修复工具
    redis-check-dump: => RDB文件检查工具
    redis-cli:       ==> 命令行客户端
    redis-sentinel:   => 帮助管理redis实例的工具
    redis-server:    ==> redis服务器

    启动服务端

    #三种启动方式
    redis-server 默认端口6379
    redis-server --port 端口号
    redis-server /path/to/redis.conf  启动时的配置文件将覆盖系统同名配置项

    2、Redis的部署

      先为了方便管理,将Redis文件中的conf配置文件和常用命令移动到统一文件中

      修改redis.conf配置文件,我们使用redis安装目录中的redis.conf作为配置文件,将其拷贝到/usr/local/etc目录,以后运行redis服务,就指定该配置文件。

    后台启动redis服务

    a)首先编辑conf文件,将daemonize属性改为yes(表明需要在后台运行)

      cd etc/
      Vi redis.conf

      daemonize yes

    b)再次启动redis服务,并指定启动服务配置文件

      redis-server /usr/local/redis/etc/redis.conf

    Redis 操作常用命令

    Redis-server /usr..../redis.conf 启动redis服务,并指定配置文件
    Redis-cli 启动redis 客户端
    Pkill redis-server 关闭redis服务
    Redis-cli shutdown 关闭redis客户端
    Netstat -tunpl|grep 6379 查看redis 默认端口号6379占用情况

     二、Python操作Redis

    1、安装redis-py

    pip install redis

    API使用

    redis-py 的API的使用可以分类为:

    • 连接方式
    • 连接池
    • 操作
      • String 操作
      • Hash 操作
      • List 操作
      • Set 操作
      • Sort Set 操作
    • 管道
    • 发布订阅

    2、使用 redis-py

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

    直接使用

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

    创建连接池:

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

    import redis
     
    pool = redis.ConnectionPool(host='192.168.49.130', port=6379)
     
    r = redis.Redis(connection_pool=pool)
    #r = redis.StrictRedis(connection_pool=pool) #StrictRedis也是支持的
    r.set('foo', 'Bar')
    print r.get('foo')

    三、操作

    a、String操作

      redis中的String在在内存中按照一个name对应一个value来存储。如图:

    设值

    1、set

    set(name, value, ex=None, px=None, nx=False, xx=False)
    #设值
    在Redis中设置值,默认,不存在则创建,存在则修改
    参数: ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行 xx,如果设置为True,则只有name存在时,岗前set操作才执行

    2、setnx

    setnx(name, value)
    #设值,只有name不存在时,执行设置操作(添加)

    3、setex

    setex(name, value, time)
    # 设值, 参数:time,过期时间(数字秒 或 timedelta对象)

    4、psetex

    psetex(name, time_ms, value)
    # 设值 参数:time_ms,过期时间(数字毫秒 或 timedelta对象)

    5.mset

    mset(*args, **kwargs)
    #批量设值
    #如:
        mset(k1='v1', k2='v2')
       #
        mget({'k1': 'v1', 'k2': 'v2'})

    取值

    1、get

    get(name)
    #取值

    2、mget

    mget(keys, *args)
    #批量获取
    #如:
        mget('name', 'age')
       #
        r.mget(['name', 'age'])

    3、getset

    getset(name, value)
    #设置新值并获取原来的值

    bit方式取值设值

    1、getrange

    getrange(key, start, end)
    # 获取子序列(根据字节获取,非字符)
    # 参数:
        # name,Redis 的 name
        # start,起始位置(字节)
        # end,结束位置(字节)
    # 如: "神一样的人儿" ,0-3表示 "神"

    2、setrange

    setrange(name, offset, value)
    # 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
    # 参数:
        # offset,字符串的索引,字节(一个汉字三个字节)
        # value,要设置的值

    3、setbit

    setbit(name, offset, value)
    # 对name对应值的二进制表示的位进行操作
     
    # 参数:
        # name,redis的name
        # offset,位的索引(将值变换成二进制后再进行索引)
        # value,值只能是 1 或 0
     
    # 注:如果在Redis中有一个对应: n1 = "foo",
            那么字符串foo的二进制表示为:01100110 01101111 01101111
       # 所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
            那么最终二进制则变成 01100111 01101111 01101111,即:"goo"
     
    # 扩展,转换二进制表示:
     
        # source = ""
        source = "foo"
     
        for i in source:
            num = ord(i)
            print bin(num).replace('b','')
     
       # 特别的,如果source是汉字怎么办?
        #答:对于utf-8,每一个汉字占 3 个字节,汉字姓名一般为三个则有 9个字节
          # 对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制
            11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000

    4、getbit

    getbit(name, offset)
    # 获取name对应的值的二进制表示中的某位的值 (0或1)

    5、bitcount

    bitcount(key, start=None, end=None)
    # 获取name对应的值的二进制表示中 1 的个数
    # 参数:
        # key,Redis的name
        # start,位起始位置
        # end,位结束位置

    6、bitop

    bitop(operation, dest, *keys)
    # 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值
     
    # 参数:
        # operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
        # dest, 新的Redis的name
        # *keys,要查找的Redis的name
     
    # 如:
        bitop("AND", 'new_name', 'n1', 'n2', 'n3')
        # 获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中

    获取值的长度

    strlen

    strlen(name)
    # 返回name对应值的字节长度(一个汉字3个字节)

    自增

    1、incr

    incr(self, name, amount=1)
    # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
     
    # 参数:
        # name,Redis的name
        # amount,自增数(必须是整数)
     
    # 注:同incrby

    2、incrbyfloat

    incrbyfloat(self, name, amount=1.0)
    # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
     
    # 参数:
        # name,Redis的name
        # amount,自增数(浮点型)

    3、decr

    decr(self, name, amount=1)
    # 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。
     
    # 参数:
        # name,Redis的name
        # amount,自减数(整数)

    追加

    append

    append(key, value)
    # 在redis name对应的值后面追加内容
     
    # 参数:
        key, redis的name
        value, 要追加的字符串

    更多参见:https://github.com/andymccurdy/redis-py/

    http://doc.redisfans.com/

  • 相关阅读:
    jquery的each()详细介绍【转】
    牛客-小w的a=b问题
    HDU-6707-Shuffle Card(很数据结构的一道题)
    HDU-6672-Seq
    牛客-随机数
    牛客-小阳的贝壳
    HDU-4417-Super Mario
    牛客-Corn Fields
    HDU-2665-Kth number
    线段树模板
  • 原文地址:https://www.cnblogs.com/freely/p/6843572.html
Copyright © 2011-2022 走看看