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

原文地址:https://www.cnblogs.com/guojieying/p/14245585.html