redis是一个很是重要的非关系型(No-Sql)数据库,数据库分两种类型(关系型数据库和非关系型数据库),咱们以前学习的mysql数据库是一种典型的关系型数据库,而redis是一种典型的非关系型数据库。python
redis再也不像mysql那样按照一对多或者一对一的那种关系存储,而是以key-value的形式建立结构,它没有表和字段一说,只有key-value,简单,直接,易操做。mysql
redis对比memcache数据库(也是一种非关系型数据库)的共同点:git
- 将数据缓存到内存中;github
- 属于key-value结构;redis
不一样点:sql
- redis能够作持久化(即将数据保存到磁盘上,相比mencache更安全);数据库
- redis支持更丰富的数据类型,value能够是字符串、链表、哈希,集合,而mencache的value只能是字符串;缓存
一、redis下载并安装安全
本文如下载Redis-x64-3.2.100.msi为例,下载地址>>>服务器
下载地址:https://github.com/MicrosoftArchive/redis/releases
二、安装完成后启动服务器(端口号6379)
redis-server.exe是服务端,双击便可运行服务端
redis-cli.exe是客户端,双击以下图
三、使用
一、下载redis
1
|
pip install redis
|
二、使用
1)链接方式一
import redis # 默认链接本机的6379,因此下面括号中的能够不写 # 参数decode_responses=True表示解码,默认为false r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True) r.set('age', '22') print(r.get('age')) # b'22' 注意:存的是字节
2)链接方式二(链接池的方式,客户端可使用链接池中的,避免链接开销)
import redis pool = redis.ConnectionPool(host='', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set('age', '22') print(r.get('age'))
三、redis的字符串(String)操做
redis中的String在内存中按照一个name对应一个value来存储。如图:
1)set(name, value, ex=None, px=None, nx=False, xx=False)
1
2
3
4
5
6
|
在Redis中设置值,默认,不存在则建立,存在则修改
参数:
ex,过时时间(秒)
px,过时时间(毫秒)
nx,若是设置为
True
,则只有name不存在时,当前
set
操做才执行
xx,若是设置为
True
,则只有name存在时,岗前
set
操做才执行
|
2)setnx(name, value)
1
|
设置值,只有name不存在时,执行设置操做(添加)
|
3)setex(name, value, time)
1
2
3
|
设置值
参数:
time,过时时间(数字秒 或 timedelta对象)
|
4)psetex(name, time_ms, value)
1
2
3
|
设置值
参数:
time_ms,过时时间(数字毫秒 或 timedelta对象)
|
5)mset(*args, **kwargs)
1
2
3
|
批量设置值
如:
mset(k1
=
'v1'
, k2
=
'v2'
) 或 mget({
'k1'
:
'v1'
,
'k2'
:
'v2'
})
|
6)get(name)
1
|
获取值
|
7)mget(keys, *args)
1
2
3
|
批量获取
如:
mget(
'ylr'
,
'wupeiqi'
) 或 r.mget([
'ylr'
,
'wupeiqi'
])
|
8)getset(name, value)
1
|
设置新值并获取原来的值
|
9)getrange(key, start, end)
1
2
3
4
5
6
|
获取子序列(根据字节获取,非字符)
参数:
name,Redis 的 name
start,起始位置(字节)
end,结束位置(字节)
如:
"武沛齐"
,
0
-
3
表示
"武"
|
10)setrange(name, offset, value)
1
2
3
4
|
修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
参数:
offset,字符串的索引,字节(一个汉字三个字节)
value,要设置的值
|
11)incr(self, name, amount=1)
1
2
3
4
5
|
自增 name对应的值,当name不存在时,则建立name=amount,不然,则自增。
参数:
name,Redis的name
amount,自增数(必须是整数)
注:同incrby
|
12)decr(self, name, amount=1)
1
2
3
4
|
自减 name对应的值,当name不存在时,则建立name=amount,不然,则自减。
参数:
name,Redis的name
amount,自减数(整数)
|
13)append(key, value)
1
2
3
4
|
在redis name对应的值后面追加内容
参数:
key, redis的name
value, 要追加的字符串
|
四、redis的哈希(Hash)操做
redis中Hash在内存中的存储格式以下图:
1)hset(name, key, value)
1
2
3
4
5
6
7
|
name对应的
hash
中设置一个键值对(不存在,则建立;不然,修改)
参数:
name,redis的name
key,name对应的
hash
中的key
value,name对应的
hash
中的value
注:
hsetnx(name, key, value),当name对应的
hash
中不存在当前key时则建立(至关于添加)
|
2)hmset(name, mapping)
1
2
3
4
5
6
|
在name对应的
hash
中批量设置键值对
参数:
name,redis的name
mapping,字典,如:{
'k1'
:
'v1'
,
'k2'
:
'v2'
}
如:
r.hmset(
'xx'
, {
'k1'
:
'v1'
,
'k2'
:
'v2'
})
|
3)hget(name,key)
1
|
在name对应的
hash
中获取根据key获取value
|
4)hmget(name, keys, *args)
1
2
3
4
5
6
7
8
9
|
在name对应的
hash
中获取多个key的值
参数:
name,reids对应的name
keys,要获取key集合,如:[
'k1'
,
'k2'
,
'k3'
]
*
args,要获取的key,如:k1,k2,k3
如:
r.mget(
'xx'
, [
'k1'
,
'k2'
])
或
print
r.hmget(
'xx'
,
'k1'
,
'k2'
)
|
5)hgetall(name)
1
|
获取name对应
hash
的全部键值
|
6)hlen(name)
1
|
获取name对应的
hash
中键值对的个数
|
7)hkeys(name)
1
|
获取name对应的
hash
中全部的key的值
|
8)hvals(name)
1
|
获取name对应的
hash
中全部的value的值
|
9)hexists(name, key)
1
|
检查name对应的
hash
是否存在当前传入的key
|
10)hdel(name,*keys)
1
|
将name对应的
hash
中指定key的键值对删除
|
11)hincrby(name, key, amount=1)
1
2
3
4
5
|
自增name对应的
hash
中的指定key的值,不存在则建立key
=
amount
参数:
name,redis中的name
key,
hash
对应的key
amount,自增数(整数)
|
五、redis的链式(List)操做
redis中的List在内存中按照一个name对应一个List来存储。如图:
1)lpush(name,values)
1
2
3
4
5
6
|
在name对应的
list
中添加元素,每一个新的元素都添加到列表的最左边
如:
r.lpush(
'oo'
,
11
,
22
,
33
)
保存顺序为:
33
,
22
,
11
扩展:
rpush(name, values) 表示从右向左操做
|
2)lpushx(name,value)
1
2
3
|
在name对应的
list
中添加元素,只有name已经存在时,值添加到列表的最左边
更多:
rpushx(name, value) 表示从右向左操做
|
3)llen(name)
1
|
name对应的
list
元素的个数
|
4)linsert(name, where, refvalue, value))
1
2
3
4
5
6
|
在name对应的列表的某一个值前或后插入一个新值
参数:
name,redis的name
where,BEFORE或AFTER
refvalue,标杆值,即:在它先后插入数据
value,要插入的数据
|
5)r.lset(name, index, value)
1
2
3
4
5
|
对name对应的
list
中的某一个索引位置从新赋值
参数:
name,redis的name
index,
list
的索引位置
value,要设置的值
|
6)r.lrem(name, value, num)
1
2
3
4
5
6
7
8
|
在name对应的
list
中删除指定的值
参数:
name,redis的name
value,要删除的值
num, num
=
0
,删除列表中全部的指定值;
num
=
2
,从前到后,删除
2
个;
num
=
-
2
,从后向前,删除
2
个;
|
7)lpop(name)
1
2
3
|
在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
更多:
rpop(name) 表示从右向左操做
|
8)lindex(name, index)
1
|
在name对应的列表中根据索引获取列表元素
|
9)lrange(name, start, end)
1
2
3
4
5
|
在name对应的列表分片获取数据
参数:
name,redis的name
start,索引的起始位置
end,索引结束位置
|
10)ltrim(name, start, end)
1
2
3
4
5
|
在name对应的列表中移除没有在start
-
end索引之间的值
参数:
name,redis的name
start,索引的起始位置
end,索引结束位置
|
11)rpoplpush(src, dst)
1
2
3
4
|
从一个列表取出最右边的元素,同时将其添加至另外一个列表的最左边
参数:
src,要取数据的列表的name
dst,要添加数据的列表的name
|
12)blpop(keys, timeout)
1
2
3
4
5
|
将多个列表排列,按照从左到右去pop对应列表的元素
参数:
keys,redis的name的集合
timeout,超时时间,当元素全部列表的元素获取完以后,阻塞等待列表内有数据的时间(秒),
0
表示永远阻塞更多:
r.brpop(keys, timeout),从右向左获取数据
|
13)brpoplpush(src, dst, timeout=0)
1
2
3
4
5
|
从一个列表的右侧移除一个元素并将其添加到另外一个列表的左侧
参数:
src,取出并要移除元素的列表对应的name
dst,要插入元素的列表对应的name
timeout,当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),
0
表示永远阻塞
|
六、redis的集合(Set)操做
Set集合就是不容许重复的列表
1)sadd(name,values)
1
|
name对应的集合中添加元素
|
2)scard(name)
1
|
获取name对应的集合中元素个数
|
3)sdiff(keys, *args)
1
|
在第一个name对应的集合中且不在其余name对应的集合的元素集合
|
4)sdiffstore(dest, keys, *args)
1
|
获取第一个name对应的集合中且不在其余name对应的集合,再将其新加入到dest对应的集合中
|
5)sinter(keys, *args)
1
|
获取多一个name对应集合的并集
|
6)sinterstore(dest, keys, *args)
1
|
获取多一个name对应集合的并集,再讲其加入到dest对应的集合中
|
7)sismember(name, value)
1
|
检查value是不是name对应的集合的成员
|
8)smembers(name)
1
|
获取name对应的集合的全部成员
|
有序集合,在集合的基础上,为每元素排序;元素的排序须要根据另一个值来进行比较,因此,对于有序集合,每个元素有两个值,即:值和分数,分数专门用来作排序
1)zadd(name, *args, **kwargs)
1
2
3
4
5
|
在name对应的有序集合中添加元素
如:
zadd(
'zz'
,
'n1'
,
1
,
'n2'
,
2
)
或
zadd(
'zz'
, n1
=
11
, n2
=
22
)
|
2)zcard(name)
1
|
获取name对应的有序集合元素的数量
|
3)zcount(name, min, max)
1
|
获取name对应的有序集合中分数 在 [
min
,
max
] 之间的个数
|
4)zincrby(name, value, amount)
1
|
自增name对应的有序集合的 name 对应的分数
|
5)zrank(name, value)
1
2
3
|
获取某个值在 name对应的有序集合中的排行(从
0
开始)
更多:
zrevrank(name, value),从大到小排序
|
6)zrem(name, values)
1
2
|
删除name对应的有序集合中值是values的成员
如:zrem(
'zz'
, [
's1'
,
's2'
])
|
七、其余经常使用操做
1)delete(*names)
1
|
根据删除redis中的任意数据类型
|
2)exists(name)
1
|
检测redis的name是否存在
|
3)keys(pattern='*')
1
2
3
4
5
6
|
根据模型获取redis的name
更多:
KEYS
*
匹配数据库中全部 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h
*
llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
|
4)expire(name ,time)
1
|
为某个redis的某个name设置超时时间
|
5)rename(src, dst)
1
|
对redis的name重命名为
|
6)move(name, db))
1
|
将redis的某个值移动到指定的db下
|
7)randomkey()
1
|
随机获取一个redis的name(不删除)
|
8)type(name)
1
|
获取name对应值的类型
|