1. Redis介绍
Redis是一个开源的使用ANSI C语言编写、基于内存的Key-Value数据库。
它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
Redis支持主从同步,数据可以从主服务器向任意数量的从服务器上同步,由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。
相比memcached,Rdeis有以下优点:
1. redis原生支持的数据类型更多。
2. redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。
3. redis支持master-slave模式的数据备份。
4. 性能。Redis作者的说法是平均到单个核上的性能,在单条数据不大的情况下Redis更好。
为什么这么说呢,理由就是Redis是单线程运行的。因为是单线程运行,所以和Memcached的多线程相比,整体性能肯定会偏低。因为是单线程运行,所以IO是串行化的,网络IO和内存IO,因此当单条数据太大时,由于需要等待一个命令的所有IO完成才能进行后续的命令,所以性能会受影响。
2. 安装Redis
2.1Redis的安装十分简单,用yum或apt-get可以直接安装
1
2
|
# yum install epel-release (centos 7可以直接安装epel源)
# yum install redis
|
2.2 启动/停止Redis
1
2
3
4
|
# redis-server /etc/redis.conf
# systemctl start redis
# systemctl stop redis
|
3. 使用Redis
3.1 Redis-cli命令行操作KV
连接到Redis
1
2
|
# redis-cli -p port
# redis-cli
|
ping
1
|
127.0.0.1:6379>
ping
<br>PONG
|
设置键值
1
2
|
127.0.0.1:6379>
set
testkey
"hello"
OK
|
查询键
1
2
|
127.0.0.1:6379> get testkey
"hello"
|
删除键
1
2
|
127.0.0.1:6379> del testkey
(integer) 1
|
设定有效期限
1
2
|
127.0.0.1:6379> setex
test
10 111
OK
|
用EXPIRE key s 设定过期时间 毫秒用PEXPIRE
1
2
|
127.0.0.1:6379> EXPIRE test11 300
(integer) 1
|
用TTL key 查看过期时间 毫秒用PTTL
1
2
|
127.0.0.1:6379> TTL test11
(integer) 288
|
用PERSIST key 取消过期时间
1
2
|
127.0.0.1:6379> PERSIST test11
(integer) 1
|
3.2 高级功能
3.2.1 自增,自减等,INCR、DECR、INCRBY、SORT
1
2
3
4
5
6
7
8
|
127.0.0.1:6379>
set
counter 100
OK
127.0.0.1:6379> incr counter
(integer) 101
127.0.0.1:6379> incr counter
(integer) 102
127.0.0.1:6379> decr counter
(integer) 101
|
3.2.2 事务
1
2
3
4
5
6
7
8
9
10
11
12
|
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379>
set
test11 111111
QUEUED
127.0.0.1:6379>
set
test12 121212
QUEUED
127.0.0.1:6379> incr counter
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (integer) 102
|
3.2.3 HyperLogLogs
Redis 在 2.8.9 版本添加了 HyperLogLog 算法。
3.2.4 发布/订阅 功能
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。
在一个客户端订阅频道 redisChat
1
2
3
4
5
|
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1)
"subscribe"
2)
"redisChat"
3) (integer) 1
|
在另一个客户端,发送消息到频道 redisChat,订阅者就能接收到消息
发布端:
1
2
|
127.0.0.1:6379> PUBLISH redisChat
"redis haha"
(integer) 1
|
订阅端:
1
2
3
4
5
6
7
8
|
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1)
"subscribe"
2)
"redisChat"
3) (integer) 1
1)
"message"
2)
"redisChat"
3)
"redis haha"
|
3.3查看Redis状态
1
|
127.0.0.1:6379> info
|
info输出的信息很多,可以指定输出的部分
1
|
127.0.0.1:6379> info stats
|
1
|
127.0.0.1:6379> info memory
|
used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位。
used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps等命令的输出一致。
rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。
内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。
used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。
used_memory_peak : 峰值,设定的最大内存要大于峰值
3.4 其他命令
查看记录数
1
|
127.0.0.1:6379> dbsize
|
查看所有KEY
1
|
127.0.0.1:6379> KEYS *
|
列出所有客户端连接
1
|
127.0.0.1:6379> CLIENT LIST
|
关闭ip:port的客户端
1
|
127.0.0.1:6379> CLIENT KILL 127.0.0.1:11902
|
清空所有数据库的所有key
1
|
127.0.0.1:6379> FLUSHALL
|
清空当前数据库中所有key
1
|
127.0.0.1:6379> FLUSHDB
|
返回最后一次成功保存数据到磁盘的时间,以UNIX时间戳格式表示
1
|
127.0.0.1:6379> LASTSAVE
|
返回当前服务器时间,以UNIX时间戳格式表示
1
|
127.0.0.1:6379> TIME
|
连接到其他数据库(默认数据库是0)
1
2
|
127.0.0.1:6379> SELECT 1
OK
|
将当前数据库的 key移动到指定的数据库
1
2
|
127.0.0.1:6379> MOVE test2 1
(integer) 1
|
4. 设定文件
4.1 /etc/redis.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
|
daemonize no 是否以后台daemon方式运行
timeout 0 请求超时时间
maxclients 10000 最大连接数
maxmemory <bytes> 最大内存
maxmemory-policy volatile-lru 达到最大内存时的LRU驱逐策略
maxmemory-samples 3 随机抽取n个key执行LRU
hash
-max-ziplist-entries 512 Map内部不超过多少个成员时会采用线性紧凑格式存储
hash
-max-ziplist-value 64 Map内成员值长度不超过多少字节会采用线性紧凑格式存储
类似的还有,list-max-ziplist-entries 512,list-max-ziplist-value 64等等
slowlog-log-slower-than 10000 slow log计入时间,microseconds(1000000)
slowlog-max-len 128 slow log计入条数
|
4.2 查看最大连接数
1
2
3
|
127.0.0.1:6379> config get maxclients
1)
"maxclients"
2)
"10000"
|
运行过程中调整参数
1
|
127.0.0.1:6379> config
set
maxclients 10001
|
4.3 查看slow log
1
2
3
4
5
6
|
127.0.0.1:6379> SLOWLOG get
127.0.0.1:6379> SLOWLOG get 10
1) 1) (integer) 0
2) (integer) 1448413479
3) (integer) 124211
4) 1)
"FLUSHALL"
|
确认slow log条数设定
1
|
127.0.0.1:6379> SLOWLOG len
|
清空slow log
1
|
127.0.0.1:6379> SLOWLOG reset
|
5. 数据持久化
5.1 快照(snapshot)
5.1.1 在设定文件中设置快照
1
2
3
4
|
save <seconds> <changes> 开启快照,并设定保存快照到硬盘的频率
rdbcompression
yes
/no
保存快照的时候,是否压缩
dbfilename dump.rdb 指定快照的文件名(Append Only File也保存在此)
dir
/var/lib/redis/
指定快照存放的场所
|
5.1.2 手动创建快照
在命令行执行save或bgsave命令
1
2
|
127.0.0.1:6379> SAVE
OK
|
5.2 日志备份(Append Only File)
类似于mysql的binlog,将操作都记录在log里。快照达不到要求保存的精度时,和快照结合使用,不建议单独使用。默认间隔是1秒,可以修改。
5.2.1 在设定文件中设置AOF
1
2
3
4
|
appendonly
yes
开启Append Only File
appendfilename
"appendonly.aof"
指定日志文件名
appendfsync always
/everysec/no
指定写日志的频率
no-appendfsync-on-rewrite no 当有bgsave等其他进程执行fsync()时,AOF和appendfsync none动作一样
|
5.3 还原
要恢复Redis的数据只需移动 Redis 的备份文件(dump.rdb,appendonly.aof)到 Redis 目录,然后启动服务器。
为了得到你的 Redis 目录,使用命令如下所示:
1
2
3
|
127.0.0.1:6379> config get
dir
1)
"dir"
2)
"/var/lib/redis"
|
6. 后记
本文简单介绍了Redis的安装及使用,接下来介绍主从同步,负荷分散。