redis是一个基于内存的键值对的数据库。支持5中数据类型其中包括字符串,链表,哈希,无序集合、有序集合。并且支持数据持久化操作(保证数据安全,在服务器重启之后,会自动的将数据还原到内存中)
安装
- 解压
[root@localhost redis]# tar -zxvf redis-2.6.14.tar.gz
- 安装
[root@localhost redis-2.6.14]# make && make install
- 创建软件目录
[root@localhost redis-2.6.14]# mkdir /usr/local/redis
- 复制服务到软件目录
[root@localhost redis-2.6.14]# cp src/redis-server /usr/local/redis/
- 复制配置文件到软件目录
[root@localhost redis-2.6.14]# cp redis.conf /usr/local/redis/
- 进入软件目录下启动Redis
[root@localhost redis-2.6.14]# /usr/local/redis/redis-server
- 修改Redis为后台启动
- 通过配置文件启动redis服务
- 查看是否正常运行
netstat -tunple|grep 6379
基本使用
- exists key
检查某个key是否存在 - del key
删除某个key - type key
检查key所对应的value的类型
在redis中对外显示没有整形,在内部有区分 - keys pattern
查找满足条件的所有的key
keys
keys user_ - rename oldkey newkey
重命名某个key
expire key
为某个key设置过期时间 - ttl key
查看某个key的有效时间 - select db
切换数据库
在redis中有数据库的概念。默认有16个数据库
每个数据库之间相互没有关系,默认是连接到0数据库
在redis配置项中有一个databases参数设置默认的数据个数 - flushdb
清空当前所在的数据库下的所有数据
redis的数据结构
字符串
可以包含任何数据,比如jpg图片或者序列化的对象(PHP中对象序列化函数serialize)。
单个value最大值上限是512M
如果说只用这种类型,Redis就像一个可以持久化的memcached服务器
常用命令
1
2
3
4
5
6
7
8
9
10
11 set key 设置key的值
get key 获取key的值
Mget key1 key2 ... 批量获取指定key的值
Mset key1 value1 key2 value2 ... 批量设置值
strlen key 返回字符串的长度
incr key 对key的值进行自增
decr key 对key的值进行自减
incrby key num 对key值进行自加num操作
decrby key num 对key值进行自减num操作
append key value 对key值的值末尾追加value 如果key不存在则创建
substr key start end 返回名称为key的字符串子串
哈希
hash是一个string类型的field和value的映射表。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
常用命令
1
2
3
4
5
6
7
8
9 hset key field value 添加一个filed属性 值为value
hget key field 返回field属性的值
hmset key field1 value1 field2 value2 批量设置key中field1和field2的值
hmget key field1 field2 批量获取key总field1 field2的值
hexists key field 检查key中为field属性的值是否存在
hdel key field 删除key中的field的属性
hlen key 返回key中属性的个数
hvals key 返回key中所有的value值
hgetall key 返回key总所有filed跟value对应值
链表
list类型其实就是一个每个子元素都是string类型的双向链表
链表可以使用在显示最新登录的用户,邮件队列。消息推送,抢购。
常用命令
1
2
3
4
5
6
7
8
9 rpush key value 表末添加一个元素
lpush key value 表头添加一个元素
lpop key 删除表头的元素
rpop key 删除表尾的元素
llen key 返回链表长度
lrange key start end 返回list 中key从start开始end之间的元素
ltrim key start end 截取名称为key 的list保留start到end之间的元素(该变了链表的元素)
lindex key index 返回list中为index位置的元素
iset key index value 给list中为index位置的元素赋值
集合
很多字符串组合在一起就叫做集合,对于集合两两之间可以进行交集、并集、差集。主要应用在社交关系处理,例如计算两个人之间的共同好友可以通过集合取交集得到结果
常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13 sadd key value 添加一个元素(集合中不能有重复元素)
strm key value 删除为value的元素
smembers key 返回所有的元素
spop value 返回一个随机被删除的元素(集合会被修改)
scard key 返回集合中有多少个元素
smove key key2 value 将key 中元素为value的转移到key2集合中,key2不存在则创建
sismember key value 测试key集合中是否存在value
sinter key1 key2 集合求交集
sinterstore key key1,key2 将集合key1和key2的交集保存到key集合中
sunion key1 key2 求并集
sunionstore key key1,key2 求并集 保存到key集合中
sdiff key1 key2 求差集
sidff key key1 key2 求差集保存到key集合中
有序集合
有序集合是在无序集合的基础之上增加了一个权重score,可以用于排序操作。
常用命令
1
2
3
4
5
6 zadd key score member 添加元素到集合中
zrem key member 删除指定元素
zcard key返回集合中的元素
zincrby key num member 将member上的分值增加num
zrank key member返回指定元素在集合中的排名 score从小到大排列
zrange key start end 获取集合中指定区间的元素
持久化
原理
redis定期的将内存中的数据转存储到磁盘上,如果一旦出现重启情况,redis会自动的将磁盘中备份数据还原到内存中
###snap shotting快照方式(默认方式)
实现1
redis默认开启快照备份功能,能够将数据存储到默认是存储到dump.rdb文件中
参数描述
1
2
3
4
5 save 900 1:表示在900秒之内(以上一次备份的时间)有一个key发生变化,就会触发备份操作
save 300 10:表示在300秒之内(以上一次备份的时间)有10个key发生变化,就会触发备份操作
save 60 10000:表示在60秒之内(以上一次备份的时间)有10000个key发生变化,就会触发备份操作
注意:只要有一个条件满足就会执行备份
问题:例如16:25这个时间点发生了一次备份,下次备份将会法师在16:40这个时间,然后16:30突然服务器重启了。还原过程中只能讲数据还原到16:25这个时间点上,因此数据丢失。
实现2
手动备份可以通过在客户端上执行save或者bgsave命令备份
save:表示前台备份,该方式会阻塞其他请求。
bgsave:后台备份方式,此方式不会阻塞其他请求。
阻塞过程中其他客户端不能正常操作数据
AOF备份
原理
aof备份会将每一个写入操作的命令都记录到某一个文件中,当redis重新运行起来之后,会把文件中记录的命令重新执行一遍,因此就能还原数据
开启aof备份
AOF备份默认是关闭的,通过配置项appendonle参数控制(注意:开启aof会清空所有的数据)1
2
3
4此三个参数是用于控制redis将命名写入文件中的速度
always:每写入一个命名刷新缓冲区的内容到文件中,即每写入一个命令就将命令写入到文件中
everysec:表示每秒钟写入一次
no:由系统决定什么时候写入
aof备份文件压缩
随着时间变长,redis中的aof备份文件会越来越大,有很多写入命名,在重复操作占用了空间,因此可以使用压缩功能将文件大小减少
在客户端命令行下使用bgrewriteaof
主从复制
192.168.34.101:作为主服务器也叫master服务器
192.168.153.128:作为从服务器,去同步主服务器中的数据,也叫slave服务器
实现步骤
- 设置从服务器
- 重启Redis服务
- 验证从服务器数据
主服务器关闭防火墙
权限验证
在redis中有权限验证的,验证方式只有密码,没有用户名,密码是存储在配置文件中,并且是明文存储,使用配置项requirepass指定密码。
redis数据存储在内存,速度比较快可以暴力破解密码,因此建议可以不使用密码。通过服务器安全防护
- 修改配置文件中密码
- 重启Redis服务
- 进入Redis客户端
- 密码校验
PHP操作Redis
开启Redis扩展
查看phpinfo中Thread Safety:enabled -> TS版本 线程是否安全选择ts或者nts版本
如果为5.3以上的版本有2个dll文件,并且顺序要是redis.dll的引入在下PHP操作Redis数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 实例化对象
$redis = new Redis();
$redis->connect('192.168.153.132',6379);
// 密码验证
$redis->auth('123456');
// 赋值操作
$res = $redis->set('user','uiste');
var_dump($res);
// 取值操作
$content = $redis->get('user');
var_dump($content);