Redis
Redis简介
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
SalvatoreSanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。HackerNews在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。Redis是用C语言开发的高性能的键值对存储的非关系数据库,且完全开源,遵守 BSD 协议,是一个高性能的 key-value 数据库。
参考:
Redis存储的数据类型有5种:
字符(String)
散列(Hash)
列表(List)
集合(Set)
有序集合(Sorted Set)
Redis特点:
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis 安装
Mac安装
需要Mac提前安装好Brew
更新软件列表:
1 | brew update #必要操作 |
搜索软件,打对号意思已经安装:
1 | /usr/local/opt/redis/bin/ brew search redis |
安装:
1 | brew install redis |
过大概几分钟,很显然默认安装的是最新版的Redis:
1 | /usr/local/opt/redis/bin/ redis-server -v |
安装 完成后会有一段提示信息:
To restart redis after an upgrade:
brew services restart redis
Or, if you don’t want/need a background service you can just run:
/usr/local/opt/redis/bin/redis-server /usr/local/etc/redis.conf
翻译一下是:
升级完成Redis需要重启一下:
或者,如果你不想在后台运行这个服务,你可以只运行以下命令:
1 | /usr/local/opt/redis/bin/redis-server /usr/local/etc/redis.conf |
重启运行一下:
1 | /usr/local/opt/redis/bin/ brew services restart redis |
连接一下:
如果你的 Redis 实例在本地且使用默认端口(6379),可以使用以下命令:
1 | redis-cli |
Redis默认端口号就是6379,连接的时候可以不加端口就是默认端口,如果有密码直接加上-a <密码>
。
1 | /usr/local/opt/redis/bin/ redis-cli -h 127.0.0.1 -p 6379 |
通用命令
PING
:测试连接是否正常。1
PING
AUTH
:进行身份认证。1
AUTH password
SELECT
:选择数据库(默认数据库为 0)。1
SELECT 1
FLUSHDB
:清空当前数据库中的所有键。1
FLUSHDB [0-15]
FLUSHALL
:清空所有数据库中的所有键。1
FLUSHALL
使用
SAVE
或BGSAVE
命令将所有数据库数据持久化到磁盘:1
SAVE
1
BGSAVE
保存路径查询命令:
1
CONFIG GET dir
键管理命令
INFO keyspace
命令: 输入以下命令查看所有数据库的信息:
1 | INFO keyspace |
输出: 这将输出类似以下的信息:
1 | makefileCopy code# Keyspace |
SET
:设置键的值。1
SET key value
GET
:获取键的值。1
GET key
DEL
:删除一个或多个键。1
DEL key1 key2
EXISTS
:检查键是否存在。1
EXISTS key
EXPIRE
:设置键的过期时间(以秒为单位)。1
EXPIRE key seconds
TTL
:获取键的剩余过期时间。1
TTL key
KEYS
:查找所有符合给定模式的键。1
KEYS pattern
字符串操作命令
INCR
:将键的整数值加一。1
INCR key
DECR
:将键的整数值减一。1
2
DECR keyAPPEND
:将值追加到键的值之后。1
2
APPEND key valueSTRLEN
:获取键值的长度。1
2
STRLEN key
哈希操作命令
HSET
:设置哈希表字段的值。1
2
HSET key field valueHGET
:获取哈希表字段的值。1
2
HGET key fieldHDEL
:删除一个或多个哈希表字段。1
2
HDEL key field1 field2HGETALL
:获取哈希表中的所有字段和值。1
2
HGETALL key
列表操作命令
LPUSH
:将一个值插入到列表头部。1
LPUSH key value
RPUSH
:将一个值插入到列表尾部。1
RPUSH key value
LPOP
:移出并获取列表的第一个元素。1
2
LPOP keyRPOP
:移出并获取列表的最后一个元素。1
2
RPOP keyLRANGE
:获取列表指定范围内的元素。1
2
LRANGE key start stop
集合操作命令
SADD
:向集合添加一个或多个成员。1
2
SADD key member1 member2SREM
:移除集合中的一个或多个成员。1
2
SREM key member1 member2SMEMBERS
:返回集合中的所有成员。1
2
SMEMBERS keySISMEMBER
:判断成员是否存在于集合中。1
2
SISMEMBER key member
有序集合操作命令
ZADD
:向有序集合添加一个或多个成员,或者更新已存在成员的分数。1
2
ZADD key score1 member1 score2 member2ZRANGE
:返回有序集合中指定范围内的成员。1
2
ZRANGE key start stopZREM
:移除有序集合中的一个或多个成员。1
2
ZREM key member1 member2ZSCORE
:获取有序集合中成员的分数。1
2
ZSCORE key member
事务操作命令
MULTI
:标记一个事务块的开始。1
2
MULTIEXEC
:执行所有事务块内的命令。1
2
EXECDISCARD
:取消事务块。1
2
DISCARD
脚本操作命令
EVAL
:执行 Lua 脚本。
1
2
EVAL script numkeys key [key ...] arg [arg ...]
发布/订阅命令
PUBLISH
:将消息发布到指定频道。1
2
PUBLISH channel messageSUBSCRIBE
:订阅一个或多个频道。1
2
SUBSCRIBE channel [channel ...]UNSUBSCRIBE
:取消订阅指定的频道。1
2
UNSUBSCRIBE [channel ...]
管理和监控命令
INFO
:获取服务器的各种信息和统计数据。1
2
INFOMONITOR
:实时打印出服务器接收到的命令。1
2
MONITORCONFIG
:获取或设置服务器配置参数。GET parameter 1
CONFIG SET parameter value
SLOWLOG
:管理和查看服务器的慢查询日志。1
2
SLOWLOG get [n]
图形化
参考:
AnotherRedisDesktopManager
理论
单例模式
特点
- 单个实例:只有一个 Redis 服务器实例在运行。
- 简单性:配置和管理相对简单,不需要处理分片和集群节点的通信。
- 性能:在单个节点上能够处理高吞吐量和低延迟的请求。
- 扩展性有限:受单节点资源限制(CPU、内存、网络带宽),难以横向扩展。
使用场景
- 小规模应用:适用于数据量和并发请求量较小的应用。
- 开发和测试环境:由于配置简单,常用于开发和测试环境。
- 缓存:适合作为分布式系统中的缓存层。
集群模式
特点
- 多实例:包含多个 Redis 实例,数据分布在多个节点上。
- 分片机制:使用分片(sharding)将数据分布在多个节点上,每个节点存储数据的一部分。
- 高可用性:通过复制和自动故障转移机制实现高可用性,一个节点故障时,集群中的其他节点可以接管工作。
- 横向扩展:能够根据需要添加更多节点来增加存储容量和处理能力。
使用场景
- 大规模应用:适用于数据量和并发请求量较大的应用。
- 高可用性要求:需要系统具有高可用性和自动故障转移能力的场景。
- 分布式系统:适合作为大型分布式系统的一部分,提供分布式数据存储和缓存服务。
对比
特点 | 单例模式 | 集群模式 |
---|---|---|
实例数量 | 单个实例 | 多个实例 |
配置复杂度 | 低 | 高 |
可扩展性 | 受限 | 优 |
高可用性 | 低 | 高 |
适用场景 | 小规模应用,开发测试环境,缓存 | 大规模应用,高可用性要求,分布式系统 |
具体细节
单例模式配置示例
配置文件 redis.conf
的简化示例:
1 | confbind 127.0.0.1 |
启动命令:
1 |
|
集群模式配置示例
集群模式需要至少 6 个实例(3 个主节点和 3 个从节点),每个节点有自己的配置文件。示例 redis-node1.conf
:
1 | confport 7000 |
启动命令:
1 | redis-server /path/to/redis-node1.conf |
初始化集群:
1 | redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 |
使用
Redis的16个库
参考: