Redis简介
-
什么是Redis
- Redis是一个完全免费的,遵守BSD协议的,高性能的key-value数据库,可用作数据库、缓存和消息中间件
-
BSD协议
- 如果再次发布的产品中包含源代码,则在源代码中必须包含原来代码中的BSD协议
- 如果再次发布的是二进制类库或软件,则需要在类库或软件的文档的版权声明中包含源代码的BSD协议
- 不可以用开源代码的作者或机构名字和原产品的名字做市场推广
-
Redis特点
- Redis支持数据持久化,可以将内存中的数据保存在磁盘中,重启的可以再次使用
- Redis不仅支持key-value数据类型,同时还提供多种数据存储
- Redis支持数据的备份,即master-slave模式的数据备份
-
Redis优势
- 性能极高:读速-11万次/每秒,写速-8.1万次/每秒
- 丰富的数据类型:string,list,...
- 原子性:Redis的所有操作都是原子性的,要么成功执行,要么必败完全不执行。单个操作时原子性的,多个食物也支持事务,即原子性。
- 丰富的特性:Redis通知,key过期等特性
-
Redis连接与相关信息查看
-
redis-benchmark --help
查看帮助信息 -
redis-benchmark -n 10000 -q
性能测试 -
redis-cli -h 127.0.0.1 -p 6379 -a password
连接本地Redis服务 -
redis-cli -h 远程主机地址 -p 6379 -a password
连接本地Redis服务
-
Redis常用命令
# 存数据:set key value
set a 123
set b 456
# 取数据:get key
get a
# 获取多条数据:mget key [key...].
mget a b
# 检查key是否存在:exists key [key ...]
# 存在返回1,不存在返回0
exists a
# 获取key值所存字符串的长度:strlen key
strlen a # 3
# 获取指定key值所对应的字符串的字符串
# getrange key start end
getrange a 1 2 # "23"
# 删除key值:del key
del b
# 设定过期时间:expire key seconds
expire a 600
# 查询key值剩余时间:ttl key
# 无过期时间返回-1,已经过期返回-2
ttl a
# 以毫秒设定过期时间:pexpire key ms
expire a 600
# 以毫秒查询key值剩余时间:pttl key
# 无过期时间返回-1,已经过期返回-2
pttl a
# 移除过期时间:persist key
persist a
# 重命名:rename key newkey
rename a A
# 随机返回key值:randomkey
randomkey
# 获取key所存储的类型:type key
type a
# 更改指定key值的value(返回key原有的value)
# getset key newvalue
getset a 789
Hash(哈希)
# 存储hash值:hmset key field value
hmset teacher name 'Tom' age 23 sex 0
# 获取hash表中key值所有字段和值:hgetall key
hgetall teacher
# 获取hash表中的key值指定字段的值:hget key field
hget teacher age
# 删除key下保存的hash表中指定的filed的值:hdel key filed
hdel teacher sex
# 查询指定key下保存的hash是否存在指定字段:hexists key field
hexists teacher name
# 获取指定key下存储的hash表中的全部字段:hkeys key
hkeys teacher
# 获取指定key下存储的hash表中的全部值:hvals key
hvals teacher
列表
# 在列表末尾添加一个或多个值,返回列表长度
# rpush key value [value1,value2,...]
rpush lst Tom Tony Jason
# 获取列表中指定范围内的元素:lrange key start end
lrange lst 0 -1
# 获取列表长度:llen key
llen lst
# 通过索引获取列表中的元素:lindex key index
lindex lst 1 # Tony
# 通过索引设置指定元素的值:lset key index newvalue
lset lst 2 Mike
# 在列表的某个元素之前或之后插入元素,若执行成功返回列表的长度
# 若该元素不存在,不执行任何操作
# 若key不存在, key被视为空列表,不执行任何操作
# linsert key before|after pivot value
linsert lst after Tom Wang
# 将一个或多个值插入到列表的表头
# 如果有多个值,那么各个值按从左到右的顺序依次插入到表头
# 如果列表不存在,会创建一个新的列表并执行lpush操作
# lpush key value [value ...]
lpush lst a b c
# 移除并返回列表的头元素:LPOP key
lpop lst
# 移除并返回列表的头元素:RPOP key
rpop lst
有序集合
# 向有序集合添加一个或多个成员,或更新已存在成员分数
# ZADD key score member [[score member] [score member] ...]
zadd links 1 baidu 2 bing 3 sina
# 获取有序集合的成员数:zcard key
zcard links
# 获取成员分数值:zscore key member
zscore links sina
# 返回有序集指定区间内的成员及分数
# ZRANGE key start stop [WITHSCORES]
zrange links 0 1
# 移除有序集中的一个或多个成员,不存在的成员将被忽略
# ZREM key member [member ...]
zrem links sina
# 向有序集合指定的成员增加分数
# ZINCRBY key increment membe
zincrby links 5 baidu
连接池
为了节省资源,减少多次连接损耗,连接池作用相当于总揽多个客户端与服务器的连接,当新的客户端需要连接时,只需要到连接池里获取一个连接即可,实际上只是一个连接共享给多可客户端
import redis
# 声明连接池
pool =redis.ConnectionPool(host="localhost",port=6379,decode_responses=True)
# 建立连接
r1 = redis.Redis(connection_pool=pool)
r2 = redis.Redis(connection_pool=pool)
# 执行redis命令操作
r1.set('apple','a')
r2.set('banana','b')
# 打印连接信息(一致)
print(r1.get('apple'))
print(r2.get('banana'))
管道
一般情况下,执行一条命令必须等待结果才能执行下一条,管道用于在一次请求在执行多次指令,在python中管道可以代替事务