Loading

14、redis安装及数据类型


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 <DBid>连接到

#另一个数据库;

##########################################################

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 <number>:切换库;

(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服务;
















posted @ 2020-02-17 13:05  云起时。  阅读(244)  评论(0编辑  收藏  举报