Redis
Redis(全称:Remote Dictionary Server 远程字典服务)
开源的非关系数据库(NoSQL),使用Key-Value键值对来存储数据;
主要功能:作为缓存,替MySQL抗高并发;
Redis为什么快?
- 基于内存的数据库,IO性能高;
- 基于非阻塞架构IO;IO多路复用;
- 阻塞:需要等待当前操作完成才能进行下一步;
- 非阻塞:当前操作正在处理时,可以处理其他操作;
- IO多路复用就是“一个人盯多个活儿,活儿来了再动手,没活儿就歇着”,是解决高并发IO问题的“利器”。
redis是开源的非关系型数据库;
基于内存,key-value;
关系型数据库:使用表结构存储数据,适合存储结构化数据,表与表之间可以进行关联查询,使用SQL操作语言;
- MySQL
- Oracle
- SQL Server
- DB2
- SQLite
非关系型数据库(NoSQL):存储的数据的格式更加多样,适合半结构化数据与非结构化数据的存储;
- Redis
- MongoDB
- HBase
Redis:作为缓存,为了抗高并发,节省成本;
Redis是内存型数据库,断电后数据会丢失;不安全,并不能替代传统的关系型数据库;
一、下载安装Redis
1.安装依赖
sudo apt install build-essential gcc g++ make tcl -y2.下载源码
cd /usr/local/src/ wget http://download.redis.io/releases/redis-6.2.14.tar.gz3.编译安装
tar -xvf redis-6.2.14.tar.gz cd /usr/local/src/redis-6.2.14 make && make PREFIX=/usr/local/redis install mkdir -p /usr/local/redis/{etc,logs,data} egrep -v "^$|^#" redis.conf > /usr/local/redis/etc/redis.conf4.修改配置文件
cd /usr/local/redis/etc vim redis.conf daemonize yes #运行后台运行 [root@server-131 redis]./bin/redis-server ./etc/redis.conf #后台启动修改环境变量
vim /etc/profile export PATH=$PATH:/usr/local/redis/bin source /etc/profile5.重启服务
redis-cli shutdown #关闭redis redis-server ./etc/redis.conf #指定配置文件,后台运行6.设置远程访问
#修改/usr/local/redis/etc/redis.conf文件 #bind 127.0.0.1 #注释掉允许本地连接 protected-mode no #允许远程访问 redis-cli -h 192.168.8.131 -p 63797.systemctl管理redis
添加systemctl管理 vim /etc/systemd/system/redis.service [Unit] Description=Redis After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf ExecReload=/usr/local/redis/bin/redis-server -s reload ExecStop=/usr/local/redis/bin/redis-server -s stop PrivateTmp=true [Install] WantedBy=multi-user.targetsystemctl daemon-reload systemctl start redis二、Redis 与其他 key-value 存储有什么不同?
Redis 与其他 key-value 存储系统的主要区别在于其提供了丰富的数据类型、高性能的读写能力、原子性操作、持久化机制、以及丰富的特性集。
以下是 Redis 的一些独特之处:
- **丰富的数据类型:**Redis 不仅仅支持简单的 key-value 类型的数据,还提供了 list、set、zset(有序集合)、hash 等数据结构的存储。这些数据类型可以更好地满足特定的业务需求,使得 Redis 可以用于更广泛的应用场景。
- **高性能的读写能力:**Redis 能读的速度是 110000次/s,写的速度是 81000次/s。这种高性能主要得益于 Redis 将数据存储在内存中,从而显著提高了数据的访问速度。
- **原子性操作:**Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性非常重要。
- **持久化机制:**Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,以便在系统重启后能够再次加载使用。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
- **丰富的特性集:**Redis 还支持 publish/subscribe(发布/订阅)模式、通知、key 过期等高级特性。这些特性使得 Redis 可以用于消息队列、实时数据分析等复杂的应用场景。
- **主从复制和高可用性:**Redis 支持 master-slave 模式的数据备份,提供了数据的备份和主从复制功能,增强了数据的可用性和容错性。
- **支持 Lua 脚本:**Redis 支持使用 Lua 脚本来编写复杂的操作,这些脚本可以在服务器端执行,提供了更多的灵活性和强大的功能。
- **单线程模型:**尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。
三、Redis 主要支持以下几种数据类型:
string(字符串):基本的数据存储单元,可以存储字符串、整数或者浮点数。
- 网页缓存、计数器
**hash(哈希)😗*一个键值对集合,可以存储多个字段。
- 用户信息、商品信息
**list(列表)😗*一个简单的列表,可以存储一系列的字符串元素。
- 消息列表、秒杀
**set(集合)😗*一个无序集合,可以存储不重复的字符串元素。
- 数据去重、交集、并集
zset(sorted set:有序集合):类似于集合,但是每个元素都有一个分数(score)与之关联。
- 排行榜、热点新闻
String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
常用命令
SET key value:设置键的值。GET key:获取键的值。INCR key:将键的值加 1。DECR key:将键的值减 1。APPEND key value:将值追加到键的值之后。
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合,类似于一个小型的 NoSQL 数据库。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
每个哈希最多可以存储 2^32 - 1 个键值对。
常用命令
HSET key field value:设置哈希表中字段的值。HGET key field:获取哈希表中字段的值。HGETALL key:获取哈希表中所有字段和值。HDEL key field:删除哈希表中的一个或多个字段。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
列表最多可以存储 2^32 - 1 个元素。
常用命令
LPUSH key value:将值插入到列表头部。RPUSH key value:将值插入到列表尾部。LPOP key:移出并获取列表的第一个元素。RPOP key:移出并获取列表的最后一个元素。LRANGE key start stop:获取列表在指定范围内的元素。
Set(集合)
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
常用命令
SADD key value:向集合添加一个或多个成员。SREM key value:移除集合中的一个或多个成员。SMEMBERS key:返回集合中的所有成员。SISMEMBER key value:判断值是否是集合的成员。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
常用命令
ZADD key score value:向有序集合添加一个或多个成员,或更新已存在成员的分数。ZRANGE key start stop [WITHSCORES]:返回指定范围内的成员。ZREM key value:移除有序集合中的一个或多个成员。ZSCORE key value:返回有序集合中,成员的分数值。
四、Redis的数据持久化
持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。
- RDB:快照方式,直接将内存中的数据以二进制格式保存在硬盘上;
- 恢复速度快,redis重启后会自动恢复数据;
- 不能实时保存,一般在重启Redis前手动或自动生成RDB文件;
- 手动保存save/bgsave
- 自动保存:redis.conf中设置save m n,m秒内有n次修改则保存;
- AOF:追加日志文件方式,当执行写入操作时(增、删、改),将执行的命令写入到aof日志中,当Redis重启时会将AOF日志中的所有命令重新执行一遍;
- 数据不容易丢失,但是恢复速度较慢,文件较大;
- 三种备份模式:实时备份、每秒备份、系统空闲备份;
五、Redis集群
- 主从模式:第一次同步时,主服务器生成快照发送给所有从服务器,从服务器同步数据,之后主服务器在执行写操作时,将执行的命令同步转发给从服务器,实现数据的同步。
- 主服务器可读可写
- 从服务器只读
- 主服务器一旦宕机,则无法写入数据,需要手动切换主从;
- 哨兵模式:Redis自带的高可用模式,使用哨兵进程监控主服务器,每秒ping一次,心跳检测,如果主服务器宕机,则会根据规则选举一台从服务器成为新的主服务器,让其他从服务器自动关联该新主服务器;
- 单哨兵
- 多哨兵模式
- 集群模式:分布式缓存模式,将海量数据拆分到多台服务器,根据算法进行数据的存储和读取;
主从模式
什么是主从复制?
Master可以拥有多个slave;多个slave可以连接同一个Master外,还可以连接到其他的slave;主从复制不会阻塞Master,在主从复制时,Master可以处理client请求。
主从复制的作用:
数据备份:将master的数据,备份到slave
读写分离:用master来写入数据,用slave完成备份后,来完成只读的功能。
注意:当master宕机后,不会去选择slave作为master。需要手动将一台slave使用slaveof on one 提升为master,要想自动实现提升,我们就需要使用哨兵。
“单机多实例”是指在一台物理服务器(或虚拟机)上同时运行同一个软件的多个独立副本(即 “实例”)的部署方式。这种方式在软件开发、测试、服务部署等场景中较为常见,其核心是通过隔离资源和配置,让多个实例在同一台机器上并行工作,同时避免相互干扰。
“单机多实例” 需要注意:服务端口号不能相同、配置文件、PID文件、数据文件路径(或名称)不同一样,否则服务无法正常启动。
多机主从:
主服务器不用改配置
从服务器修改配置:replicaof 192.168.8.131 6379 #主服务这句话注释,从服务配置的需要开启。配置主服务的ip的port。
修改完配置之后重启服务
登录客户端输入info replication进行查看
手动设置主从:
- 当主服务器宕机之后,找一个从服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
- 其余服务器执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。host是现在主服务器的IP地址。
哨兵模式
为什么要启动哨兵模式
当我们的主服务器宕机后,要手动的去切换主从模式,这样的人工干预,费事费力,还会造成一段时间我们的服务不能使用。所有我们要使用哨兵模式来解决这一问题。
什么是哨兵模式
哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有两个:
一是监控主机Redis和从机Redis是否运行正常;二是主机Redis出现故障后自动将从机转化为主机;
哨兵功能
集群监控:负责监控主从集群中的Master和Slave进程是否正常工作。
故障转移(failover):如果Master宕机,会自动从Slave中选举出新的Master,进行主从自动切换。
配置中心:如果发生了故障转移,Sentinel负责通知客户端新的Master的地址。
消息通知:如果某个redis节点有故障,那么Sentsinel会发送报警消息给系统管理员。
单哨兵模式
修改配置文件:sentinel monitor mymaster 192.168.8.131 6379 1
启动哨兵:./bin/redis-sentinel ./etc/sentinel.conf
多哨兵模式
修改配置文件(所有哨兵):sentinel monitor mymaster 192.168.8.131 6379 2
启动哨兵(所有哨兵):./bin/redis-sentinel ./etc/sentinel.conf
集群模式
sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
什么是集群模式
Redis 的哨兵和主从模式基本已经可以实现高可用和读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,浪费内存空间,所以在redis上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说Redis 节点上存储不同的内容。
集群模式特点
多个redis节点网络互联,数据共享
所有的节点都是一主一从(也可以是一主多从),其中从节点不提供服务,仅作为备用
不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
支持在线增加、删除节点
客户端可以连接任何一个主节点进行读写
配置集群:
修改配置文件:
vim redis.conf appendonly yes cluster-enabled yes #(启动集群模式,开始玩耍) cluster-config-file nodes700*.conf#(这里700x最好和port对应上) cluster-node-timeout 5000 #redis节点宕机被发现的时间启动redis服务
systemctl start redis.server 或 ./bin/redis-server ./etc/redis.conf创建集群:
/usr/local/redis/bin/redis-cli --cluster create 192.168.8.131:6379 192.168.8.132:6379 192.168.8.133:6379 192.168.8.134:6379 192.168.8.135:6379 192.168.8.136:6379 --cluster-replicas 1 info cluster # Cluster cluster_enabled:1 #节点是否为cluster模式 。1是0否 cluster nodes #查看集群中的节点