zoukankan      html  css  js  c++  java
  • redis常用操作

    参考: http://www.cnblogs.com/wupeiqi/articles/5132791.html

    概述

    redis是一个软件

    redis是单进程单线程

    帮助开发者对一台机器的内存进行操作,

    可以做持久化:
      AOF
      RDB

    为什么使用redis

    (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

    (2) 支持丰富数据类型,支持string,list,set,sorted set,hash

    (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

    (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

    安装

    redis软件

    1 yum install redis   (或者编译安装)
    2 启动: redis-server /etc/redis.conf
      (如果是编译安装: /src/redis-server redis-conf)

    3 redis配置文件: redis.conf
      bind: 0.0.0.0
      port: 6379
      requirepass sdfs (密码)

    python连接redis的模块

    pip3 install redis
    
    # 创建连接
    conn = redis.Redis(host='192.168.1.66', port=6379, password='...')
    
    conn.set('x1', 'val1')
    val = conn.get('x1')
    print(val)
    
    # 连接池
    pool = redis.ConnectionPool(host='192.168.1.66', port=6379, password='123456', max_connections=1000)
    conn = reids.Redis(connection_pool=pool)

    # 注意: 只用一个连接池, 可以通过单例模式实现(从其他模块导入实例好的连接池对象)

    # 使用连接池: 本质是维护一个已经和服务端连接成功的socket; 以后再次发送数据时, 直接获取一个socket, 直接send数据

    使用

    1 String操作

    set(name, value, ex=None, px=None, nx=False, xx=False)        # 设置值,默认,不存在则创建,存在则修改
    setnx(name, value)                # 设置值,只有name不存在时,执行设置操作(添加)
    setex(name, value, time)          # time,过期时间(数字秒 或 timedelta对象)
    psetex(name, time_ms, value)      # time_ms,过期时间(数字毫秒 或 timedelta对象)
    mset(*args, **kwargs)             # 批量设置值    如: mset(k1='v1', k2='v2')
    
    get(name)                  # 获取值
    mget(keys, *args)          # 批量获取        如:  r.mget('ylr', 'wupeiqi')或    r.mget(['ylr', 'wupeiqi'])
    getset(name, value)        # 设置新值并获取原来的值

    2 Hash操作(字典操作)

    hset(name, key, value)        # name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
    hmset(name, mapping)          # 在name对应的hash中批量设置键值对, 如: r.hmset('xx', {'k1':'v1', 'k2': 'v2'})
    
    hget(name,key)                # 在name对应的hash中获取根据key获取value
    hmget(name, keys, *args)      # 在name对应的hash中获取多个key的值        如: r.mget('xx', ['k1', 'k2'])    或  r.hmget('xx', 'k1', 'k2')
    hgetall(name)                 # 获取name对应hash的所有键值
    
    hincrby(name, key, amount=1)  # 自增name对应的hash中的指定key的值,不存在则创建key=amount        【计数器】 amount可以是负数,实现自减
    hlen(name)                    # 获取name对应的hash中键值对的个数
    hexists(name, key)            # 检查name对应的hash是否存在当前传入的key
    
    hscan_iter(name, match=None, count=None)    # 利用yield封装hscan创建生成器,实现分批去redis中获取数据        (支持匹配 "hello_*")

    3 List操作

    lpush(name, values)            # 从左放
    rpush(name, values)           # 从右放
    
    lpop(name)         # 从左取一个
    rpop(name)         # 从右取一个
    
    lrange(name, start, end)      # 在name对应的列表分片获取数据
    
    blpop(keys, timeout)          # 从左边pop数据, 没有数据会一直等, 如果到了超时时间还没有, 则取回None
    brpop(keys, timeout)          # 从右边pop数据, 没有数据会一直等, 如果到了超时时间还没有, 则取回None
    
    lpushx(name,value)            # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
    rpushx(name,value)            # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边
    
    llen(name)                    # name对应的list元素的个数
    
    # 一点一点取, 可以通过yield创建一个生成器

    4 Set操作

    5 有序集合

    其他常用操作

    delete(*names)        # 根据删除redis中的任意数据类型
    exists(name)          # 检测redis的name是否存在
    keys(pattern='*')     # 根据模型获取redis的name
    expire(name ,time)    # 为某个redis的某个name设置超时时间

    管道(redis事务)

    如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

    import redis
    
    pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
    r = redis.Redis(connection_pool=pool)
    
    
    pipe = r.pipeline(transaction=True)
    pipe.multi()        # 批量操作
    
    pipe.set('name', 'alex')
    pipe.set('role', 'sb')
    
    pipe.execute()        # 执行

    注意

    1 取所有数据时, 先检查一下长度, 如果很多数据, 使用hscan_iter
    2 redis操作时, 只有第一层支持数据类型, 如果要嵌套, 先转成json字符串, 再作为值"嵌套"进去

  • 相关阅读:
    epoll oneshot
    回望五月
    都知道的copy_from_user
    ixgbe 驱动 为xxx驱动做准备1
    面试问题集锦
    数据治理
    阅读
    hive 数据仓库面试题目集锦
    面试小问题集锦
    Scala学习笔记~尚硅谷学习视频
  • 原文地址:https://www.cnblogs.com/sunch/p/10422190.html
Copyright © 2011-2022 走看看