以前辰哥已经给你们教了Python如何去链接Mysql(实战|教你用Python玩转Mysql),并进行相应操做(插、查、改、删)。除了Mysql外,Python最常搭配的数据库还有Redis。python
那么今天辰哥就来给你们讲解一下Python如何使用Redis,并进行相关的实战操做。git
提示:本文讲解了Redis经常使用的方法,推荐收藏。github
01redis
Redis的安装sql
window版Redis安装包下载地址:数据库
https://github.com/MicrosoftArchive/redis/releases缓存
Linux版Redis安装包下载地址:cookie
上面两张图显示的都是截止到目前,Redis最新版本,辰哥已经把这上面提到的安装包下载好,后台回复:redis安装包,直接获取。dom
提示:这里就不在展现如何安装,基本都是下一步的操做。由于安装包可能有的读者不知道在哪下载,这里就讲一下。下面开始具体的实际操做。
02
Redis简介
Redis是一个key-value存储系统(数据库)。redis支持存储的value类型有不少种,如string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。
为了保证效率,数据都是缓存在内存中。能够周期性的把更新的数据写入磁盘或者把修改操做写入追加文件。Redis提供了Python,Ruby,Java,Php的客户端,使用很方便,本文主要以Python来说解Redis的操做。
1.安装redis库
经过下面命令进行安装
pip install redis
redis库:Python3连接redis
2.python链接redis
python链接redis分两种状况(一种是有密码,一种是无密码)
由于redis安装的时候,默认是无密码的
有密码:
import redis
r = redis.Redis(host="192.168.31.196", port=6379,password="123456")
密码是:123456,host是redis对应的主机ip,port是端口6379(redis默认端口)
无密码:
import redis
r = redis.Redis(host='192.168.31.196', port=6379)
上面的链接方式属于普通链接(相对于链接池来讲),此外还有链接池(connection pool)的链接方式,能够管理全部的链接,避免每次创建、释放链接带来的开销。
链接池:
import redispool = redis.ConnectionPool(host='192.168.31.196', port=6379)r = redis.Redis(connection_pool=pool)
先看一个例子
import redisr = redis.Redis(host='192.168.31.196', port=6379)r.set('name1', 'chenge') #添加r.set('name2', '辰哥') #添加print(r.get('name1')) #获取print(r.get('name2')) #获取
在经过Python代码链接redis,并设置了两个key-value(name1:chenge 和 name2:辰哥)
能够看到这里英文正常显示,中文乱码,为了解决中文乱码问题,在链接Redis的时候,加入utf-8的编码格式
import redisr = redis.Redis(host='192.168.31.196', port=6379,decode_responses=True, charset='UTF-8', encoding='UTF-8')r.set('name1', 'chenge') #添加r.set('name2', '辰哥') #添加print(r.get('name1')) #获取print(r.get('name2')) #获取
这样就能够正常显示中文了
ok,链接好Redis以后,下面开始讲解Redis的各类操做。Redis存储结构是key-value,不一样的是value类型的不一样,因此这里就对不一样的类型进行详细介绍。
03
string操做
1.set
r.set('name1', 'chenge') #添加
在Redis中设置值,默认不存在就建立,存在就修改
此外set设置的时候还能够加入过时时间(相似cookie有效期这样),一旦过时以后,再经过key去取value时,value的结果为None。
还能够这样设置
#设置过时时间(秒),这里是5秒过时r.setex('key1',5,'value1')#设置过时时间(毫秒),这里是1000耗秒过时r.psetex("key2",1000,"value2")
2.mset
set是设置单个key-value,mset能够批量设置多个key-value
# 批量设置值r.mset({'key3':'value3', 'key4':'value4'})print(r.get('key3'))print(r.get('key4'))
3.mget
get能够取出单个value,mget能够批量取出多个value
# 批量获取-法一print(r.mget("key3","key4"))# 批量获取-法二v_list=["key3","key4"]print(r.mget(v_list))
4.getrange
getrange(key, start, end),根据start和end去截取序列(取出的value)
print(r.getrange("key3",0,3)) # 输出:valu
5.append
append(key, value),在key对应的值后面追加内容
print(r.get("key3")) #输出:'value3r.append("key3","chenge")print(r.get("key3")) #输出:value3chenge
6.strlen
strlen(key),返回key对应值的字节长度(一个汉字3个字节)
r.set("key5","辰哥")print(r.strlen("key5")) # 输出:6r.set("key6","chenge")print(r.strlen("key6")) # 输出:6
以上这6个方法是string字符串中经常使用的,此外还有一些方法(不经常使用),辰哥就不一一介绍,须要用到的时候能够去redis官方文档学习。
04
List操做
Redis中的List在内存中按照一个key对应一个List来存储
1.lpush和rpush
lpush(key,values),每一个新元素都添加到列表最左边
rpush(key,values),每一个新元素都添加到列表最右边
r.lpush("key7",1)r.lpush("key7",2,3,4)#保存在列表中的顺序为4,3,2,1r.rpush("key8",1)r.rpush("key8",2,3,4)#保存在列表中的顺序为1,2,3,4
2.lpushx和rpushx
lpushx(key,value),添加元素时,只有key存在,value添加到列表最左边
rpushx(key,value),添加元素时,只有key存在,value添加到列表最右边
3.llen
llen(key),返回key对应的list元素的个数
r.lpush("key9",2,3,4) # 输出:3
4.linsert
linsert(key, where, refvalue, value)),在name对应的列表的某一个值前或后插入一个新值。
r.linsert("key9","BEFORE","2","chenge")#在列表内找到第一个元素2,在它前面插入chenge# 输出:chenge,2,3,4
5.lset
r.lset(key, index, value),对list中的某一个索引位置从新赋值
r.lset("key9",0,"辰哥")
6.lpop
lpop(name),移除列表的左侧第一个元素,返回值则是第一个元素
print(r.lpop("key9"))
7.lindex
lindex(name, index),根据索引获取列表内元素,好比返回第一个元素
print(r.lindex("key9",1))
8.lrange
lrange(name, start, end), 分片获取元素
print(r.lrange("key9", 0, -1)) #输出所有内容
# 输出:['4', '3', '2']
9.ltrim
ltrim(name, start, end),移除列表内没有在该索引以内的值
r.ltrim("key9", 0, 2)
05
Hash操做
Redis中的hash在内存中相似一个key对应一个dict来存储
1.hset和hget
hset(name, key, value),name对应的hash中设置一个键值对(不存在,则建立,不然,修改)
hget(name,key),在name对应的hash中根据key获取value
r.hset("key10","a1","a2")#在key10对应的hash中根据key获取valueprint(r.hget("key10","a1"))#输出:a2
2.hgetall、hmset和hmget
hgetall(name),获取name对应hash的全部键值
print(r.hgetall("key10")) # 输出:{'a1': 'a2'}
hmset(name, mapping),在name对应的hash中批量设置键值对
其中mapping:字典
dic = {"c1":"cc","d1":"dd"}r.hmset("key11",dic)print(r.hget("key11","c1")) #输出:cc
hmget(name, keys, *args),在name对应的hash中获取多个key的值
k_list=["c1","d1"]print(r.hmget("key11",k_list)) # 输出:['cc', 'dd']print(r.hmget("key11","c1","d1")) # 输出:['cc', 'dd']
3.hlen、hkeys和hvals
hlen(name),获取hash中键值对的个数
hkeys(name),获取hash中全部的key的值
hvals(name),获取hash中全部的value的值
print(r.hlen("key11")) #输出:2print(r.hkeys("key11")) #输出:['c1', 'd1']print(r.hvals("key11")) #输出:['cc', 'dd']
4.hexists和hdel
hexists(name, key),检查name对应的hash是否存在当前传入的key
hdel(name,*keys),删除指定name对应的key所在的键值对
print(r.hexists("key11","c1"))#输出:Trueprint(r.hexists("key11","c2"))#输出:False#删除指定key11对应的c1所在的键值对r.hdel("key11","c1")print(r.hexists("key11","c1"))#输出:False
06
Set操做
Set集合就是不容许重复的列表
1.sadd、smembers和scard
sadd(key,values),给key对应的集合中添加元素
smembers(key),获取key对应的集合的全部成员
scard(key),获取key对应的集合中的元素个数
r.sadd("key12","a1")r.sadd("key12","a1","a1")print(r.smembers("key12")) #输出:{'a1'}print(r.scard("key12")) #输出:1
2.sdiff 和 sdiffstore
sdiff(keys, *args),在第一个key对应的集合中且不在其余key对应的集合的元素集合
r.sadd("key13","a1","a2","a4")r.sadd("key14","a2","a3")r.sadd("key15","a1","a2","a3")print(r.sdiff("key13","key14","key15"))#输出:{'a4'}
sdiffstore(newkey, keys, *args),至关于把sdiff获取的值加入到newkey对应的集合中
r.sdiffstore("key16","key13","key14","key15")print(r.smembers("key16")) #输出:{'a4'}
3.sinter和 sinterstore
sinter(keys, *args),获取多个key对应集合的并集
r.sadd("key13","a1","a2","a4")r.sadd("key14","a2","a3")r.sadd("key15","a1","a2","a3")print(r.sinter("key13","key14","key15"))#输出:{'a2'}
sinterstore(newkey, keys, *args),获取多个key对应集合的并集,再讲其加入到newkey对应的集合中
r.sinterstore("key17","key13","key14","key15")print(r.smembers("key17")) #输出:{'a2'}
4.sismember、smove和 spop
sismember(name, value),检查value是不是name对应的集合内的元素
r.sadd("key13", "a1", "a2", "a4")print(r.sismember("key13","a1")) # 输出:Trueprint(r.sismember("key13","a5")) # 输出:False
smove(src, dst, value),将某个元素从一个集合中移动到另一个集合
r.sadd("key18", "a1", "a2", "a4")r.sadd("key19", "a5")r.smove("key18", "key19", "a2")print(r.smembers("key19")) #输出:{'a2', 'a5'}
spop(name),从集合的右侧移除一个元素,并将其返回
print(r.spop("key19")) #输出:a5print(r.smembers("key19")) #输出:{'a2'}
5.有序集合
此外还有有序集合操做:在集合的基础上,为每个元素排序。
zadd(name, mapping),其中name为有序集合名,mapping为dict类型的键-值对
zcard(name),获取有序集合内元素的数量
zcount(name, min, max),#获取有序集合中分数在[min,max]之间的个数
r.zadd("key20", {"a": 10, "b": 3, "c": 8})print(r.zcard("key20")) #输出:3print(r.zcount("key20", 2, 5)) #输出:1print(r.zcount("key20", 7, 15)) #输出:1
07
通用操做
以上是按不一样类型的value进行对应的操做,redis有一些无视类型的通用操做方法。(这里就只是列出方法并说明,就再也不一一演示)
delete(*names),根据name删除redis中的任意数据类型
exists(name),检测redis的name是否存在
keys(pattern='*'),根据* ?等通配符匹配获取redis的name
expire(name ,time),为某个name设置超时时间
rename(src, dst),重命名
move(name, db)),将redis的某个值移动到指定的db下
randomkey(),随机获取一个redis的name(不删除)
type(name),获取name对应值的类型
08
小结
今天的技术讲解文章就到此结束,主要是将了如何经过python去链接Redis,Redis的存储结构是key-value类型,本文按value类型分类讲解了string字符串操做、list操做、hash操做、set操做以及通用操做。(干货文章,推荐收藏)