zoukankan      html  css  js  c++  java
  • redis——redis入门(常用数据类型:string hash)

    一、redis之string操作

     1.set的使用

    import redis
    conn=redis.Redis()
    ###  1 set 的使用
    # name:key值
    # value:value值
    # ex:过期时间,按秒记
    # px:过期时间(毫秒)
    # nx:如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
    # xx:如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
    # conn.set('name','egon')
    # conn.set('name','lqz',nx=True)
    # conn.set('name','lqz',xx=True)
    # conn.set('age','18',xx=True)

    conn.close()

    2.get 获取值

    import redis
    conn=redis.Redis()
    
    res=conn.get('name')
    print(res)  # 返回的数据是byte格式,如果要用需要转一下
    
    conn.close()

    3. setnx(name, value)  不好用

    # 设置值,只有name不存在时,执行设置操作(添加),如果存在,不会修改
    conn.setnx('name','lili')

    4. setex( name, time, value)  不好用

    conn.setex('name',3,'lili')

    5. mset 批量设置,推荐,这样可以减少网路IO

    conn.mset({'name':'lili','age':19,'sex':''})

    6. mget 批量获取

    res=conn.mget('name','age') #方式一
    res=conn.mget(['name','age']) #方式二
    print(res)

    7. getset(name, value)  推荐

    # 一次网络io,完成了取值和设置
     res=conn.getset('name','lili')
     print(res)

    8. getrange(key, start, end)

    # 前闭后闭区间 方式一
    res=conn.getrange('name',0,4)
    print(res)
    # 最终效果跟上面一样 方式二 res=conn.get('name').decode('utf-8') print(res[0:5])

    9. setrange(name, offset, value)

    conn.set('name','qwqehhdjdndsdsjhefhj')
    # conn.setrange('name',0,'tt') #从第0个位置开始设置为tt,意思是把前两个位置变成tt  复数不支持
    # conn.setrange('name',5,'tt')
    conn.setrange('name',7,'ttttttttttttttttttttttttt')

    10.  setbit(name, offset, value) 设置位操作

    作用:做独立用户统计:比如统计用户是否登录/日活(每个用户是一个位),比存id省空间的多

    #conn.set('n1','foo')
    #res=conn.get('n1')
    #print(res) #foo
    #那么字符串foo的二进制表示为:01100110 01101111 01101111
    # conn.setbit('n1',7,1) #把第七位改成1
    # #那么字符串foo的二进制表示为:01100111 01101111 01101111
    # res=conn.get('n1')
    #print(res) #goo

    11.getbit(name, offset)

    #获取bit位的第几个位置,看是1还是0
    res=conn.getbit('n1',7)
    print(res)

    12. bitcount(key, start=None, end=None)  --->即10.的作用

    end:指的是bytes,前闭后闭区间
    res=conn.bitcount('n1',0,3) #统计从0开始直到第3个bytes结束总共有多少个1
    print(res)

    13.   incr   自增  decr  自减   incrbyfloat自增浮点型

    ### incr  decr 重点
    # 用途:统计网页访问量,文章阅读量,粉丝数量,计数相关(不会存在并发安全的问题)
    conn.incr('age',1) #每次自增1
    conn.incr('age',-2)#每次自减2
    res=conn.get('age')
    
    conn.decr('age')#每次自减1
    res=conn.get('age')
    print(res)

    14. append

    conn.append('name','lili') #末尾增加
    
    res=conn.get('name')
    print(res) 

     总结:

    ******
    set:超时时间,nx,xx
    get
    mset
    mget
    incr
    decr
    getrange
    setrange
    append

    二、redis之hash操作(无序性)

     1.hset(name,key,value)

    import redis
    conn=redis.Redis()
    
    conn.hset('userinfo','name','lili')
    conn.hset('userinfo','age','18')
    conn.hset('userinfo','sex','')
    
    conn.close()

    2.hmset(name,mapping) 批量设置

    # 可能因为版本问题出现弃用警告,但是数据还是存进去了
    conn.hmset('userinfo_2',{'name':'haha','age':18,'sex':''})

    3.hget

    res=conn.hget('userinfo','name')
    print(res) #b'lili' 

    4.hmget

    #方式一
    # res=conn.hmget('userinfo','age','name') #[b'18', b'lili']
    #方式二
    res=conn.hmget('userinfo',['age','name']) #[b'18', b'lili']
    print(res)

    5.hgetall

    res=conn.hgetall('userinfo') 
    print(res)#{b'name': b'lili', b'age': b'18', b'sex': b'xe7x94xb7'}

    6. hlen(name)

    res=conn.hlen('userinfo')
    print(res)#3

    7. hkeys(name)

    res=conn.hkeys('userinfo')
    print(res)#[b'name', b'age', b'sex']

    8. hvals(name)

    res=conn.hvals('userinfo')
    print(res)#[b'lili', b'18', b'xe7x94xb7']

    9. hexists(name, key)

    # res=conn.hexists('userinfo','hobby')#False
    res=conn.hexists('userinfo','name')#True
    print(res)

    10. hdel

    res=conn.hdel('userinfo','name','age')
    print(res)#2

    11. hincrby        还有一个hincrbyfloat增float类型

    用途:统计个人站点的访问量、点赞量、评论量等等,都放到一个字典(省空间)中,不需要把每一条放一个字符串(占空间)

    # res=conn.hset('userinfo','age',19)#影响1条
    conn.hincrby('userinfo','age')#age自增1,每执行一次增加1
    res=conn.hget('userinfo','age')#获取age 打印出b'2'
    print(res)

    12. hscan 批量取出,不推荐用,占用空间会越来越大

    # for i in range(1000):
    #     conn.hset('test','test_'+str(i),str(i))
    
    '''
    # 不建议使用,一次性获取全部,容易造成  oom 内存溢出(撑爆内存)
    res=conn.hgetall('test')
    print(res)
    '''
    # 不怎么用
    
    # name,redis的name
    # cursor,游标(基于游标分批取获取数据)
    # match,匹配指定key,默认None 表示所有的key
    # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
    
    
    res=conn.hscan('test',cursor=478,count=500)#游标获取
    
    print(len(res[1]))#500
    print(res)#(703, {b'test_840': b'840', b'test_664': b'664', b'test_21': b'21', b'test_770': b'770', b'test_748': b'748',...)

    13.hscan_iter  一部分一部分取出,是个生成器    推荐用,每次占固定空间

    res=conn.hscan_iter('test',count=10)
    print(res) # <generator object Redis.hscan_iter at 0x000001A13DE8A890>
    
    # 以后要使用hgetall的时候,要使用如下方式
    for item in conn.hscan_iter('test',count=10):
        print(item) #10条10条打印出来全部
    
    print(res)#<generator object Redis.hscan_iter at 0x000001A13DE8A890>

    总结:

    hset
    hget
    hmset
    hmget
    hincrby
    hdel
    hexists
    
    hscan_iter/hgetall 区分

     参考 http://www.xuexianqi.top/archives/270.html

  • 相关阅读:
    lombok 异常:Lombok needs a default constructor in the base class less... (Ctrl+F1) Inspe
    kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing
    使用Java将搜狗词库文件(文件后缀为.scel)转为.txt文件
    RedHat linux服务器安装elasticsearch且设置公网访问
    return array 评论添加状态和提示信息
    .保护Express应用程序
    SQL Injection(SQL注入漏洞)
    POST在发送数据的时候使用的是HTTP命令
    assert_option()可以用来对assert()进行一些约束和控制
    supercool.sh文件里,有哪些恶意的命令
  • 原文地址:https://www.cnblogs.com/guojieying/p/14245585.html
Copyright © 2011-2022 走看看