Redis is an open-source in-memory database project implementing a distributed, in-memory key-value store with optional durability.
License: BSD
Developer(s): Salvatore Sanfilippo
Initial release: May 10, 2009; 8 years ago
Stable release: 4.0.2 / September 21, 2017; 2 months ago
Written in: ANSI C
Initial release date: April 10, 2009
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
- Redis 支持数据的备份,即 master-slave 模式的数据备份。
Redis 安装
Redis 可以直接在物理机安装,当然,更推荐的做法是使用 Docker 镜像直接启动。
- 物理机安装: Centos7 安装 Redis
Docker 镜像: Redis by docker
最简单的启动方式(容器名称为 myredis, 宿主机端口为 63790):
$ docker run --name myredis -p 63790:6379 -d redis
Docker 的基本使用参考: Docker tutorial
Redis 配置文件说明: Redis 配置
客户端 redis-cli
Redis 命令用于在 redis 服务上执行操作。要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端存在于 redis 的安装包中(如 redis-3.2.9/src)。
连接本地 Redis(不指定端口则连接默认端口 6379):
$ redis-cli -p 63790
连接远程 Redis:
$ redis-cli -h host -p port
执行PING
命令检测服务器是否启动:
127.0.0.1:63790> PING
PONG
Key
Redis 键都为字符串,Redis 提供键命令用于管理 redis 的键。
127.0.0.1:63790> SET foo bar
OK
127.0.0.1:63790> DEL foo
(integer) 1
以上先创建键 foo 并指定值为 “bar”,而后删除该键。一般操作成功返回 1,否则返回 0。
具体的键命令参考:Redis-keys
Value
Redis 的值支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
- String(string 命令): 一个键最大能存储 512MB。
- Hash(hash 命令): 对应于 Python 的字典。每个 hash 可以存储 232−1 2 32 − 1 键值对(40多亿)。
- List(list 命令): 对应 Python 的列表,可以添加一个元素到列表的头部(左边)或者尾部(右边)。每个 list 可以存储 232−1 2 32 − 1 元素(40多亿)。
- Set(set 命令): 对应 Python 的集合,每个 set 可以存储 232−1 2 32 − 1 元素(40多亿)。
- Zset(zset 命令): zset 类似 set,不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数(score)却可以重复。
事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务,MULTI
- 命令入队,多个命令入队到事务中
- 执行事务,EXEC
示例:
127.0.0.1:63790> MULTI
OK
127.0.0.1:63790> set foo bar
QUEUED
127.0.0.1:63790> get foo
QUEUED
127.0.0.1:63790> exec
1) OK
2) "bar"
事务命令查看:Redis 事务命令
管道
Redis是一种基于客户端-服务端模型以及请求/响应协议的 TCP 服务。这意味着通常情况下一个请求会遵循以下步骤:
- 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等待服务端响应。
- 服务端处理命令,并将结果返回给客户端。
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。管道技术最显著的优势是提高了 redis 服务的性能。
管道的使用在下一节 Python 使用中介绍。
Python 使用 Redis
创建连接
import redis
server = redis.StrictRedis(
host='localhost',
port=6379,
db=0,
password=None,
socket_timeout=None,
socket_connect_timeout=None,
socket_keepalive=None,
socket_keepalive_options=None,
connection_pool=None,
unix_socket_path=None,
encoding='utf-8',
encoding_errors='strict',
charset=None,
errors=None,
decode_responses=False,
retry_on_timeout=False,
ssl=False,
ssl_keyfile=None,
ssl_certfile=None,
ssl_cert_reqs=None,
ssl_ca_certs=None,
max_connections=None
)
其中,最常用的几个参数:host、port、db、socket_timeout、socket_connect_timeout、retry_on_timeout,所以通常的连接:
import redis
server = redis.StrictRedis(
host='localhost',
port=6379,
db=0,
socket_timeout=30,
socket_connect_timeout=30,
retry_on_timeout=True
)
不出意外已经成功连接到 Redis 服务器,现在可以和服务器交互操作,如:
server.set('foo', 'bar')
server.incr('cnt')
事务和管道
事务的使用方法如下:
pipe = server.pipeline()
pipe.multi()
pipe.set('foo', 'bar')
pip.get('foo')
result = pipe.execute()
管道的使用和事务相同,不过需要在创建时设置参数 transaction=False:
pipe = server.pipeline(transaction=False)
pipe.set('foo', 'bar')
pip.get('foo')
result = pipe.execute()