1. 安装redis
yum install redis 或wget官网的最新版本
配置文件默认在/etc/redis.conf
redis-benchmark 性能测试工具
redis-check-aof appendonly.aof日志校验工具
redis-check-dump dump.rdb日志校验工具
redis-cli redis 客户端
redis-server redis服务器端
2. redis服务的启动和redis客户端的连接
启动:redis-server /etc/redis.conf
cli连接:redis-cli 或者telnet ip port, 不建议用telnet,因为没有智能命令行
3. redis配置文件全解
==基本配置
daemonize no 是否以后台进程启动
databases 16 创建database的数量(默认选中的是database 0)
save 900 1 #刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后至少1个关键字发生变化。
save 300 10 #必须是300秒之后至少10个关键字发生变化。
save 60 10000 #必须是60秒之后至少10000个关键字发生变化。
stop-writes-on-bgsave-error yes #后台存储错误停止写。
rdbcompression yes #使用LZF压缩rdb文件。
rdbchecksum yes #存储和加载rdb文件时校验。
dbfilename dump.rdb #设置rdb文件名。
dir ./ #设置工作目录,rdb文件会写入该目录。
==主从配置
slaveof <masterip> <masterport> 设为某台机器的从服务器
masterauth <master-password> 连接主服务器的密码
slave-serve-stale-data yes # 当主从断开或正在复制中,从服务器是否应答
slave-read-only yes #从服务器只读
repl-ping-slave-period 10 #从ping主的时间间隔,秒为单位
repl-timeout 60 #主从超时时间(超时认为断线了),要比period大
slave-priority 100 #如果master不能再正常工作,那么会在多个slave中,选择优先值最小的一个slave提升为master,优先值为0表示不能提升为master。
repl-disable-tcp-nodelay no #主端是否合并数据,大块发送给slave
slave-priority 100 从服务器的优先级,当主服挂了,会自动挑slave priority最小的为主服
===安全
requirepass foobared # 需要密码
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 #如果公共环境,可以重命名部分敏感命令 如config
===限制
maxclients 10000 #最大连接数
maxmemory <bytes> #最大使用内存
maxmemory-policy volatile-lru #内存到极限后的处理
volatile-lru -> LRU算法删除过期key
allkeys-lru -> LRU算法删除key(不区分过不过期)
volatile-random -> 随机删除过期key
allkeys-random -> 随机删除key(不区分过不过期)
volatile-ttl -> 删除快过期的key
noeviction -> 不删除,返回错误信息
#解释 LRU ttl都是近似算法,可以选N个,再比较最适宜T踢出的数据
maxmemory-samples 3
====日志模式
appendonly no #是否需要AOF日志
appendfsync no # 系统缓冲,统一写,速度快
appendfsync always # 系统不缓冲,直接写,慢,丢失数据少
appendfsync everysec #折衷,每秒写1次
no-appendfsync-on-rewrite no #为yes,则其他线程的数据放内存里,合并写入(速度快,容易丢失的多)
auto-AOF-rewrite-percentage 100 当前aof文件是上次重写是大N%时重写
auto-AOF-rewrite-min-size 64mb aof重写至少要达到的大小
====慢查询
slowlog-log-slower-than 10000 #记录响应时间大于10000微秒的慢查询
slowlog-max-len 128 # 最多记录128条
====服务端命令
time 返回时间戳+微秒
dbsize 返回key的数量
bgrewriteaof 重写aof
bgsave 后台开启子进程dump数据
save 阻塞进程dump数据
lastsave
slaveof host port 做host port的从服务器(数据清空,复制新主内容)
slaveof no one 变成主服务器(原数据不丢失,一般用于主服失败后)
flushdb 清空当前数据库的所有数据
flushall 清空所有数据库的所有数据(误用了怎么办?)
shutdown [save/nosave] 关闭服务器,保存数据,修改AOF(如果设置)
slowlog get 获取慢查询日志
slowlog len 获取慢查询日志条数
slowlog reset 清空慢查询
info []
config get 选项(支持*通配)
config set 选项 值
config rewrite 把值写到配置文件
config restart 更新info命令的信息
debug object key #调试选项,看一个key的情况
debug segfault #模拟段错误,让服务器崩溃
object key (refcount|encoding|idletime)
monitor #打开控制台,观察命令(调试用)
client list #列出所有连接
client kill #杀死某个连接 CLIENT KILL 127.0.0.1:43501
client getname #获取连接的名称 默认nil
client setname "名称" #设置连接名称,便于调试
====连接命令===
auth 密码 #密码登陆(如果有密码)
ping #测试服务器是否可用
echo "some content" #测试服务器是否正常交互
select 0/1/2... #选择数据库
quit #退出连接
4. redis 常用命令
见官网 https://redis.io/commands
常用
select move
set mset get mget getset keys rename renamenx randomkey exist type
ttl expire persist
incr incrby decr decrby
链表
lpush rpush lrange lrem(删特定值) ltrim(截取指定范围的值) lindex(获取指定index的值) llen linsert
rpop|lpush task job(实现原子的将task任务队列移到处理任务中,并保证不丢失每个task)
字节操作
bitcount bitfield bitop bitpos getbit setbit
用位图法统计用户登录情况,节省内存和空间
无序集合
sadd smembers srem(删指定值) spop(随机删除一个值) sismember scard(获取元素个数)
smove(在2个集合中移动元素) sinter(求交集) sunion(求并集) sdiff(求差集)
有序集合
zadd zrange。。。。。。 能实现部分聚合运算和类sql的运算
hash
hset hmset hgetall hdel hlen hexists hinrby
事务操作---->订票系统
watch multi exec discard unwatch
pub/sub发布订阅模式-----> 在线聊天,消息推送
publish subscribe psubscribe(同时监听多个频道)
5. 主从配置方案
1主2从
master:
关闭dump.rdb开启aof
slave:
指定slave-of
某个slave开dump.rdb功能
配置从为只读模式,否则出现主从不同步问题
6. 运维相关
6.1 运维常用命令
TIME 查看时间戳与微秒数
DBSIZE 查看当前库中的key数量
BGREWRITEAOF 后台进程重写AOF
BGSAVE 后台保存rdb快照
SAVE 保存rdb快照
LASTSAVE 上次保存时间
SLAVEOF 设为slave服务器
FLUSHALL 清空所有db
FLUSHDB 清空当前db
SHUTDOWN[""|save|nosave] 断开连接,关闭服务器
SLOWLOG 显示慢查询
INFO 显示服务器信息
CONFIG GET 获取配置信息
CONFIG SET 设置配置信息
MONITOR 打开控制台
SYNC 主从同步
CLIENT LIST 客户端列表
CLIENT KILL 关闭某个客户端
CLIENT SETNAME 为客户端设置名字
CLIENT GETNAME 获取客户端名字
6.2 运维查看redis状态
1: 内存
#Memory
used_memory:859192
数据结构的空间
used_memory_rss:7634944
实占空间
mem_fragmentation_ratio:8.89
前2者的比例,1.N为佳
2:
主从复制
#Replication
role:slave
master_host:192.168.1.128
master_port:6379
master_link_status:up
3:持久化
#Persistence
rdb_changes_since_last_save:0
rdb_last_save_time:1375224063
4:fork耗时
#Status
latest_fork_usec:936 上次持久化花费微秒
5:慢日志
config
get/set slowlog-log-slower-than
CONFIG
get/SET slowlog-max-len
slow
log get 获取慢日志
7. redis key 设计技巧
7.1 基本设计
1. 把表名转换为key前缀如, tag:
2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid
3: 第3段放置主键值,如2,3,4...., a , b ,c
4: 第4段,写要存储的列名
7.2 类似索引设计
需要建索引的定义在前面
之后在在7.1中进行详细查询