一、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