Redis
Redis 是一个key-value存储系统
和memcached类似,但支持数据持久化
支持更多的value类型,除了和string外,还支持hash.lists
Redis用了2种格式,全量数据(RDB)和增量请求(aof)
,全量数据格式就是把内存的数据写入到硬盘
。增量请求文件则是把内存中的数据序列化为操作请求。用于读取文件进行replay得到数据
Redis的存储分为内存存储、磁盘存储和Log文件三部分。
安装
wget https://github.com/antirez/redis/archive/2.8.19.tar.gz
tar zxvf 2.8.19.tar.gz
cd redis2.8.19
make
Cd deps
Make hiredis lua jemakkoc
make PREFIX=/usr/local/redis install
redis 数据类型-string
aliasredis-cli='/usr/local/redis/bin/redis-cli'
vim .bashrc alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
aliasredis-cli='/usr/local/redis/bin/redis-cli'
redis-cli
127.0.0.1:6379> set key1 aminglinux
OK
127.0.0.1:6379> get key1
"aminglinux"
127.0.0.1:6379> mset key1 aming key2hello key3 yes
OK
127.0.0.1:6379> mget key1 key2 key3
1) "aming"
2) "hello"
3) "yes"
127.0.0.1:6379>
Ctrl+d退出
[root@liuzan ~]# redis-cli get key1
"aming"
Redis数据类型-List
127.0.0.1:6379> lpush list1 123 从左边插入123(lpush从左边插入)
(integer) 1
127.0.0.1:6379> LPUSH list1 aaa
(integer) 2
127.0.0.1:6379> LPUSH list1 "123456"
(integer) 3
127.0.0.1:6379> RPOP list1 右侧取值取完值后队列里就不存在123了
"123"
127.0.0.1:6379> LRANGE
(error) ERR wrong number of arguments for'lrange' command
127.0.0.1:6379> LRANGE list1 0 -1 查看List1 0为最左侧 -1为最右侧
1) "123 456"
2) "aaa"
127.0.0.1:6379> LPOP list1 最左侧取值
"123 456"
127.0.0.1:6379> LRANGE list1 0 -1
1) "aaa"
127.0.0.1:6379> RPUSH list aaa 从右侧插入
(integer) 1
127.0.0.1:6379> LRANGE list1 0 -1
Aaa
数据类型 set
集合
27.0.0.1:6379> ZADD myset 12"123" 加入集合123排序12
(integer) 1
127.0.0.1:6379> ZADD myset 2"abc"加入集合abc排序2
(integer) 1
127.0.0.1:6379> ZADD myset 20"ac"加入集合ac排序20
(integer) 1
127.0.0.1:6379> ZRANGE myset 0 -1查看集合
1) "abc"
2) "123"
3) "ac"
127.0.0.1:6379> ZREVRANGE myset 0 -1倒序查看
1) "ac"
2) "123"
3) "abc"
127.0.0.1:6379>
数据类型hash
127.0.0.1:6379> HSET hash2 name aaa 添加hashnameaaa
(integer) 1
127.0.0.1:6379> HSET hash2 age 10
(integer) 1
127.0.0.1:6379> HGETall hash2 查看hash内容
1) "name"
2) "aaa"
3) "age"
4) "10"
127.0.0.1:6379> hget hash2 age 取出age数值
"10"
127.0.0.1:6379>
Redis 数据持久化
分别是rdb (redis database) aof (append only file)
Rdb..就是在不同的时间点,将redis 存储的数据生成快照并存储到磁盘介质上
Aof。。则是换了一个角度实现持久化。就是将redis执行过的所有写指令记录下来
。在下次redis重启时,只要把这些写指令从前到后在重复一遍。就可以实现数据恢复
Rdb和aof两种方式可以同时使用,重启是优先采用aof方式来进行数据恢复。因为aof方式的数据恢复完整度更高
没有数据持久化需求,可以完全关闭rdb和aof方式。这样的话redis就可以和memcached一样了是内存模式
Redis配置讲解
Daemonize no 默认下,redis并不是以daemon形式来运行的。通过daemonize配置项可以控制redis的运行形式,yes是在后台运行
Pidfile /path/to/redis.pid 当以daemon形式运行时,redis会生成一个Pid文件,默认会生成在/var/run/redis.pid
Bind 192.168.1.2 10.8.4.2 指定绑定的ip.可以有多个
Port 6379 指定监听端口
Unixsocket /tmp/redis.sock 也可以监听socket
Unixsocketperm 755 当监听socket 时可以指定权限为755
Timeout 0 当一个redis-client 一直没有请求发向server端,那server端有权主动关闭这个连接。可以通过timeout来设置“空闲超时时限”,0表示永不关闭。
Tcp-keepalive 0 tcp连接保活策略,可以通过tcp-keepalive配置项来设置,单位为秒,则server端会每60秒向连接空闲的客户端发起一次ack请求,以检查客户端是否挂掉,无响应则关闭。0则不会进行保活检测
Loglevel notice 日志级别,有四种debug.verbose,notice,warning
Logifle 定义日志路径
Syslog-ident redis 如果希望日志打印到syslog中,通过syslog-enabled来控制,另外syslog-ident还可以让你指定syslog里的日志标志
Syslog-facility local 0 指定syslog的设备,可以是user或者local0 �local7
Databases 16 设置数据库的总数量 select n 选择数据库,0 -15
Redis快照配置rdb
Save 900 1 表示15分钟一次快照至少有1个Key改变就触发一次
Save 300 10 表示每5分钟且至少有10个Key改变,触发一次
Save 60 10000 表示每60秒至少有10000个key改变,就触发一次
Save “” 这样可以禁用rdb持久化
Stop-write-on-bgsave-error yes rdb持久化写入磁盘避免不了出现失败的情况,默认一旦出现失败,redis会马上定时些操作,如果你觉得无所谓,那就可以使用该选项关闭这个功能
Rdbcompression yes 是否要压缩
Rdbchecksum yes 是否进行数据校验
Dbfilename dump.rdb 定义快照文件名字
Dir ./ 定义快照文件存储路径
Redis 安全配置
Requirepass aminglinux
设置redis-server密码
redis-cli -a aminglinux 有密码登陆
Rename-command config aminglinux.config
将config命令更名为aminglinux.config 这样可以避免误操作,但如果使用了aof持久化,建议不要启用该功能。
config set timeout 10 更改timeout值
config get timeout 查看timeout值
Rename-command config “”
也可以后面定义为空,这样就禁用了config命令
限制相关配置
Maxclients 10000 限制最大客户端连接数
Maxmemory<bytes> 设定最大内存使用数 单位byte
Maxmemory-policy volatile-lru 指定内存移除规则
Maxmemory-samples 3 lru算法和最小ttl算法都并非是精确的算法
是估算值,所以你可以设置样本的大小,
Redis aof持久化相关配置
Appendonly no 如果是yes,则开启aof持久化
Appendfilename “appendonly.aof” 指定aof文件名字,保存在dir参数指定的目录
Appendfsync everysec 指定fsync调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒调用一次fsync),第一种最快,第二种数据最安全,但性能会差,第三种为这种方案,认为第三种
No-appendfsync-on-rewrite no使用no可避免当写入量非常大时的磁盘io阻塞
Auto-aof-rewrite-percentage 10 规定什么情况下触发aof重写,该值为一个比例,10表示当aof文件增幅达到10%时则会触发重写机制
Uto-aof-rewrite-min-size 64mb 重写会有一个条件,就是不能低于64Mb
慢日志
Slowlog-log-slower-than 10000 慢于10000ms则记录日志
Slowlog-max-len 128 日志长度
Redis主从
Master 192.168.31.105 slave 192.168.31.112
Master配置文件不动
Slave配置文件加上一行
Slaveof 192.168.31.105 6379
如果master有密码
则加上 masterauth passwd
分别启动master 和 slave
主从其他配置
Slave-read-only yes 让从只读
Repl-ping-slave-period 10 设置slave向master 发起ping 的频率,每10s一次
Repl-timeout 60 设置slave ping 不通master 多少秒后超时
Repl-disable-tcp-nodelay no 是否开启tcp-nodelay开启后将会使用更少的带宽。但会延迟,建议关闭
Repl-backlog-size 1mb 同步队列的长度,backuplog是master的一个缓冲区,主从断开后,master会先把数据写到缓冲区,slave再次连续会从缓冲去种同步数据
Repl-backlog-ttl 3600 主从断开后,缓冲的有效期,默认1小时
Slave-priority 100 多个slave是可以设置优先级的,数值越小优先级越高,应用与集群中,支持slave切换为master,优先级最高的才会切换
Min-slave-to-write 3 和下面的一起使用,他的意思是master发现有超过3个slave的延迟高于10S,那么master就会暂时停止写操作,这两个数值任何一个为0则关闭该功能,默认第一数值为0
Min-slaves-max-lag 10
Redis常用命令
String类型常用命令
Set key1 aminglinux 创建key1 aming
Setnx key1 amingliunx setnx去赋值一个key 如果key存在则赋值不成功,不存在成功
Setex key1 100 111 给key1设定有效时间
Ttl key1 查看key1的有效时间
Mset key1 1 key2 2 key3 3 批量设置key valus
Hash类型
Hset hash1 name aming 建立键值对
Hset hash1 age 30
Hset hash1 job it
Hgetall hash1
Hmset hash2 name xiaowang age 30 jobteacter 批量创建键值对
hmset hash2 name xiaowang age 30 job techer
OK
127.0.0.1:6379> hgetal hash2
(error) ERR unknown command 'hgetal'
127.0.0.1:6379> hgetall hash2
1) "name"
2) "xiaowang"
3) "age"
4) "30"
5) "job"
6) "techer"
Hdel hash2 job 删除键值对
Hkeys hash2 打印所有键值
Hvals hash2 打印所有键对应的值
Hlen hash2 查看由hash几个filed
List 列表
Lpush 从左边压入
Lpush list1 a
Lpush list1 2
Lrange list1 0 -1 查看list1 的一个和最后一个值
Lpop list1 取出list1 最左侧的值
Rpush list1 从右边插入
Rpush list1 1
Rpush list1 2
Rpop list1 取出list1 最右侧的值
Linsert list1 before a e 在a的前面插入一个e
Lset list1 4 bbb 把第5个元素修改为bbb
Lindex list1 0 查看一个元素
Llen list1 查看链表中有几个元素
Set 数据常用操作
sadd set1 1 出入集合
smembers set1 查看set1集合 不会自己去排序
srem set1 1删除元素
spop set1 随机取出一个元素
sdiff set1 set2 求差集比较一样的。不一样的会输出,在前面的set1以原点比较
sdiffstore set3 set2 set1 把set2 和set1不同的元素插入到set中
sinter set1 set2 求交集一样的输出
sinterstore set4 set1 set2 把set1 set2一样的存到set4中
sunion set1 set2 并集吧所有的元素输出
sunionstore set5 set1 set2 存入到set5
sismember set1 aming判断aming是否在set1中
srandmember set5 随机取出一个元素但不删除。
Zset 数据常用操作
Zadd zset1 1 abc
Zadd zset1 10 1abc
Zadd zset1 88 2abc
Zrange zset1 0 -1 查看zset1并且排序
Zrange zset1 0 -1 withscores 查看zset1 排序并显示分值
Zrem zset1 abc 删除元素abc
Zrank zset1 0 -1 返回元素索引值
Zrank zset1 abc 返回abc的索引值
Zrevrank zset 同上,不同是,按照score返序排序
Zrevrange zset1 0 -1 返序显示所有元素,并带分值
Zcard zset1 返回集合众所有元素的个数
Zcount zset1 1 10 返回分值范围1-10的元素个数
Zrangebyscore zset1 1 10 返回分值范围1-10的元素
Zremrangebyrank zset1 0 2 删除索引范围0-2的元素按score正向排序
Zremrangebyscore zset1 1 10删除分值范围1-10的元素
键值相关操作
Keys * 取出所有Key
Keys my* 模糊匹配
Exists name 有name键返回1, 否则返回0;
Del key1 删除一个key 成功返回1 否则返回0
Expire key1 100 设置1 100s后过期
Ttl key 查看键 还有多长时间过期,单位是s,当key不存在是,返回-2,当key存在但没有设置剩余生存时间时,返回-1,否则,返回key的剩余生存时间
Select 0 代表选择当前数据库,默认进入0数据库
Move age 1 把age移动到1数据库
Persist key1 取消key1的过期时间
Randomkey 随机返回一个Key
Rename oldname newname 重命名key
Type key1 返回键的类型
服务
Dbsize 返回当前数据库key的数目
Info 返回redis 数据库状态信息
Flushdb 清空当前数据库所有键
Flushall 清空所有数据库中的键
Php 中应用redis
Wget https://codeload.github.com/phpredis/phpredis/zip/develop
Mv develop develop.zip
Cd phpredis-develop/
/usr/local/php/bin/phpize 生成.configure文件
./configure--with-php-config=/usr/local/php/bin/php-config
Make && make install
Vim /usr/local/php/etc/php.ini
最后一行加入
extension = redis.so
redis 实现session 共享
php.ini中加入
session.save_handler = “redis”
session.save_path=”tcp://127.0.0.1:6379”
或者apache虚拟机主机加入
Php_value session.save_handler “redis”
Php_value session.save_path “tcp://127.0.0.1:6379”
或者php-fpm.conf d对应的pool 中加入
Php_value[session.save_handler]=redis
Php_value[session.save_path]=”tcp://127.0.0.1:6379”