文章目录
Redis 简介
Remote Dictionary Server(Redis)是一个由Salvatore Sanfippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写,遵守BSD协议,支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String),哈希(Hash),列表(list),集合(sets)和有序集合(sorted sets)等类型。
Redis与其他Key-Value缓存产品有以下三个特点:
- Redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的Key-Value类型数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis本质上是一个Key-Value类型的数据库,整个数据库加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘进行保存。
因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。
Redis支持保存多种数据结构,此外单个value的最大限制是1GB,可以用来实现很多有用的功能,比如用List做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用Set做高性能的tag系统等等。
Redis可以对存入的Key-Value设置expire时间,可以作为一个功能加强版的memcached来用。
Redis的主要缺点是数据库容易受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数量的高性能操作和运算上。
Redis 优势
- 性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s。
- 丰富的数据类型-Redis支持二进制案例的Strings,Lists, Hashes, Sets及Ordered Sets数据类型操作。
- 原子-Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性-Redis还支持publish/subscibe,通知key过期等等特性。
Redis与其他Key-Value存储的异同
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis安装
在Ubuntu系统安装Redis可以使用命令方式:
sudo apt-get update
sudo apt-get install redis-server
启动Redis
redis-server
查看Redis是否启动
redis-cli
以上命令将打开以下终端
redis 127.0.0.1:6379>
127.0.0.1是本机IP,6379是redis服务端口。现在输入PING命令
redis 127.0.0.1:637> ping
PONG
以上说明已经成功安装redis了。
Redis配置
Redis的配置文件位于Redis安装目录下,文件名为redis.conf(Windows下名为redis.windows.conf)。通过CONFIG命令查看或设置配置项。
查看配置项
- 语法
redis 127.0.0.1:637> CONFIG GET CONFIG_SETTING_NAME
- 实例
redis 127.0.0.1:6379> CONFIG GET loglevel
1)"loglevel"
2)"notice"
# 获取所有配置项
redis 127.0.0.1:6379> CONFIG GET *
修改配置项
- 语法
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
- 实例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
参数说明
Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob。
注意:一个键最大能存储512MB。
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"
HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误
sadd key member
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabitmq"
3) "mongodb"
注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
ZSet(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
Redis命令
Redis命令用于在redis服务上执行操作。
要在redis服务上执行命令需要一个redis客户端。redis客户端在下载的redis的安装包中。
启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。
远程服务上执行命令
连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上。
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
Redis与Python交互StrictRedis对象方法
安装redis包
pip3 install redis
调用模块
from redis import StrictRedis
StrictRedis对象操作string类型
框架
from redis import StrictRedis
if __name__ == '__main__':
try:
redisbase = StrictRedis(host=redis_sets['ip'], port=redis_sets['port'], db=redis_sets['db'],
decode_responses=True)
except Exception as e:
print(e)
增加
redisbase.set(img_name, result)
获取
roi_vals = redisbase.mget(img_list) #获取多个
roi_val = redisbase.get(img_name) #获取单个
获取键值
keys = redisbase.keys()
删除
result = redisbase.delete('img_name')
设置生存周期
redisbase.expire('img_name', 10) #设置生存周期为10s
查看剩余过期时间(秒)
redisbase.ttl('img_name')
参考资料
Redis 教程
redis——相关问题汇总
Python中 redis StrictRedis对象操作string类型
Redis 与 python交互 StrictRedis对象⽅法
使用python检查redis 死键(长时间没有访问的键)
python中redis查看剩余过期时间以及用正则通配符批量删除key的方法