Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式:
主从复制模式
哨兵模式
集群模式
哨兵模式
主从复制模式解决了数据备份和单机可能存在的性能问题,但是也引入了新的问题,一主多从,在使用过程中,如果主服务器挂掉那么整个 Redis 服务的写就挂掉了,如果一个从服务器挂掉那么调用方就无法正确的读数据了,只能通过修改调
在多线程编程中数据争用和竞态条件经常会被提到,怎奈何我写了4年PHP而PHP不支持线程并发编程,虽然这两个概念说的具体问题我还是有所了解,但是初看到这两个概念其实听陌生的。
数据争用
多个线程对同一个变量、同时地、进行读/写操作并且至少有一个线程进行写操作的现象叫做数据争用。如果发生了数据争用,那么一个多线程程序运行完毕时受到数据争用的变量的值是不可预测的。我们可以用锁来避免数据争用。
数据争用的例子(go)
package main
import (
"fmt"
"sync"
)
var (
N = 0
waitgroup sync.Wai
关于线程
我们每运行的一个程序都会创建一个进程,每个进程都有一个初始线程,而后初始线程可以创建更多线程,每个线程互相独立地运行。线程因为其轻量和易用性在并发编程中被大量的使用。而 goroutine 就是基于线程的。线程的实现模型主要有3种:用户级线程模型、内核级线程模型和两级线程模型(或者叫做混合型线程模型)。他们之间的区别就是用户线程和系统最小调度单元内核调度实体(KSE,Kernal Scheduling Entity)的对应关系不同。
用户级线程模型
用户线程与内核线程KSE是多对一的映射模型,多个用户线程一般都是从属于单个进程,并且用户线程的调度都是用户程序的线程库完成的,不需要操作
Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式:
主从复制模式
哨兵模式
集群模式
主从复制模式
主从复制,让一台服务器去复制另外一台服务器,我们称被复制的服务器为主服务器,而对主服务器进行复制的服务器为从服务器。Redis 允许一台主服务器配置多个从服务器。主服务器可以进行读写操作,从服务器只能进行读操作,当主
AOF 持久化是 Redis 提供的另外一种持久化方案,AOF 持久化是将发送到服务端的每一条命令记录下来,并且保存在硬盘的 AOF 文件中。AOF 默认是关闭的,可以通过修改 redis.conf 中相应的配置启动。
appendonly yes # 启动 AOF 持久化,默认是 no
appendfilename "appendonly.aof" # AOF 文件文件名
文件同步策略
文件的写入默认情况下会先写入系统的缓存中,系统每隔30秒同步一次,才是真正的写入磁盘,如果这30秒服务器宕机那数据也会丢失。
Redis 可以通过 redis.conf 中的配置设置同步策略
# app
RDB 是 Redis 的一个持久化方案,也是 Redis 默认的持久化方案。RDB 持久化可以手动执行也可以根据服务器配置定期执行。
RDB 持久化所生成的 RDB 文件是一个经过压缩的二进制文件,使用该文件可以还原生成 RDB 文件时的数据库状态。RDB 保存在硬盘上,所以即使 Redis 服务器退出甚至运行 Redis 的服务器停机,但只要 RDB 文件还在就不影响数据的恢复。
RDB文件创建和载入
有两个 Redis 命令可以用于生成 RDB 文件,一个是 SAVE ,另一个是BGSAVE。
SAVE命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在这期间服务器不能
Redis提供多种不同级别的持久化方案:
RDB持久化可以在指定的时间间隔内生成数据集的时间点快照
AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾。Redis还可以在后台多AOF文件进行重写,使得AOF文件的体积不会超出保存数据集状态所需的实际大小。
Redis还可以同时使用AOF持久化和RDB持久化。在这种情况下,当Redis重启时,它会优先使用AOF文件来还原数据集,因为AOF文件保存的数据一般要比RDB文件所保存的数据要更完整。
我们也可以关闭持久化功能,让数据
1.配置软件源
yum install epel-release
rpm -ivh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
2.启用remi源
/etc/yum.repos.d/remi.repo,在[remi]下边的enabled=0改为enabled=1
3.修改/etc/yum.repos.d/remi-php72.repo enabled=1即可。
4.安装php72 phalcon nginx及相关扩展
yum inst
Redis 全称是 Remote Dictionary Server,是一个使用C编写的开源、支持网络、基于内存、可选持久化的键值对存储系统。可以别用作数据库、缓存和消息中间件。
Redis支持的数据结构及基本命令展示
这里只是展示最基本的操作,更多内容请参考redis文档
string
string类型是redis支持的最基本的数据类型,string类型的值可以是任何类型的字符串(包括二进制数据),例如你可以在一个建里保存一张jpeg图片。值的长度最大不能超过512MB。
set命令基本展示
127.0.0.1:6379> SET hello world // 设置一个值
OK
127
临时忽略掉struct中空字段
type User struct {
Email string `json:"email"`
Password string `json:"password"`
}
当我们把用户信息返回给前端的时候显然需要忽略调Password 字段,则可以这样做:
json.Marshal(struct{
*User
Password bool `json:"password,omitempty"`
}{
User:user,
})
临时添加额外字段
type User struct {
Email string `json:"