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 教程

CSDN:LInux下进行redis的安装和配置(开启远程连接)

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
2
3
4
5
6
7
8
 /usr/local/opt/redis/bin/ brew search redis
==> Formulae
hiredis redis ✔ redis@3.2 redir
iredis redis-leveldb redis@4.0 redo

==> Casks
another-redis-desktop-manager redis-pro
jpadilla-redis redisinsight

安装:

1
brew install redis

过大概几分钟,很显然默认安装的是最新版的Redis:

1
2
 /usr/local/opt/redis/bin/ redis-server -v  
Redis server v=6.2.6 sha=00000000:0 malloc=libc bits=64 build=c6f3693d1aced7d9

安装 完成后会有一段提示信息:

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
2
 /usr/local/opt/redis/bin/ brew services restart redis
==> Successfully started `redis` (label: homebrew.mxcl.redis)

连接一下:

如果你的 Redis 实例在本地且使用默认端口(6379),可以使用以下命令:

1
redis-cli

Redis默认端口号就是6379,连接的时候可以不加端口就是默认端口,如果有密码直接加上-a <密码>

1
2
3
4
 /usr/local/opt/redis/bin/ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> quit
 /usr/local/opt/redis/bin/ redis-cli -h 127.0.0.1
127.0.0.1:6379>

通用命令

  • PING:测试连接是否正常。

    1
    PING
  • AUTH:进行身份认证。

    1
    AUTH password
  • SELECT:选择数据库(默认数据库为 0)。

    1
    SELECT 1
  • FLUSHDB:清空当前数据库中的所有键。

    1
    FLUSHDB [0-15]
  • FLUSHALL:清空所有数据库中的所有键。

    1
    FLUSHALL
  • 使用 SAVEBGSAVE 命令将所有数据库数据持久化到磁盘:

    1
    SAVE
    1
    BGSAVE

    保存路径查询命令:

    1
    CONFIG GET dir

键管理命令

INFO keyspace 命令: 输入以下命令查看所有数据库的信息:

1
INFO keyspace

输出: 这将输出类似以下的信息:

1
2
3
4
5
6
7
makefileCopy code# Keyspace
db0:keys=1000,expires=10,avg_ttl=5000
db1:keys=500,expires=5,avg_ttl=6000
db2:keys=0,expires=0,avg_ttl=0
db3:keys=150,expires=0,avg_ttl=0
...
db15:keys=0,expires=0,avg_ttl=0
  • 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 key
  • APPEND:将值追加到键的值之后。

    1
    2

    APPEND key value
  • STRLEN:获取键值的长度。

    1
    2

    STRLEN key

哈希操作命令

  • HSET:设置哈希表字段的值。

    1
    2

    HSET key field value
  • HGET:获取哈希表字段的值。

    1
    2

    HGET key field
  • HDEL:删除一个或多个哈希表字段。

    1
    2

    HDEL key field1 field2
  • HGETALL:获取哈希表中的所有字段和值。

    1
    2

    HGETALL key

列表操作命令

  • LPUSH:将一个值插入到列表头部。

    1
    LPUSH key value
  • RPUSH:将一个值插入到列表尾部。

    1
    RPUSH key value
  • LPOP:移出并获取列表的第一个元素。

    1
    2

    LPOP key
  • RPOP:移出并获取列表的最后一个元素。

    1
    2

    RPOP key
  • LRANGE:获取列表指定范围内的元素。

    1
    2

    LRANGE key start stop

集合操作命令

  • SADD:向集合添加一个或多个成员。

    1
    2

    SADD key member1 member2
  • SREM:移除集合中的一个或多个成员。

    1
    2

    SREM key member1 member2
  • SMEMBERS:返回集合中的所有成员。

    1
    2

    SMEMBERS key
  • SISMEMBER:判断成员是否存在于集合中。

    1
    2

    SISMEMBER key member

有序集合操作命令

  • ZADD:向有序集合添加一个或多个成员,或者更新已存在成员的分数。

    1
    2

    ZADD key score1 member1 score2 member2
  • ZRANGE:返回有序集合中指定范围内的成员。

    1
    2

    ZRANGE key start stop
  • ZREM:移除有序集合中的一个或多个成员。

    1
    2

    ZREM key member1 member2
  • ZSCORE:获取有序集合中成员的分数。

    1
    2

    ZSCORE key member

事务操作命令

  • MULTI:标记一个事务块的开始。

    1
    2

    MULTI
  • EXEC:执行所有事务块内的命令。

    1
    2

    EXEC
  • DISCARD:取消事务块。

    1
    2

    DISCARD

脚本操作命令

  • EVAL

    :执行 Lua 脚本。

    1
    2

    EVAL script numkeys key [key ...] arg [arg ...]

发布/订阅命令

  • PUBLISH:将消息发布到指定频道。

    1
    2

    PUBLISH channel message
  • SUBSCRIBE:订阅一个或多个频道。

    1
    2

    SUBSCRIBE channel [channel ...]
  • UNSUBSCRIBE:取消订阅指定的频道。

    1
    2

    UNSUBSCRIBE [channel ...]

管理和监控命令

  • INFO:获取服务器的各种信息和统计数据。

    1
    2

    INFO
  • MONITOR:实时打印出服务器接收到的命令。

    1
    2

    MONITOR
  • CONFIG:获取或设置服务器配置参数。

    GET parameter
    1
    CONFIG SET parameter value
  • SLOWLOG:管理和查看服务器的慢查询日志。

    1
    2

    SLOWLOG get [n]

图形化

参考:

GitHub-qishibo:AnotherRedisDesktopManager

AnotherRedisDesktopManager

image-20230103185622721

理论

单例模式

特点

  • 单个实例:只有一个 Redis 服务器实例在运行。
  • 简单性:配置和管理相对简单,不需要处理分片和集群节点的通信。
  • 性能:在单个节点上能够处理高吞吐量和低延迟的请求。
  • 扩展性有限:受单节点资源限制(CPU、内存、网络带宽),难以横向扩展。

使用场景

  • 小规模应用:适用于数据量和并发请求量较小的应用。
  • 开发和测试环境:由于配置简单,常用于开发和测试环境。
  • 缓存:适合作为分布式系统中的缓存层。

集群模式

特点

  • 多实例:包含多个 Redis 实例,数据分布在多个节点上。
  • 分片机制:使用分片(sharding)将数据分布在多个节点上,每个节点存储数据的一部分。
  • 高可用性:通过复制和自动故障转移机制实现高可用性,一个节点故障时,集群中的其他节点可以接管工作。
  • 横向扩展:能够根据需要添加更多节点来增加存储容量和处理能力。

使用场景

  • 大规模应用:适用于数据量和并发请求量较大的应用。
  • 高可用性要求:需要系统具有高可用性和自动故障转移能力的场景。
  • 分布式系统:适合作为大型分布式系统的一部分,提供分布式数据存储和缓存服务。

对比

特点 单例模式 集群模式
实例数量 单个实例 多个实例
配置复杂度
可扩展性 受限
高可用性
适用场景 小规模应用,开发测试环境,缓存 大规模应用,高可用性要求,分布式系统

具体细节

单例模式配置示例

配置文件 redis.conf 的简化示例:

1
2
3
4
5
6
confbind 127.0.0.1
port 6379
daemonize yes
logfile "/var/log/redis.log"
dbfilename dump.rdb
dir /var/lib/redis

启动命令:

1
2

redis-server /path/to/redis.conf

集群模式配置示例

集群模式需要至少 6 个实例(3 个主节点和 3 个从节点),每个节点有自己的配置文件。示例 redis-node1.conf

1
2
3
4
5
confport 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

启动命令:

1
2
3
4
5
6
redis-server /path/to/redis-node1.conf
redis-server /path/to/redis-node2.conf
redis-server /path/to/redis-node3.conf
redis-server /path/to/redis-node4.conf
redis-server /path/to/redis-node5.conf
redis-server /path/to/redis-node6.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个库

参考:

简书-胸毛飘逸:Redis为什么要分16个库