• Redis数据类型基本操作


    须知:在Redis中设置值,默认,不存在则创建,存在则修改

     

    一:String字符串操作

     

    set 设置值

    属性释义
    name key的名字
    value key的值
    ex 过期时间(秒)
    px 过期时间(毫秒)
    nx 如果设置为True,则只有name不存在时,修改才会生效;值存在,就修改不了,执行没效果
    xx 如果设置为True,则只有name存在时,修改才会生效;值不存在,不会设置新值
    set(name, value,ex=None, px=None, nx=False, xx=False, keepttl=False)
    
    set('name', 'xxq')    # 如果存在,就会覆盖,返回:True;不存在,则无变化,返回:None
    
    set('name', 'xxq', 3)    # 设置过期时间为3秒,返回:True;不存在,则无变化,返回:None
    
    set('name1', 'xxq', nx=True)    # 如果不存在,就创建并赋值,返回:True;如果存在,则无变化,返回:None
    
    set('name', 'xxq', xx=True)    # 存在就覆盖,返回True;不存在,则无变化,返回:None
    

    setnx(key, value) 只有name不存在时,当前set操作才执行;值存在,则无效

    # 相当于:set(key, value, nx=True)
    
    psetex('name', 'xxq')    # 如果存在,就会覆盖,返回:True;不存在,则无变化,返回:None
    

    setex(name, time, value) 设置过期时间:秒

    # 相当于:set(key, value, time)
    
    psetex('name', 5, 'xxq')    # 如果存在,就会覆盖,返回:True;不存在,则无变化,返回:None
    

    psetex(name, time_ms, value) 设置过期时间:毫秒

    # 相当于:set(key, time, value, ex=True)
      
    psetex('name', 5000, 'xxq')    # 如果存在,就会覆盖,返回:True;不存在,则无变化,返回:None
    

    mset(args, *kwargs) 批量设置

    # 相当于:set(key, value, ex=True)
    
    mset({'name':'xxq', 'age':'18'})    # 存在就覆盖,不存在就创建,都返回:True
    mset(name='xxq', age='18')
    

    setrange(name, offset, value) 替换(key的名称, 索引, 值)

    res = conn.setrange('name', 3, '111')    # 替换'name'中索引为3的开始的3个字符为'111',超出原长度也可以
    

    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"
    

    可以用于独立用户统计的日活跃量(只适用于很大的数据量)

    get 获取值(获取的是bytes格式

    get(name)    # name:key的名字
    
    get('age')    # 存在则返回'age'的值:b'18';不存在则返回:None
    

    mget(keys, *args) 批量获取值

    mget('name', 'age')    # 存在就返回一个列表:[b'xxq1', b'18'],不存在就返回:[None, None]
    res = conn.mget(['name11', 'age11'])    # 存在就返回一个列表:[b'xxq1', b'18'],不存在就返回:[None, None]
    

    getset(name, value) 设置新的值,并返回原值(只需1次IO,就可以完成:获取+设置)

    getset('name', 'zsy')    # 存在就返回原值:b'xxq1',不存在就返回:None
    

    getrange(key, start, end) 获取子序列,根据字节获取,startend都是下标索引,区间是前闭后闭

    getrange('name', 0, 1)    # 存在则返回:b'zs'(name的索引为0和1所在的字符);不存在则返回:b''
    

    getbit(name, offset)

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

    bitcount(key, start=None, end=None) 获取name对应的值的二进制表示中 1 的个数

    属性释义
    key Redis的name
    start 位起始位置
    end 位结束位置(这里不是索引,而是bytes,前闭后闭)

    适用于独立用户统计

     

    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(name)

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

    incr(name, amount=1) 自增 name对应的值,当name不存在时,则创建name=amount;否则,则自增

    属性释义
    name Redis的name
    amount 自增数(必须是整数,可以是负数,默认是1)

    注:同incrby,主要用于统计网页访问量,文章阅读量等计数相关的操作(因为是单线程,不会存在并发相关的问题)

     

    incrbyfloat(name, amount=1.0) 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增

    属性释义
    name Redis的name
    amount 自增数(浮点型)
     

    decr(name, amount=1) 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。

    属性释义
    name Redis的name
    amount 自减数(整数,默认是1)
     

    append(key, value) 在redis name对应的值后面追加内容

    属性释义
    key Redis的name
    value 要追加的字符串
    key:redis的name
    value: 要追加的字符串
    

    二:list链表操作

     

    lpush(name, *values) 增加一个key,value可以多个

    lpush('left', 1, 2, 3, 4)    # 创建'left',添加顺序为1 2 3 4,最先添加的会被挤到最后
    
    链表内顺序为:
        4
        3
        2
        1
    

    rpush(name, *values) 增加一个key,value可以多个

    rpush('right', 1, 2, 3, 4)    # 创建'right',添加顺序为1 2 3 4,最先添加的会排在最前面
    
    链表内顺序为:
        1
        2
        3
        4
    

      

    llen(name) 统计链表长度

    llen('left')    # 如果存在,则返回:4,;如果不存在,则返回:0
    

    linsert(name, where, refvalue, value) 在链表指定位置插入值

    属性释义
    name redis的name
    where before或after(大小写皆可)
    refvalue 标杆值,即被插入对象:在它前后插入数据(如果存在多个标杆值,以找到的第一个为准)
    value

    要插入的数据

    linsert('left', 'before', 4, 666)    # 存在,则在链表'left'的第一个'4'前面插入'666',返回链表总行数;不存在则无变化;返回:0
    

    lset(name, index, value) 对name对应的list中的某一个索引位置重新赋值

    lset('left', 0, 4)    # 存在,则把'left'中的第一个值替换成'4';不存在则报错
    

    lrem(name, count, value) 在name对应的list中删除指定的值

    属性释义
    name redis的name
    value 要删除的值
    count count=0,删除列表中所有的指定值
    count>0 从前往后删除列表中的个数
    count<0 从后往前删除列表中的个数
     

    lpop(name) 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素

    lpop('left')    # 如果存在,则返回:b'1';不存在则返回:None
    

    rpop(name) 在name对应的列表的右侧获取第一个元素并在列表中移除,返回值则是第一个元素

    rpop('left')    # 如果存在,则返回:b'4';不存在则返回:None
    

    lindex(name, index) 查询name中某个索引位置的值

    lindex('left', 3)    # 如果存在,则返回:'b2';不存在则返回:None
    

    lrange(name, start, end) name对应的列表分片获取数据

    lrange('left', 2, 4)    # 存在则返回列表:[b'3', b'2', b'1'];不存在则返回:[]
    

    ltrim(name, start, end) 在name对应的列表中移除没有在start-end索引之间的值

    属性释义
    name redis的name
    start 索引的起始位置
    end 索引结束位置(大于列表长度,则代表不移除任何)
     

    rpoplpush(src, dst) 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边

    属性释义
    src 要取数据的列表的name
    dst 要添加数据的列表的name
     

    brpoplpush(src, dst, timeout=0) 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧

    属性释义
    src 取出并要移除元素的列表对应的name
    dst 要插入元素的列表对应的name
    timeout 当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
     

    自定义增量迭代(生成器的使用场景)

    # 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:
        # 1、获取name对应的所有列表
        # 2、循环列表
    # 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
    import redis
    conn=redis.Redis(host='127.0.0.1',port=6379)
    # conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])
    # conn.flushall()
    def scan_list(name,count=2):
        index=0
        while True:
            data_list=conn.lrange(name,index,count+index-1)
            if not data_list:
                return
            index+=count
            for item in data_list:
                yield item
    print(conn.lrange('test',0,100))
    for item in scan_list('test',5):
        print('---')
        print(item)
    

      

    三:hash哈希操作

     

    hset(name, key=None, value=None, mapping=None) 设置单个键值对

    hset('hash1', 'name', 'xxq')    # 不存在则创建,返回:1;存在则覆盖,并返回:0
    

    hmset(name, mapping) 设置多键值对

    hmset('hash2',{'key1':'value1','key2':'value2'})    # 不存在则创建,返回:1;存在则覆盖,并返回:0
    

    hget(name, key) 查询单个键值对

    hget('hash1', 'name')    # 存在则返回查询到的value;不存在则返回:None
    

    hmget(name, keys, *args) 查询多个键值对

    hmget('hash1', 'name1', 'name2')    # 存在则返回列表:[b'xxq', b'xxq'];不存在则返回:[None, None]
    hmget('hash1', ['name1', 'name2'])    # 存在则返回列表:[b'xxq', b'xxq'];不存在则返回:[None, None]
    

    hgetall(name) 获取一个name的全部信息(不建议使用,因为你不知道数据有多少

    hgetall('hash1')    # 若存在,则返回列表:{b'name': b'xxq11', b'name1': b'xxq', };若不存在,则返回:{}
    

    hlen(name) 获取name内键值对的个数

     
    hlen('hash')
    

    hkeys(name) 获取name内所有的key的值

    hkeys('hash')
    

    hvals(name) 获取name内所有的value的值

    hvals('hash')
    

    hexists(name, key) 检查name对应的hash是否存在当前传入的key

     hexists('hash')
    

    hdel(name,*keys)

    # 将name对应的hash中指定key的键值对删除
    print(re.hdel('xxx','sex','name'))
    

    hincrby(name, key, amount=1)

    自增name对应的hash中的指定key的值,不存在则创建key=amount
    属性释义
    name Redis中的name
    key hash对应的key
    amount 自增数(浮点数)
     

    hincrbyfloat(name, key, amount=1.0)

    自增name对应的hash中的指定key的值,不存在则创建key=amount
    属性释义
    name Redis中的name
    key hash对应的key
    amount 自增数(浮点数)
     

    hscan(name, cursor=0, match=None, count=None) - 不怎么用

    增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆
    属性释义
    name Redis的name
    cursor 游标(基于游标分批取获取数据)
    match 匹配指定key,默认None 表示所有的key
    count 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
     
     
     
     

     

    # 如:
        # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
        # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
        # ...
        # 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕
    

     

    hscan_iter(name, match=None, count=None)

    利用yield封装hscan创建生成器,实现分批去redis中获取数据(生成器的使用场景)
    属性释义
    match 匹配指定key,默认None 表示所有的key 匹配规则
    count 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
    for item in r.hscan_iter('xx', count=10):    # 每次获取100条
        print (item)

    其他操作

    #delete     直接删除表
    # res=conn.delete('age')
    # print(res)
    
    
    #exists  查看表是否还存在,存在几个打印出几
    # res = conn.exists('l1','l_test','l2')
    # res = conn.exists('l_test')
    # print(res)
    
    
    #expire Redis Expire 命令用于设置 key 的过期时间,key 过期后将不再可用。单位以秒计。
    # res = conn.expire('l_test',5)
    # print(res)
    
    
    #rename  给表改名字
    # conn.lpush('l1',1,2,3)
    # conn.rename('l1','l2')
    # Redis MOVE 命令用于将当前数据库的 key 移动到给定的数据库 db 当中。
    res=conn.move('l2',db2)

    四:set 集合操作

     

    sadd(name,values)

    name对应的集合中添加元素
    

    scard(name)

    获取name对应的集合中元素个数
    

    sdiff(keys, *args)

    在第一个name对应的集合中且不在其他name对应的集合的元素集合
    

    sdiffstore(dest, keys, *args)

    # 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
    

    sinter(keys, *args)

    # 获取多一个name对应集合的并集
    

    sinterstore(dest, keys, *args)

    # 获取多一个name对应集合的并集,再讲其加入到dest对应的集合中
    

    sismember(name, value)

    # 检查value是否是name对应的集合的成员
    

    smembers(name)

    # 获取name对应的集合的所有成员
    

    smove(src, dst, value)

    # 将某个成员从一个集合中移动到另外一个集合
    

    spop(name)

    # 从集合的右侧(尾部)移除一个成员,并将其返回
    

    srandmember(name, numbers)

    # 从name对应的集合中随机获取 numbers 个元素
    

    srem(name, values)

    # 在name对应的集合中删除某些值
    

    sunion(keys, *args)

    # 获取多一个name对应的集合的并集
    

    sunionstore(dest,keys, *args)

    # 获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中
    

    sscan(name, cursor=0, match=None, count=None)

     

    sscan_iter(name, match=None, count=None)

    # 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大
    

    五:zset有序集合操作

    有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。

     

    zadd(name, *args, **kwargs)

    # 在name对应的有序集合中添加元素
    # 如:
         # zadd('zz', 'n1', 1, 'n2', 2)
         # 或
         # zadd('zz', n1=11, n2=22)
    

      

    zcard(name)

    # 获取name对应的有序集合元素的数量
    

    zcount(name, min, max)

    # 获取name对应的有序集合中分数 在 [min,max] 之间的个数
    

    zincrby(name, value, amount)

    # 自增name对应的有序集合的 name 对应的分数
    

    r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

    # 按照索引范围获取name对应的有序集合的元素
     
    # 参数:
        # name,redis的name
        # start,有序集合索引起始位置(非分数)
        # end,有序集合索引结束位置(非分数)
        # desc,排序规则,默认按照分数从小到大排序
        # withscores,是否获取元素的分数,默认只获取元素的值
        # score_cast_func,对分数进行数据转换的函数
     
    # 更多:
        # 从大到小排序
        # zrevrange(name, start, end, withscores=False, score_cast_func=float)
     
        # 按照分数范围获取name对应的有序集合的元素
        # zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
        # 从大到小排序
        # zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)
    

      

    zrank(name, value)

    # 获取某个值在 name对应的有序集合中的排行(从 0 开始)
     
    # 更多:
        # zrevrank(name, value),从大到小排序
    

    zrangebylex(name, min, max, start=None, num=None)

    # 当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的 值 (lexicographical ordering)来进行排序,而这个命令则可以返回给定的有序集合键 key 中, 元素的值介于 min 和 max 之间的成员
    # 对集合中的每个成员进行逐个字节的对比(byte-by-byte compare), 并按照从低到高的顺序, 返回排序后的集合成员。 如果两个字符串有一部分内容是相同的话, 那么命令会认为较长的字符串比较短的字符串要大
     
    # 参数:
        # name,redis的name
        # min,左区间(值)。 + 表示正无限; - 表示负无限; ( 表示开区间; [ 则表示闭区间
        # min,右区间(值)
        # start,对结果进行分片处理,索引位置
        # num,对结果进行分片处理,索引后面的num个元素
     
    # 如:
        # ZADD myzset 0 aa 0 ba 0 ca 0 da 0 ea 0 fa 0 ga
        # r.zrangebylex('myzset', "-", "[ca") 结果为:['aa', 'ba', 'ca']
     
    # 更多:
        # 从大到小排序
        # zrevrangebylex(name, max, min, start=None, num=None)
    

      

    zrem(name, values)

    # 删除name对应的有序集合中值是values的成员
     
    # 如:zrem('zz', ['s1', 's2'])
    

    zremrangebyrank(name, min, max)

    # 根据排行范围删除
    

    zremrangebyscore(name, min, max)

    # 根据分数范围删除
    

    zremrangebylex(name, min, max)

    # 根据值返回删除
    

    zscore(name, value)

    # 获取name对应有序集合中 value 对应的分数
    

    zinterstore(dest, keys, aggregate=None)

    # 获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作
    # aggregate的值为:  SUM  MIN  MAX
    

    zunionstore(dest, keys, aggregate=None)

    # 获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作
    # aggregate的值为:  SUM  MIN  MAX
    

    zscan(name, cursor=0, match=None, count=None, score_cast_func=float)

     

    zscan_iter(name, match=None, count=None,score_cast_func=float)

    # 同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作
    

    六:其他操作

     

    delete(*names)

    # 根据删除redis中的任意数据类型
    

    exists(name)

    # 检测redis的name是否存在
    

    keys(pattern='*')

    # 根据模型获取redis的name
     
    # 更多:
        # KEYS * 匹配数据库中所有 key 。
        # KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
        # KEYS h*llo 匹配 hllo 和 heeeeello 等。
        # KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 
    

      

    expire(name ,time)

    # 为某个redis的某个name设置超时/过期时间
    

    rename(src, dst)

    # 对redis的name重命名为
    

    move(name, db))

    # 将redis的某个值移动到指定的db下
    

    randomkey()

    # 随机获取一个redis的name(不删除)
    

    type(name)

    # 获取name对应值的类型
    

    scan(cursor=0, match=None, count=None)

     

    scan_iter(match=None, count=None)

    # 同字符串操作,用于增量迭代获取key
    

    七:管道

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

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

      

    八:Django中使用redis

     

    方式一:

     

    utils文件夹下,建立redis_pool.py

    import redis
    #建立连接池 POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='123456',max_connections=1000)

    视图函数中:

    import redis
    from django.shortcuts import render,HttpResponse
    from utils.redis_pool import POOL
    
    def index(request):
        conn = redis.Redis(connection_pool=POOL) #从连接池中拿出一个链接
        conn.hset('kkk','age',18)
    
        return HttpResponse('设置成功')
    def order(request): conn = redis.Redis(connection_pool=POOL) conn.hget('kkk','age') return HttpResponse('获取成功')

      

    方式二:django提供的方案

     

    安装django-redis模块

    pip3 install django-redis
    setting中
    # redis配置
    #以后django的缓存,用的就是redis,很方便使用redis的链接 CACHES = {
    #第一个redis库,可以用很多个,配置多个就可以了 "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "123", } } }
    视图函数中:
    from django_redis import get_redis_connection
    conn = get_redis_connection('default')
    print(conn.hgetall('xxx'))




    from django.core.cache impoet cache
    cache.set('name','lqz',4)#往缓存中放key和value,其实放到了redis中,以后可以直接放缓存

    cache.set('xxx',test_redis)
    return HttpResponse('人的年龄是:%s'%age)

     

  • 相关阅读:
    手把手教你利用create-nuxt-app脚手架创建NuxtJS应用
    初识NuxtJS
    webpack打包Vue应用程序流程
    用选择器代替表格列的筛选功能
    Element-UI
    Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]
    Sparse Principal Component Analysis via Rotation and Truncation
    Generalized Power Method for Sparse Principal Component Analysis
    Sparse Principal Component Analysis via Regularized Low Rank Matrix Approximation(Adjusted Variance)
    Truncated Power Method for Sparse Eigenvalue Problems
  • 原文地址:https://www.cnblogs.com/ltyc/p/14238082.html
Copyright © 2020-2023  润新知