一、首先了解下redis的基本使用命令:
Redis支持5种数据类型:string、hash、list、set、sorted sert(有序集合):
1、string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的,也就说它可以包含任何数据,如图片、序列化的对象等。
基本操作命令:
127.0.0.1:6379> set name Donfag
OK
127.0.0.1:6379> get name
"Donfag"
127.0.0.1:6379> del name
(integer) 1
2、hash相当于python中的字典,所以非常适合存储值对角的信息,reids中每个hash可以存储2的32次方减1个键值对(40多亿)。主要使用hget、hmset命令:
127.0.0.1:6379> hmset person name "Donfag" age 20 city "ShangHai"
OK
127.0.0.1:6379> hget person name
"Donfag"
127.0.0.1:6379> hget person age
"20"
127.0.0.1:6379> hget person city
"ShangHai"
127.0.0.1:6379> hget person job
(nil)
hmset命令相当于python中给person这个字典赋值:person={"name":"Donfag","age":20,"city":"ShangHai"}。hget时由于没有job这个key所以返回了空值nil。
也可以用hmget批量获取一个hash中的所有值:
127.0.0.1:6379> hmget person name age city job
1) "Donfag"
2) "20"
3) "ShangHai"
4) (nil)
127.0.0.1:6379> del user
(integer) 1
3、list是按照插入顺序排列的字符串列表,可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键不存在,则为该键创建一个新的列表;如果列表中所有的元素都被移除,那么该键也将会被从数据库中删除。list中可以包含最大元素数量是4294967295个。主要命令:lpush、lrange、rpush:
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpush mylist b
(integer) 2
127.0.0.1:6379> lpush mylist c d e
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> rpush mylist A
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
6) "A"
可以用lrem删除指定的元素,用ltrim删除指定范围的元素:
127.0.0.1:6379> lrem mylist 1 A
(integer) 1
127.0.0.1:6379> lrange mylist 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> lrange mylist 0 -1
1) "j"
2) "i"
3) "h"
4) "g"
5) "f"
6) "e"
7) "d"
8) "c"
9) "b"
10) "a"
127.0.0.1:6379> ltrim mylist 1 3
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "i"
2) "h"
3) "g"
4、set 是string类型的无序集合,集合的成员是唯一的,也就是说没有重复的元素,每个集合可以存储40多亿个成员。主要命令:sadd、smembers、srem:
127.0.0.1:6379> sadd myset a
(integer) 1
127.0.0.1:6379> sadd myset a
(integer) 0
127.0.0.1:6379> sadd myset b c d
(integer) 3
127.0.0.1:6379> smembers myset
1) "b"
2) "a"
3) "d"
4) "c"
127.0.0.1:6379> srem myset a
(integer) 1
127.0.0.1:6379> smembers myset
1) "b"
2) "d"
3) "c"
5、sorted set 是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动按照新的值自动调整顺序。主要命令:zadd、zrange:
127.0.0.1:6379> zadd myzset 1 a
(integer) 1
127.0.0.1:6379> zadd myzset 1 a
(integer) 0
127.0.0.1:6379> zadd myzset 2 b
(integer) 1
127.0.0.1:6379> zadd myzset 3 c
(integer) 1
127.0.0.1:6379> zadd myzset 4 four 5 five
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "a"
2) "b"
3) "c"
4) "four"
5) "five"
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "four"
8) "4"
9) "five"
10) "5"
可以用zrem删除集合中的指定成员;用zremrangebyscore按分数范围删除指定成员:
127.0.0.1:6379> zrem myzset a
(integer) 1
127.0.0.1:6379> zremrangebyscore myzset 2 4
(integer) 3
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "five"
2) "5"
二、python中的redis模块:
reids模块不是python标准模块,需要运行pip install redis进行安装。
可以用如下脚本查看redis模块的api:
import redis r = redis.Redis(host="127.0.0.1",port=6379,password="12344321",db=0) help(r)
1、连接redis:
单连接:
import redis r = redis.Redis(host="127.0.0.1",port=6379,password="12344321",db=1) r.set('name',"Donfag") print(r.get("name"))
连接池:
pool = redis.ConnectionPool(host="127.0.0.1",port=6379,password="12344321",db=1) r = redis.Redis(connection_pool=pool) r.set('name',"Donfag2") print(r.get("name"))
2、操作string类型
(1)、set(name,value,ex=None,px=None,nx=False,xx=False)
用于新增键/值对,参数说明如下:
name:键
value:值
ex:过期时间(单位:秒)
px:过期时间(单位:毫秒)
nx:如果设置为True,则只有name不存在时,当前set操作才能执行
xx:如果设置为True,则只有name存在时,当前set操作才能执行
示例代码:
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379,password="12344321",db=1) r = redis.Redis(connection_pool=pool) r.set('name',"Donfag2",ex=30) print(r.get("name"))
设置name的过期时间是30秒,30秒后name会自动被删除。
(2)、setnx(name,value)
只有在name不存在时,才能进行设置操作,相当于:set(name,value,nx=True)
(3)、setex(name,time,value)
可以设置键值的过期时间,单位为秒,如:setex(name,30,value)相当于:set(name,value,ex=30)
(4)、psetex(name,time_ms,value)
可以设置键值的过期时间,单位为毫秒,如:psetex(name,10000,value)相当于:set(name,value,px=10000)
(5)、mset(*args,**kwargs)
用于批量设置键值对。根据映射设置键值对,可以单独提供一个字典参数,主要用法如下:
r.mset({'name3':'Donfag3','name4':'Donfag4'})
(6)、mget(keys,*args)
用于批量获致键值,如:
a = r.mget('name1','name2')
b = r.mget(['name3','name4'])
print(a)
print(b)
返回结果:
[b'Donfag1', b'Donfag2']
[b'Donfag3', b'Donfag4']
(7)、getset(name,value)
用于设置新值并返回原来的值。
(8)、getrange(key,start,end)
根据字节获取字符串。如:r.getrange('name2',0,3),获取到的结果是:Donf
(9)、setrange(name,offset,value)
从指定字符串索引位置开始向后替换字符串内容。如:r.setrange('name2',3,'gfang')如果name=Donfag2,修改后变为Dongfang
(10)、strlen(name)
返回name键对应值的字节长度。
(11)、append(key,value)
在name对应的值后面追加内容。如:
r.set('name','Zhang')
r.append('name','San')
print(r.get('name'))
获取的结果是:b'ZhangSan'
(12)、exists(name)
判断对应的键是否在存,存在返回True或则False
(13)、delete(name1,name2,...)
用于删除单个键或批量删除多个键,并返回删除的数量,如:
r.delete('name1')
r.delete('name2','name3','name4')
3、操作hash类型
(1)、hset(name,key,value)
设置name对应hash中的一个键值对,如果键值对不存在则创建。如果键值对存在则修改。如:r.hset('user','name','Donfag')
(2)、hmset(name,mapping)
批量设置键值对。如:r.hmset('user',{ 'name':'Donfag','age':20,'city':'ShangHai' })
不过此方法在python4.0及以上版本会弃用,可以直接使用hset方法。
(3)、hget(name,key)
获取name对应原key值。
(4)、hmget(name,key,*args)
批量获取name对应的hash中多个key值。如:r.hmget('user',['name','age'])
4、操作list类型
(1)、lpush(name,values)
在name对应的list里添加元素,每个新的元素都添加到列表的最左边。如:r.lpush('name',1,2,3,4)
(2)、linsert(name,where,refvalue,value)
name对应的列表的某一个值前或后插入一个新值、参数说明:
name:键
where:before或after
refvalue:在where前后插入的数据
value:要插入的数据
示例:
r.linsert('name',where='before',refvalue='2',value='a')
在此例中:向name列表中左边第一个出现的元素2前插入元素a
(3)、lset(name,index,value)
对name对应的列表的某一个索引位置赋值。如:
r.delete('name')
r.lpush('name',1,2,3)
r.lset('name',2,'b')
print(r.lrange('name',0,-1))
结果是:
['3', '2', 'b']
(4)、lrem(name,count,value)
在name对应的list中删除指定的值。示例:
r.delete('name')
r.lpush('name',1,2,3,4,8,8,8,9)
r.lrem('name',2,8)
print(r.lrange('name',0,-1))
返回结果:
['9', '8', '4', '3', '2', '1']
上例的意思是:删除列表name中第一次出现的2个元素8
(5)、lpop(name)
删除name列表左侧的第一个元素,并返回它的值。如:
r.delete('name')
r.lpush('name',1,2,3,4)
r.lpop('name')
print(r.lrange('name',0,-1))
返回结果:
['3', '2', '1']
(6)、lrange(name,start,end)
在name对应的列表分片获取数据,使用方法见上。
5、操作set类型
(1)、sadd(name,values)
为name集合添加一个或我个元素。如:r.sadd('myset',1,2,3)
(2)、scard(name)
获取集合name中的元素的个数。如:r.scard('myset')
(3)、smembers(name)
获取name集合中的所有元素。如:r.smembers('myset')
(4)、adiff(keys,args)
获取多个集合的差集。如:
r.sadd('set1',1,2,3)
r.sadd('set2',2,3,4)
print(r.sdiff('set1','set2'))
返回结果:{b'1'}
(5)、sinter(keys,args)
获取多个集合的交集。如:
r.delete('set1')
r.delete('set2')
r.sadd('set1',1,2,3)
r.sadd('set2',2,3,4)
print(r.sinter('set1','set2'))
返回结果:
{b'3', b'2'}
(6)、sunion(keys,args)
获取多个集合的并集。如:
r.delete('set1')
r.delete('set2')
r.sadd('set1',1,2,3)
r.sadd('set2',2,3,4)
print(r.sunion('set1','set2'))
返回结果:
{b'1', b'4', b'2', b'3'}
6、操作sorted set类型
(1)、zadd(args,kwargs)
的name对应的有序集合中添加元素和元素对应的分数。如:
r.zadd('myzset',{'a':1,'b':2,'c':3})
(2)、zcard(name)
获取name对应的有序集合中的元素个数。如:
r.zcard('myzset')
(3)、zrange(name,start,end,desc=False,withscores=False,score_cast_func=fload)
按照索引范围获取name集合的元素。如:
r.zadd('myzset',{'a':1,'b':2,'c':3})
print(r.zrange('myzset',0,-1,desc=True,withscores=True))
返回结果:
[(b'c', 3.0), (b'b', 2.0), (b'a', 1.0)]
(4)、zrem(name,values)
删除name集合中与vales对应的元素。如:
r.zadd('myzset',{'a':1,'b':2,'c':3})
r.zrem('myzset','a','b')
print(r.zrange('myzset',0,-1))
返回结果:
[b'c']
(5)、zscore(name,value)
获取name有序集合中与value对应的分数。如:
r.zadd('myzset',{'a':1,'b':2,'c':3})
print(r.zscore('myzset','c'))
7、其它操作
(1)、r.keys() 列出所有键
(2)、r.exists('name') 判断键是否存在。存在返回True,或者False
(3)、r.delete('name') 删除键。返回1或0
(4)、r.flushdb() 清除当前数据库所有数据。成功返回True,失败返回False