★一款开源免费的,用C语言编写的,遵守BSD协议,高性能的分布式内存数据库并且支持持久化的NoSql ”
特点:
作用:
redis
文件make
指令gcc
编译器yum install gcc-c++
make install
usr/local/bin
目录下-rw-r--r-- 1 root root 134 Mar 6 16:56 dump.rdb //数据库备份文件
-rwxr-xr-x 1 root root 4807856 Mar 6 13:30 redis-cli // 客户端
lrwxrwxrwx 1 root root 12 Mar 6 13:30 redis-sentinel -> redis-server //哨兵模式开启
-rwxr-xr-x 1 root root 8125184 Mar 6 13:30 redis-server //服务端
-rwxr-xr-x 1 root root 8125184 Mar 6 13:30 redis-check-aof //检测aof文件是否有错误
-rwxr-xr-x 1 root root 8125184 Mar 6 13:30 redis-check-rdb //检测rdb文件是否有错误
select index (从0开始)进入一个数据库,默认创建16个库
dbsize 返回当前数据库中的数据的个数
flushdb 清除当前库中的所有数据
flushALL 清除redis数据库中的所有的数据
keys * 查看所有的键
expire key time 设置key的过期时间(单位秒)
ttl key 查看剩余过期时间
type key 查看当前key的类型
exists key 查看当前key是否存在
move db key 将这个键移动到db库中(db是一个索引)
set k1 v1 增加一个键值对
get k1 获取这个字段
append k1 value 给k1追加一个value
strlen k1 查看当前k的值的长度
mset k1 v1 k2 v2 设置多个键值
mget k1 k2 获取多个键值
setex key time value 设置这个键的过期时间
setnx key value 如果这个键不存在则增加这个键
getrange k1 0 -1 获取一个键的所有值
setrange k1 start value 设置k1的值
incr k1 给k1递增一
decr k1 给k1递减一
incrby k1 value k1加value
decrby k1 value k1减value
lpush key value1 value2 value3 …… # 增加一个键值链表。先进后出。栈的存储方式
rpush key value1 value2 value3 …… # 增加一个键值链表。先进先出。堆的存储方式
lrange key start end # 查看这个key从start开始到end的值
lpop key # 从队列中拿出第一个元素
rpop key # 从队列的尾部拿一个元素
lindex key index # 获取指定下标的值
llen key # 查看当前key的长度
lrem key count value # 删除key中count个value
ltrim key start end # 从key中截取start 到 end 赋值给当前key
rpoplpush k1 k2 #将k1的最后一个元素添加到k2的第一个元素
lset key index value #设置key中的index下标的值
linsert key before/after target value # 给key中的Target元素之前或者之后添加value
sadd key value01 value02 value03……#增加一个set
smembers key #查看当前key中指
sismembers key index #查看当前key中对应index的值
scard key #查看当前key中指的个数
srandmember key count #从key中随机出count个数
spop key count #随机出count个数
smove key1 key2 value # 将key1中的value赋值给key2
sdiff key1 key2 # 查看key1和key2的差集(以key1为标准)
sinter key1 key2 #查看key1和key2的交集
sunion key1 key2 #查看key1和key2的并集
hset key filed value #在key中存储一个键值对
hget key filed # 获取这个key中指定字段的值
hmset key filed value filed value filed value #设置多个键值
hmget key filed1 filed2 #获取这个键中多个字段
hgetall key 获取这个键中所有的键值对
hdel key filed #删除这个key中的一个或者多个filed
zadd key score member #增加一个值或者多个值,携带一个分数
zrange key start end [withscores]#查看指定key的值,withscores 添加以后打印对应的分数
zrem key member 删除某个member对应的值
zcard key #查看当前key中的元素个数
zcount key startScore endScore# 查看当前分数在start end之间的元素个数
zrank key member #获取member对应的下标
zscore key member #获取member对应的分数
zrevrank key member #逆序获取下标值
zrangebyscore key startScore endScore #获取指定分数之间的值和分数
zrevrangebyscore key startScore endScore #反序获取
) #表示不包含这个分数
zrangebyscore key startScore endScore withscores limit startIndex endIndex #在指定的下标区间内寻找分数在startScore到endScore之间
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
# units are case insensitive so 1GB 1Gb 1gB are all the same.
# include /path/to/local.conf
# include /path/to/other.conf
# 配置redis的启动方式,yes为守护进程的方式,no不是守护线程。默认为no
daemonize no
#标识该程序的ID,其他程序可以通过这个文件获取这个应用PID,执行一些其他的任务
pidfile /var/run/redis.pid
#端口
port 6379
#一个连接队列,
# backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列
#/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog两个值
tcp-backlog
# 设置当用户无操作多少时间内和客户端解除连接。。当为0时不设置超时时间。
timeout 0
#距离多长时间未接收到报文而开始重新检测,如果设置为0则说明不尽兴检测
tcp-keepalice 0
#设置日志级别。日志级别逐渐递增
# debug (开发用)
# verbose
#notice
#warning
loglevel notice
#设置日志文件的输出名字。会输出在当前目录。可以进行修改
logfile ""
#开启系统日志
syslog-enabled no
#设置日志标志
syslog-ident redis
#指定日志输出的设备给,可以是user或者local0-7
syslog-facility local0
#设置数据库的个数
databases 16
★快照。当redis服务停止的时候,将数据存储到磁盘中 ”
# save seconds change
# 设置多少秒以后至少有多少次更改操作会进行数据存储,
# 当设置为 ""时停止了持久化
#默认为:
# 15分钟至少一次操作
# 5分钟至少十次操作
# 1分钟至少10000次操作
save
# 当系统出现问题时候,是否停止写入到磁盘
stop-writes-on-bgsave-error yes
# 是否进行压缩存储
rdbcompression
#进行数据校验,大约影响10%的性能
rdbchecksum
# 产生的数据备份的名字
dbfilename dump.rdb
#产生数据文件的路径
dir ./
Redis
会fork
一个线程用来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件RDB
和AOF
★Fork:复制一个与当前进程一样的进程。新进程的所有数据数值均与原进程相同,但是它是一个全新的进程,并且作为了原进程的子进程 ”
Redis
中默认的快照方式。Redis
中关于触发RDB
快照的方式save
阻塞其他进程,先进行持久化操作bgsave
一部进行保存shutdown
或者flushDB
或者flushALL
自动写入lastsave
获取最后一次执行快照的时间config get dir
。默认的文件名为dump.rdb
RDB
保存规则的方法redis-cli config set save ""
RDB
存在的问题的一种算法redis
的写操作,记录在一个.aof
文件中,每一次启动redis
服务的时候就会运行这个文件中的所有的指令appengdonly.aof
AOF
的配置#设置AOF快照启动
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
#三种同步修改的策略
# appendfsync always 同步持久化,当数据发生变更的时候就进行一次持久化
appendfsync everysec 异步操作,每秒记录。
# appendfsync no 不同步
#是否使用重写策略
no-appendfsync-on-rewrite no
#重写的基准值
auto-aof-rewrite-percentage 100
#当文件达到这个数值的时候执行重写
auto-aof-rewrite-min-size 64mb
#是否加载不完整的AOF文件启动
aof-load-truncated yes
rewriter-min-size
时触发AOF
文件采用了文件追加的方式,所以会出现文件越来越大的情况,因此为了避免这种情况,增加了重写的机制。当文件超过auto-aof-rewriter-min-size
设定的文件大小的时候,Redis
就会启动AOF
文件压缩。bgrewriteaof
fork
一个新的进程将文件重写。遍历redis
数据库中的数据,然后直接生成一个写出这些数据的aof
文件(不会读旧的aof文件)1s
aof
文件远大于rdb
文件,恢复速度慢于rdb
注意:
aof
的同步策略为不同步的时候,其性能和rDB
相同RDB
文件同时存在的时候,优先加载AOF
文件,但是当AOF
或者RDB
文件损坏的时候,Redis
服务就无法运行redis-check-aof --fix 文件名
redis-check-dump --fix 文件名
执行机制:
RDB
持久化可以在指定的时间间隔对数据进行快照存储AOF
持久化通过记录客户端的写操作,当服务器重启的时候重新执行这些命令★Redis支持部分事物 ”
悲观锁:
乐观锁:
★redis会将在事务中的所有操作都进行序列化,按照串行化执行,不容许加塞 ”
五种事务支持场景
discard
命令直接放弃正在执行的事务127.0.0.1:6379> keys *
1) "balance"
2) "idet"
127.0.0.1:6379> watch balance idet # 监听这两值
OK
127.0.0.1:6379> MULTI #开启事务
OK
127.0.0.1:6379> decrby balance 20
QUEUED
127.0.0.1:6379> incrby idet 20
QUEUED
127.0.0.1:6379> EXEC # 执行事务成功
1) (integer) 780
2) (integer) 60
#线程一执行这段事务
127.0.0.1:6379> get balance
"100"
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> decrby balance 30
#当线程一执行到这里的时候,线程二修改了balance的值为200
127.0.0.1:6379> set balance 200
OK
127.0.0.1:6379> get balance
"200"
# 此时线程一继续执行。此时整个事务直接失败
127.0.0.1:6379> decrby balance 30
QUEUED
127.0.0.1:6379> INCRBY idet 30
QUEUED
127.0.0.1:6379> EXEC
(nil)
使用步骤:
subscribe c1 c2 c3
publish c2 hello
pshubscirbe new*
publish new 1 redis
**含义:**主机数据更新后根据配置和策略,自动将数据同步到备机的master/slaver
的机制,Master
以写为主,Slave
以读为主
**作用:**实现读写分离,容灾恢复
常用的使用方式:
★一台主机,负责写;两台备用机器。负责备份 ”
info replcation
slaveof Ip 端口
常见的场景:(主机为A,备份机器为B,C)
总结:
★一传一,一传一一直下去 ”
场景:
★当主机挂掉的时候,将一个从机作为主机 ”
场景:
slaveof on one
将该从机作为一个主机使用,但是此时的从机C仍然为主机A的从机,所以需要主动将从机C改为主机B的从机。slave
启动成功连接到master
后会发送一个sync
命令Master
接到命令,启动后台存盘进程,同时收集所有接受到的用于修改数据集的命令,在后台进程执行完毕之后,master
将传送整个数据文件到slave
,以完成一次同步分类:
slave
服务在接受到数据库文件以后,将其加载到内存中。Master
将新的指令集传给slave
只要重新连接master,就会进行全量复制
★反客为主的自动版,能够后台监控主机是否出现故障,如果出现故障了则根据投票数自动将从库转换为主库 ”
sentinel.conf
文件,通过Redis
提供的命令redis-sentinel
使用这个文件。这个 文件会开启的哨兵,用来监听这个文件内部配置的主机状况,如果这个主机挂掉,会通过投票的方式,从其从机中选出一个作为主机。当以前的那个主机再次启动以后,这个旧的主机会作为新的主机的从机主机名称(随便起) 监听的IP地址 端口 投票数
sentinel monitor host8379 127.0.0.1 6381 1
不足:
master
中操作,然后添加到slave
中,这样会造成延迟,特别是当slave
很多的时候