14.0、服务器配置:
服务器名称
ip地址
controller-node1
172.16.1.90
14.1、什么是redis:
1、redis的特点:
(1)redis是一个开源的使用c语言编写的key-value内存数据库;
(2)读写性能强,支持多种数据库结构(string、list、hash、set、storted set);
(3)支持持久化;
(4)主从复制(集群);
(5)支持过期时间;
(6)支持事物;
(7)消息订阅;
(8)官方不支持windows,但是有第三方版本;
(9)把数据存储在内存中的高速缓存;
2、redis参考手册:https://redisdoc.com/
3、redis和memcache的对比:
多线程写入的时候redis的性能更强;
4、redis的应用场景:
mysql做持久化+redis做缓存;
(1)数据缓存:
提高访问性能,使用的方式与memcache相同;
(2)会话缓存:
保存web会话信息;
(3)排行榜/计数器:
nginx+lua+redis计数器进行ip自动封禁;
(4)消息队列:
构建实时消息系统,聊天、群聊;
14.2、安装redis:
1、yum安装:
(1)安装:
yum install epel-release -y
yum install redis -y
#yum安装安装的是3.2.12-2.el7版本;
(2)启动:
systemctl start redis.service
systemctl enable redis.service
2、编译安装:
(1)下载redis:
mkdir -p /tools/
cd /tools/
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
(2)安装:
cd /tools/
tar -xzf redis-5.0.0.tar.gz
cd redis-5.0.0
make
mkdir -p /application/
cp -a /tools/redis-5.0.0/ /application/
ln -s /application/redis-5.0.0 /application/redis
ln -s /application/redis/src/redis-cli /usr/bin/redis-cli
(3)redis实例配置:
1)创建实例目录:
mkdir -p /data/6379/
cp -a /application/redis/redis.conf /data/6379/
2)修改配置文件:
sed -ri "/#|^$/d" /data/6379/redis.conf
vim /data/6379/redis.conf
bind 172.16.1.90
#redis监听的端口;
protected-mode yes
#开启redis保护模式;
requirepass root
#redis安全保护模式认证密码设置为root;
maxclients 10000
#能连上redis的最大客户端连接数量;
port 6379
#redis服务端口号,默认是6379;
tcp-backlog 511
########################################################
#TCP连接中已完成队列(完成三次握手之后)的长度;
#当系统并发量大并且客户端速度缓慢的时候,可以将这个参数设定;
#/proc/sys/net/core/somaxconn 默认是128;
#########################################################
timeout 0
#一个客户端空闲多少秒后关闭连接(0代表禁用,永不关闭);
tcp-keepalive 300
#周期性检测客户端tcp连接是否中断;
daemonize yes
#########################################################
#redis启动时在后台运行,并生成一个pid文件,退出redis后删除;
#默认redis不作为守护进程运行,不生成pid文件;
#########################################################
supervised no
#不开启监督;
pidfile /data/6379/redis.pid
#redis服务在后台运行时存放pid文件的路径;
loglevel notice
#########################################################
#日志级别;
# debug :很多信息,对开发/测试有用;
# verbose:很多精简的有用信息,但是不像debug等级那么多;
# notice:适量的信息,基本上是你生产环境中需要的程度(默认);
# warning:只有很重要/严重的信息会记录下来;
#########################################################
logfile /data/6379/redis.log
#redis的日志文件路径;
#syslog-enabled yes
#开启系统日志,默认不开启;
#syslog-ident redis
#系统日志标识符;
#syslog-facility local0
#指定syslog工具,必须是user或local0-local7之间;
databases 16
##########################################################
#数据库的数量,默认使用的数据库是DB0,可以使用select
#另一个数据库;
##########################################################
always-show-logo yes
#启动时在日志中显示ASCII art徽标;
save 900 1
#如果在15分钟之内有1个key值改变就保存;
save 300 10
#如果在5分钟之内有10个key值改变就保存;
save 60 10000
#如果在1分钟之内有10000个key值改变就保存;
stop-writes-on-bgsave-error yes
#持久化出现错误后,依然继续工作;
rdbcompression yes
#############################################################
#压缩rdb数据库文件,采用lzf压缩,如果为了节约cpu的时间,可以关闭该选
#项,但是会导致数据库文件变的巨大;
#############################################################
rdbchecksum yes
#############################################################
#效验rdb文件,有利于文件的容错性,但是在保存和加载rdb文件时,会有大概10%的
#性能损耗,如果追求高性能就关闭该配置;
##############################################################
dbfilename dump.rdb
#redis持久化rdb数据库文件名称;
dir /data/6379
#redis持久化数据库文件存放目录,包括aof,rdb数据库文件,默认是./;
replica-serve-stale-data yes
##############################################################
#当从节点失去和主的连接或者从的复制正在进行,从节点有2种运行方式:
#yes: 继续响应客户端的请求,可能是正常数据也可能是空数据;
#no: 对所有类型的命令都出现错误“SYNC with master in progress”,但是
#对INFO、shutdown等系统状态信息命令不影响;
##############################################################
#replicaof 172.16.1.90 6379
#设置主从同步主库的ip和端口号;
#masterauth root
#设置主从同步主库的密码;
replica-read-only yes
#从不可以写入数据只读(默认);
repl-diskless-sync no
#主从同步策略为不使用磁盘方式;
repl-diskless-sync-delay 5
##############################################################
#无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到
#待传送的目标队列中,这个时间默认是5秒,设置为0,传输将尽快开始;
##############################################################
repl-disable-tcp-nodelay no
#############################################################
#不启用TCP_NODELAY,主从传输速度比较快,但是会占用比较多
#的带宽,如果启用则相反;
#############################################################
replica-priority 100
#副本优先级,当主节点出现故障好,优先级小的将接替,0表示该节点不可用;
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
#上面四行以非阻塞的方式释放内存(类似于flushall,flushdb,del命令);
appendonly yes
#开启aof持久化;
appendfilename "appendonly.aof"
#aof持久化的文件名;
appendfsync everysec
##########################################################
#aof持久化,磁盘同步方式:
#no:表示等操作系统进行数据缓存同步到磁盘,linux约30s(会丢失30s的内存数据,速度快);
#always:表示每次更新操作后调用fsync()将数据写到磁盘(慢,安全);
#everysec:表示每秒同步一次(折中,默认值),会丢失1秒的内存数据;
##########################################################
no-appendfsync-on-rewrite no
#当主进程在进行向磁盘的写操作时,将会阻止其它的fsync调用;
auto-aof-rewrite-percentage 100
#aof文件触发自动rewrite的百分比,值为0则表示禁用自动;
auto-aof-rewrite-min-size 64mb
#aof文件触发自动rewrite的最小文件size;
aof-load-truncated yes
#加载不完整的aof文件来进行启动;
aof-use-rdb-preamble yes
#重写AOF文件时,Redis可以在中使用RDB前导码
lua-time-limit 5000
#设置lua脚本的最大运行时间,单位为毫秒
slowlog-log-slower-than 10000
#超过10000um的查询被记录到内存中;
slowlog-max-len 128
#慢查询最大的记录数;
latency-monitor-threshold 0
#############################################################
#延迟监控,用于记录等于或超过了指定时间的操作,默认是关闭状态,即值为0;
#############################################################
notify-keyspace-events ""
#事件通知,默认不启用;
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
#使用内存高效的数据结构进行编码,最大条目不超过给定的值,默认就可;
hll-sparse-max-bytes 3000
################################################################
#小于给定值的使用稀疏数据结构(sparse),大于给定值的使用稠密的数据结构(dense);
#建议3000,以便获得空间有效编码的好处,如果对空间要求高,cpu要求不
#高,可以设为1000左右;
#################################################################
stream-node-max-bytes 4096
stream-node-max-entries 100
#节点流限制;
activerehashing yes
#激活hash;
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
#客户端缓冲限制,用于断开那些从服务端读取速度不够快的客户端;
hz 10
#任务运行频率1s/hz;
dynamic-hz yes
#通过这种方式,空闲实例将使用非常少的CPU时间,而繁忙的实例将更具响应性;
aof-rewrite-incremental-fsync yes
#当重写AOF文件时,如果启用了以下选项,则每生成32 MB数据将对文件进行fsync;
rdb-save-incremental-fsync yes
#当redis保存RDB文件时,如果启用了以下选项,生成的每32 MB数据将对文件进行fsync;
(4)制作redis启动脚本:
vim /data/6379/redis.sh
#!/bin/sh
. /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
IP="172.16.1.90"
PORT="6379"
PASSWORD="root"
REDIS_HOME="/application/redis/src/redis-server"
CONFIG="/data/$PORT/redis.conf"
REDIS_ADMIN="redis-cli -h $IP -a $PASSWORD -p $PORT"
REDIS_PID="/data/$PORT/redis.pid"
[ $UID -eq 0 ] || {
echo "please use root"
exit 1
}
function usage (){
echo "USAGE:sh $0 |start|stop|restart|"
}
RETVAL=0
function check() {
RETVAL="$?"
if [ $RETVAL -eq 0 ]; then
action "$1" /bin/true
else
action "$1" /bin/false
fi
}
function start() {
if [ -f ${REDIS_PID} ]; then
echo "REDIS IS RUNNIG……"
else
${REDIS_HOME} $CONFIG
check "START REDIS"
fi
}
function stop() {
if [ -f ${REDIS_PID} ]; then
${REDIS_ADMIN} shutdown &>/dev/null
check "STOP REDIS"
else
echo "REDIS IS STOP……"
fi
}
function main(){
if [ $# -eq 1 ]; then
case "$1" in
start)
start
sleep 2
;;
stop)
stop
sleep 2
;;
restart)
stop
start
;;
*)
usage
;;
esac
else
usage
fi
}
main $*
(5)启动redis实例:
/data/6379/redis.sh start
START REDIS [ 确定 ]
netstat -tunlp | grep "6379"
tcp 0 0 172.16.1.90:6379 0.0.0.0:* LISTEN 2942/redis-server 1
(6)查看redis实例的目录结构:
tree /data/6379
/data/6379
├── dump.rdb
├── redis.conf
├── redis.log
└── redis.sh
(7)登录redis:
redis-cli -h 172.16.1.90 -p 6379 --raw #因为默认端口是6379所以不指定也可以,--raw参数可以避免中文乱码的问题;
172.16.1.90:6379> auth root #密码验证;
OK
172.16.1.90:6379> set liuchang 24 #设置key-value数据;
OK
172.16.1.90:6379> get liuchang #通过key获取value值;
"24"
172.16.1.90:6379> keys *
1) "liuchang"
172.16.1.90:6379> shutdown #关闭redis数据库;
not connected>
14.3、redis的数据类型:
/application/redis/src/redis-server /data/6379/redis.conf
redis-cli -h 172.16.1.90 -p 6379
172.16.1.90:6379> auth root
OK
172.16.1.90:6379> keys *
(empty list or set)
查看key的数据类型:TYPE key
1、字符串(string):
(1)说明:
1)一个value最大可以存512MB的数据;
2)统计网站访问数量、当前在线人数、微博数、粉丝数等,全局递增ID等;
3)使用key-value存储数据;
4)示意图:
(2)使用方法:
1)存放单个数据:
SET key value
172.16.1.90:6379> set lc1 1
OK
2)获取单个数据:
GET key
172.16.1.90:6379> get lc1
"3"
3)批量存放数据;
MSET key1 value1 [key2 value2]
172.16.1.90:6379> mset lc2 2 lc3 3
OK
4)批量获取数据:
MGET key1 key2
mget lc1 lc2 lc3
1) "1"
2) "2"
3) "3"
5)将value值增加1:
INCR key
172.16.1.90:6379> incr lc1
(integer) 2
172.16.1.90:6379> get lc1
"2"
6)将value值减1:
DECR key
172.16.1.90:6379> decr lc1
(integer) 1
172.16.1.90:6379> get lc1
"1"
7)只有key不存在时,才设置key的value值(用于写):
SETNX key value
172.16.1.90:6379> setnx lc1 4
(integer) 0
8)返回字符串的长度:
STRLEN key
172.16.1.90:6379> STRLEN lc2
(integer) 1
9)判断key值是否存在(用于读写):
EXISTS key
172.16.1.90:6379> exists lc5
(integer) 0
172.16.1.90:6379> exists lc2
(integer) 1
10)将value追加到key原来的值的末尾:
APPEND key value
172.16.1.90:6379> append lc1 2
(integer) 2
172.16.1.90:6379> get lc1
"12"
11)减去指定量:
INCRBY key value
172.16.1.90:6379> incrby lc1 100
(integer) 112
172.16.1.90:6379> get lc1
"112"
12)添加指定量:
DECRBY key value
172.16.1.90:6379> decrby lc1 100
(integer) 12
172.16.1.90:6379> get lc1
"12"
13)小结:在对数据进行修改的时候需要对key进行判断,判断数据是否存在;
2、哈希表(hash):
(1)说明:
1)使用key-value的形式存储数据;
2)保存用户的详细信息。用ID作为key,value则用一组field-value的形式保存;
3)类似于表和字段的关系,hash适合于存储对象;
4)redis hash是一个string类型的field和value的映射表;
5)每个hash可以存储2^32-1个键值对;
6)示意图:
(2)使用方法:
1)存放单个数据:
如果filed值相同,会覆盖value
HSET key field value
172.16.1.90:6379> hset test lc1 1
(integer) 1
2)获取单个数据:
HGET key field
172.16.1.90:6379> hget test lc1
"1"
3)获取所有数据:
HGETALL key
172.16.1.90:6379> hgetall test
1) "lc1"
2) "1"
4)存放多个数据:
HMSET key field1 value1 [field2 value2]
172.16.1.90:6379> hmset test lc2 2 lc3 3
OK
5)获取多个数据:
HMGET key field1 [filed2]
172.16.1.90:6379> hmget test lc1 lc2 lc3
1) "1"
2) "2"
3) "3"
6)判断数据是否存在:
HEXISTS key field
172.16.1.90:6379> hexists test lc1
(integer) 1
172.16.1.90:6379> hexists test lc5
(integer) 0
7)获取长度:
HLEN key
172.16.1.90:6379> hlen test
(integer) 3
8)删除某个filed:
172.16.1.90:6379> hdel test lc3
(integer) 1
172.16.1.90:6379> hget test lc3
(nil)
9)获取所有的filed:
HKEYS key
172.16.1.90:6379> hkeys test
1) "lc1"
2) "lc2"
10)获取所有filed的value数据:
HVALS key
172.16.1.90:6379> hvals test
1) "1"
2) "2"
11)增加或减去某个数值:
HINCRBY key filed +|-number
172.16.1.90:6379> hget test lc1
"1"
#增减数值:
172.16.1.90:6379> hincrby test lc1 100
(integer) 101
172.16.1.90:6379> hget test lc1
"101"
#减去数值:
172.16.1.90:6379> hincrby test lc1 -90
(integer) 11
172.16.1.90:6379> hget test lc1
"11"
3、列表(list):
(1)说明:
1)获取最新的评论列表,获取最后登录10个用户,获取最近7天的活跃用户数等;
2)redis列表是简单的字符串列表;
3)按照插入顺序排序每个数据;
4)list可以存储2^32-1个键值对;
5)示意图:
(2)用法:
1)将一个或多个值插入到列表头部:
LPUSH key value1 [value2]
172.16.1.90:6379> lpush chang 1 2 3 4 5
(integer) 5
2)返回指定的元素:
LRANGE key <开始下标> <结束下标>
默认情况下下标值是从0开始的;
172.16.1.90:6379> lrange chang 0 4
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
3)显示列表的长度:
LLEN key
172.16.1.90:6379> llen chang
(integer) 5
4)移出并获取列表的第一个元素:
LPOP key
172.16.1.90:6379> lpop chang
"5"
172.16.1.90:6379> lrange chang 0 4
1) "4"
2) "3"
3) "2"
4) "1"
5)在列表尾部添加一个或多个值:
RPUSH key value1 [value2]
172.16.1.90:6379> RPUSH chang 2 3 4 5
(integer) 8
172.16.1.90:6379> lrange chang 0 7
1) "4"
2) "3"
3) "2"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
6)移除并获取列表最后一个元素:
RPOP key
172.16.1.90:6379> rpop chang
"5"
172.16.1.90:6379> lrange chang 0 7
1) "4"
2) "3"
3) "2"
4) "1"
5) "2"
6) "3"
7) "4"
7)返回列表key中下标为index的元素:
LINDEX key <下标>
172.16.1.90:6379> lindex chang 3
"1"
8)将列表key下标为index的元素的值设为value:
LSET key index value
172.16.1.90:6379> lset chang 3 5
OK
172.16.1.90:6379> lrange chang 0 7
1) "4"
2) "3"
3) "2"
4) "5"
5) "2"
6) "3"
7) "4"
9)插入数据位于某元素之前或之后:
LINSERT key before|after <指定的value> value
172.16.1.90:6379> LINSERT chang before 4 5
(integer) 8
172.16.1.90:6379> lrange chang 0 7
1) "5"
2) "4"
3) "3"
4) "2"
5) "5"
6) "2"
7) "3"
8) "4"
10)移除列表元素:
LREM key count value
count=0:删除所有指定的value;
count=2:删除前两个指定的value数据;
count=-2:删除后两个指定的value数据;
172.16.1.90:6379> lrem chang 0 4
(integer) 2
172.16.1.90:6379> lrange chang 0 7
1) "5"
2) "3"
3) "2"
4) "5"
5) "2"
6) "3"
4、集合(set):
(1)说明:
1)Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据;
2)Redis中集合是通过哈希表实现的;
3)集合中最大的成员数为 2^32-1;
4)示意图:
5)利用唯一性,可以存取当天的活跃用户列表;
利用集合操作,可以取不同兴趣圈子的交集,可以取当天的新增用户等;
6)key-value存储;
(2)用法:
1)向集合添加一个或多个成员:
SADD key member1 [member2]
172.16.1.90:6379> sadd tt 1 2 3 4 5
5
172.16.1.90:6379> sadd tt1 4 5 6 7 8
5
2)返回集合中的所有的成员:
SMEMBERS key
172.16.1.90:6379> SMEMBERS tt
1
2
3
4
5
172.16.1.90:6379> SMEMBERS tt1
4
5
6
7
8
3)返回给定所有集合的差集:
SDIFF key1 [key2]
sdiff tt1 tt #前面的集合减去后面的集合;
6
7
8
4)返回给定所有集合的交集:
SINTER key1 [key2]
172.16.1.90:6379> sinter tt tt1
4
5
5)返回所有给定集合的并集:
SUNION key1 [key2]
172.16.1.90:6379> sunion tt tt1
1
2
3
4
5
6
7
8
6)判断 member 元素是否是集合 key 中的成员:
SISMEMBER key member
172.16.1.90:6379> sismember tt 5
1
172.16.1.90:6379> sismember tt 6
0
7)移除集合中一个或多个成员:
SREM key member1 [member2]
172.16.1.90:6379> srem tt 3 4 5
3
172.16.1.90:6379> smembers tt
1
2
8)获取集合的成员数:
SCARD key
172.16.1.90:6379> scard tt
(integer) 2
5、有序集合(zset):
(1)说明:
1)用于销量排名,积分排名,时间线等;
2)key-value存储数据;
3)Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员;
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序;
有序集合的成员是唯一的,但分数(score)却可以重复;
集合是通过哈希表实现的, 集合中最大的成员数为 2^32-1;
4)示意图:
(2)用法:
1)向有序集合添加一个或多个值:
ZADD key score1 member1 [score2 member2]
172.16.1.90:6379> zadd test2 1 liu1 2 liu2 3 liu3 4 liu4 5 liu5
(integer) 5
172.16.1.90:6379> zadd test3 33 liu3 5 liu5 6 liu6
(integer) 3
2)通过索引区间返回有序集合的成员:
ZRANGE key start stop [withscores]
172.16.1.90:6379> zrange test2 0 -1 withscores
1) "liu1"
2) "1"
3) "liu2"
4) "2"
5) "liu3"
6) "3"
7) "liu4"
8) "4"
9) "liu5"
10) "5"
172.16.1.90:6379> zrange test3 0 -1 withscores
1) "liu5"
2) "5"
3) "liu6"
4) "6"
5) "liu3"
6) "33"
补充:通过索引返回有序集中指定区间内的成员,分数从高到底:
ZREVRANGE key start stop [WITHSCORES]
172.16.1.90:6379> zrevrange test3 0 -1 withscores
1) "liu3"
2) "33"
3) "liu6"
4) "6"
5) "liu5"
6) "5"
3)显示有序集合的成员数:
ZCARD key
172.16.1.90:6379> zcard test2
(integer) 5
172.16.1.90:6379> zcard test3
(integer) 3
4)删除指定的成员:
ZERM key member1 [member2]
172.16.1.90:6379> zrem test2 liu5 liu4
(integer) 2
172.16.1.90:6379> zrange test2 0 -1 withscores
1) "liu1"
2) "1"
3) "liu2"
4) "2"
5) "liu3"
6) "3"
5)返回有序集中指定成员的分数值:
ZSCORE key member
172.16.1.90:6379> zscore test2 liu2
"2"
6)返回有序集合中指定成员的索引(用于判断该成员是否存在该有序集合中):
ZRANK key member
172.16.1.90:6379> zrank test2 liu2
(integer) 1
172.16.1.90:6379> zrank test2 liu8
(nil)
7)有序集合中对指定成员的分数加上增量 increment:
ZINCRBY key increment member
172.16.1.90:6379> zincrby test2 -100 liu2
"-98"
172.16.1.90:6379> zrange test2 0 -1 withscores
1) "liu2"
2) "-98"
3) "liu1"
4) "1"
5) "liu3"
6) "3"
8)通过分数范围返回有序集合指定区间内的成员:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
172.16.1.90:6379> zrangebyscore test2 1 3 withscores
1) "liu1"
2) "1"
3) "liu3"
4) "3"
补充:通过分数范围返回有序集合指定区间内的成员,并案分数从高到低排序:
172.16.1.90:6379> zrevrangebyscore test2 3 1 withscores
1) "liu3"
2) "3"
3) "liu1"
4) "1"
9)计算给定的一个或多个有序集的交集,并将结果集存储在新的有序集合 key 中:
ZINTERSTORE destination numkeys key [key …]
172.16.1.90:6379> zinterstore test4 2 test2 test3
(integer) 1
172.16.1.90:6379> zrange test4 0 -1 withscores
1) "liu3"
2) "36"
10)计算给定的一个或多个有序集的并集,并存储在新的 key 中:
ZUNIONSTORE destination numkeys key [key …]
172.16.1.90:6379> zunionstore test5 2 test2 test3
(integer) 5
172.16.1.90:6379> zrange test5 0 -1 withscores
1) "liu2"
2) "-98"
3) "liu1"
4) "1"
5) "liu5"
6) "5"
7) "liu6"
8) "6"
9) "liu3"
10) "36"
6、数据类型小结:
(1)数据类型:
string :key value
hash: key { value => ( key,value……) }
list: key { value => (value1……) }
set: key { value => (value1……) }
zset: key { value => (scores,value1……) }
(2)redis存储数据是按照key-value的形式存储数据的;
(3)key:不允许重复,重复会覆盖,所以在插入数据时需要判断key值是否重复;
(4)value:集合list是有序可重复;集合set和zset无序不可重复,重复的数据会插
不进去,所以在插入数据时需要判断该value是否存在;
14.4、redis高级应用:
1、redis服务器常用命令:
(1)info:redis服务器的信息;
(2)client list:显示目前连接到redis上的客户端信息;
(3)save:立刻持久化数据;
(4)monitor:实时监控目前连接到redis上的客户端执行的所有操作;
(5)config get *:获取redis所有的配置信息;
(6)config set <配置参数>:动态修改redis配置,当前有效,重启失效;
(7)dbsize:显示当前数据库的key数量;
(8)flushall:清空redis服务器内存和持久化文件中所有库的所有数据;
(9)select
(10)flushdb:清空redis服务器内存和持久化文件中当前库的所有数据;
(11)shutdown:关闭数据库;
(12)client kill ip:port #杀掉某个连接到redis的客户端;
2、redis数据存储:
(1)redis存储示意图:
(2)说明:
1)rdb持久化可以在指定的时间间隔内生成数据集的时间快照;
2)aof持久化记录服务器执行的所有的写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集;aof
文件中的命令全部以redis协议的格式来保存,新命令会被追加到文件的末尾;redis还可以在后台对aof文件进行重写,
使得aof文件的体积不会超出保存数据集状态所需要的实际大小;
3)redis还可以同时使用aof持久化和rdb持久化;在这种情况下,当redis重启后,它会优先使用aof文件来还原数据集,因为
aof文件保存的数据集通常比rdb文件所保存的数据更完整,没有使用rdb还原速度快;
4)可以关闭持久化功能,让数据只在服务器运行时存在,注释掉持久化参数aof和rdb参数;
5)mysql所有的数据都在硬盘中,需要用时才放到内存之中;redis所有的数据都在内存中,需要存储的才放到硬盘中,mysql和redis
的数据存储方式正好相反;
3、生产消费者模式:
(1)示意图:
队列模式中,用户可以同时从服务端读取消息,每个消息只被其中一个用户读到;
(2)实现例子:
循环使用rpush(在后面添加) lpop(在上面的消费);
可以比作生活中的消费者排队买包子;
4、发布-订阅模式:
(1)示意图:
用户订阅频道,当发布者更新频道消息时,消息被广播到订阅该频道的每一个用户,同一频道
的用户可以在不同的程序中,也可以在不同的机器上;
用户可以订阅任意数量的频道;
(2)实现例子:
可以比作生活中的关注微信公众号;
#客户端用户订阅频道:
172.16.1.90:6379> subscribe zhibo
Reading messages… (press Ctrl-C to quit)
1) "subscribe"
2) "zhibo"
3) (integer) 1
#频道管理员在频道中发布消息:
172.16.1.90:6379> publish zhibo "zhi bo kai shi le"
(integer) 1
#用户收到频道发布的消息:
172.16.1.90:6379> subscribe zhibo
Reading messages… (press Ctrl-C to quit)
1) "subscribe"
2) "zhibo"
3) (integer) 1
1) "message"
2) "zhibo"
3) "zhi bo kai shi le"
(3)补充:
1)订阅多个频道:
PSUBSCRIBE <频道1> <频道2> #订阅一个或多个符合给定模式的频道;
UNSUBSCRIBE <频道名称> #退订频道;
PUNSUBSCRIBE <频道1> <频道2> #退订多个频道;
PUBSUB NUMSUB <频道名称> #打印频道的订阅者数量;
5、redis事务:
(1)说明:
1)redis事务可以一次执行多个命令;
2)事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行;事务在执行
的过程中,不会被其他客户端发送来的命令请求所打断;
3)原子性:事务中的命令要么全部被执行,要么全部都不执行;
4)执行过程:
开始事务、命令入队、执行事务;
(2)事务命令:
1)discard:
取消事务;
2)exec:
执行所有事务块内的命令;
3)multi:
标记一个事务块的开始;
4)unwatch:
取消watch命令对所有key的监视;
5)watch key [key……]:
监视一个或多个key,如果在事务执行之前这个key被其他命令所改动,name事务将被打断;
(3)事务执行举例:
172.16.1.90:6379> zadd salary 2000 liu
(integer) 1
172.16.1.90:6379> zadd salary 3000 chang
(integer) 1
172.16.1.90:6379> multi
OK
172.16.1.90:6379> zincrby salary 1000 liu
QUEUED
172.16.1.90:6379> zincrby salary -1000 chang
QUEUED
172.16.1.90:6379> exec
1) "3000"
2) "2000"
172.16.1.90:6379> zrange salary 0 -1 withscores
1) "chang"
2) "2000"
3) "liu"
4) "3000"
6、慢查询日志:
slow log保存在内存之中,读写速度非常快;
(1)查看当前的slow log的配置:
172.16.1.90:6379> config get slow*
slowlog-log-slower-than #超过多少微秒;
10000
slowlog-max-len #保留多少条慢查询日志;
128
(2)动态修改slow log的配置:
config set slowlog-log-slower-than 10000
config set slowlog-max-len 200
(3)slowlog len:查看当前慢日志的数量;
(4)slowlog reset:清空内存中的所有慢日志;
(5)slowlog get 2:查看慢日志中的前两条;
7、数据备份:
(1)获取持久化rdb文件的存储目录:
config get dir
(2)备份还原操作:
在有无持久化策略时,只要执行save命令会立即把内存中的数据持久化为dump.rdb文件保存下来,默认保存位置是
启动redis服务时当前用户所在的目录,如果设置了其它目录,dump.rdb文件会保存在指定的存放路径下,把dump.rdb拷贝到备份目
录,还原时需要关闭redis服务,然后将备份的dump.rdb拷贝到原备份目录,然后启动redis服务即可;
通过shell脚本加定时任务进行数据备份;
8、如何关闭redis的持久化:
(1)查看当前持久化状态:
config get save #获取rdb持久化策略;
config get appendonly #获取aof持久化策略;
(2)动态关闭持久化;
config set save ""
config set appendonly no
(3)修改配置文件:
vim /data/6379/redis.conf
#save 900 1
#save 300 10
#save 60 10000
#注释掉rdb持久化策略;
appendonly no
#关闭掉aof持久化策略;
(4)通过以上操作在不关闭当前redis服务的情下即可关闭redis的持久化服务;
9、解决redis启动后日志中警告信息:
(1)解决在低内存下后台保存失败的警告:
echo 'vm.overcommit_memory=1' >>/etc/sysctl.conf
sysctl vm.overcommit_memory=1
(2)解决tcp大并发的问题:
echo '511' >/proc/sys/net/core/somaxconn
(3)解决内核中启用了透明大页面(THP)支持,导致Redis的延迟和内存使用问题:
echo 'never' >/sys/kernel/mm/transparent_hugepage/enabled
chmod +x /etc/rc.d/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >/etc/rc.local
(4)解决以上问题后需要重启redis服务;
手机扫一扫
移动阅读更方便
你可能感兴趣的文章