Remote Dictionary Server(远程数据的服务),是一种NoSQL技术,是一个基于key-value的高速缓存系统,是目前应用面最广的缓存系统之一。php
Redis:Remote Dictionary Server(远程数据的服务),是一种NoSQL技术,是一个基于key-value的高速缓存系统,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。相似于Memcache,可是支持更复杂的数据结构List,Set,SortedSet等,而且有持久化[1]的功能。redis
Redis有如下特色:数据库
通常场景就是数据缓存服务器,与Memcache的角色保持一致;实质上Redis缓存数据库服务器在提供的缓存的基础上,同时提供数据持久化(复制),也就是提供数据库层面的功能。vim
实现机制:操做时,操做的内存容许设置同步到磁盘上。缓存
1.存储方式:安全
2.数据支持类型:服务器
3.使用底层模型不一样网络
4.运行的环境不一样数据结构
5.对于二者的选择具体看应用场景架构
1.Redis默认不是以守护进程的方式运行,能够经过该配置项修改,使用yes启用守护进程:daemonize no。
2.当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,能够经过pidfile制定存储位置:pidfile /var/run/redis.pid。
3.指定Redis监听端口,默认端口为6379.
4.绑定的主机地址:bind 127.0.0.1
5.当客户端闲置多长时间后关闭链接,若是制定为0,表示关闭该功能。timeout 300。
6.指定日志记录级别,Redis总共支持你四个级别debug、verbose、notice、warning、默认是verbose:loglevel verbose。
7.设置数据库的数量,默认数据库为0,可使用SELECT <dbid>命令在链接上指定数据库id:databases 16。
8.指定在多长时间内,有多少次更新数据,就将数据同步到数据文件,能够多个条件配合:
save <seconds><changes> //Redis 默认配置文件提供了三个条件 save 900 1 save 300 10 save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更高,60秒内有10000个更改。
9.指定本地数据文件名,默认值为dump.rdb:dbfilename dump.rdb
10.指定本地数据库存放目录:dir ./
11.设置Redis链接密码,若是配置了链接密码,客户端在链接Redis时须要经过AUTH <password>命令提供密码,默认关闭:requirepass 输入密码
12.登陆服务器的状态:info
备份原理和过程:缓存数据库服务器 =>缓存数据存储在内存 =>数据库存储在磁盘上 =>执行指令,都是在自动在内存中增长数据,数据备份到指定文件位置 => Redis SAVE 命令用于建立当前数据库的备份。
save:当即存储快照(内存数据保存到磁盘中)
bgsave:后台当即存储快照(内存数据保存到磁盘中)
Redis的事务处理比较简单。只能保证client发起的事务中的命令能够连续的执行,并且不会插入其余的client命令,当一个client在链接中发出multi命令时,这个链接就进入一个事务的上下文,该链接后续的命令不会执行,而是存放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的全部命令。若是其中执行出现错误,执行正确的不会回滚,不一样于关系型数据库的事务。
1.MULTI标记一个事务块的开始(开启)。
2.EXEC执行因此事务块内的命令。
127.0.0.1:6379> multi Ok 127.0.0.1:6379> set user ak QUEUED 127.0.0.1:6379> set school Tsinghua QUEUED 127.0.0.1:6379> set Class Pking QUEUED 127.0.0.1:6379> exec OK OK OK
3.DISCARD取消事务,放弃执行事务块内的因此命令。
127.0.0.1:6379> multi Ok 127.0.0.1:6379> set user ak QUEUED 127.0.0.1:6379> set school Tsinghua QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> get user (nil)
4.WATCH key [key ...]监视一个(或多个)key,若是在事务执行以前这个(或这些)key被其余命令所改动,那么事务将被打断。
127.0.0.1:6379> watch user Ok 127.0.0.1:6379> watch school ok
5.UNWATCH取消WATCH命令对全部key的监视。
1.设置在客户端链接是须要指定的密码(因为redis速度至关的快,一秒钟能够150K次的密码尝试,因此须要设置一个密码强度很大的密码)。
设置密码的方式有两种:
(1) 使用config set 命令的requirepass 参数,具体格式为config set requirepass “password”。 (2) 配置redis.conf 中设置requirepass属性,后面为密码。
输入认证的方式也有两种:
(1) 登陆时能够 redis-cli -a password
(2)登陆后使用 auth password
//1.设置密码:首先须要进入Redis的安装目录,而后修改配置文件redis.conf。根据grep命令的结果,使用vi编辑器修改“# requirepass foobared” 为“requirepass aklman”,而后保存退出。 $ grep -n requirepass /etc/redis.conf $ sudo vim /etc/redis.conf //2.重启redis-server与redis-cli: $ sudo service redis-server restart $ redis-cli > info //没有权限提示 > auth aklman > info //成功查询数据 > exit //结果代表第一次info命令失败,在auth认证以后info命令正常返回。最后退出redis-cli。 //或者这样登陆: $ redis-cli -a aklman > info
2.ECHO message:打印字符串
3.PING:查看服务是否运行
4.QUIT:关闭当前链接
5.SELECT index:切换到指定的数据库
Redis是一个支持持久化的内存数据库,Redis须要常常将内存中的数据同步到磁盘来保证持久化。
Redis支持两种持久化方式:
一、snapshottingRDB(快照),将数据存放到文件里,默认方式。也就是把内存中的内容,压缩以后,直接存储到硬盘中,这种方式在启动的时候,加载速度很是的快!
是将内存中的数据已快照的方式写入到二进制文件中,默认文件dump.rdb,能够经过配置设置自动作快照持久化的方式。可配置Redis在n秒内若是超过m个key被修改就自动保存快照。
save 900 1 #900秒有1个keys改变,就会执行持久化 save 300 10 #300秒有10个keys改变,就会执行持久化,改为save 100 6更方便 save 60 10000 #60秒有1w个keys改变,就会执行持久化
优点:
劣势:
总结:
二、 Append-only file(缩写为aof),将读写操做存放到文件中。
因为快照方式在必定间隔时间作一次,因此若是Redis意外down掉的话,就会丢失最后一次快照后的全部修改。
aof比快照方式有更好的持久化性,是因为使用aof时,redis会将每个收到的写命令都经过write函数写入到文件中当redis启动时会经过从新执行文件中保存的写命令来在内存中从新创建整个数据库的内容。
因为os会在内核中缓存write作的修改,因此可能不是当即写到磁盘上,这样aof方式的持久化也仍是有可能会丢失一部分数据。能够经过配置文件告诉redis咱们想要经过fsync函数强制os写入到磁盘的时机。
配置文件中的可配置参数:
appendonly yes //启用aof持久化方式 #appendfsync always //收到写命令就当即写入磁盘,最慢,可是保证了数据的完整持久化 appendfsync everysec //每秒中写入磁盘一次,在性能和持久化方面作了很好的折中 #appendfsync no //彻底依赖os,性能最好,持久化没有保证
参数说明:
优点:
劣势:
总结:对比两个持久化
Redis经过主从模式能够容许多个slave(副) server拥有和master(主) server相同的数据库副本。从服务器只能读,不能写。
1.Redis Replication的工做原理:
原理解读:
在Slave启动并链接到Master以后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集全部接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次彻底同步。而Slave服务器在接收到数据库文件数据以后将其存盘并加载到内存中。此后,Master继续将全部已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
若是Master和Slave之间的连接出现断连现象,Slave能够自动重连Master,可是在链接成功以后,一次彻底同步将被自动执行。
总结:
2.Redis Replication的特色:
3.如何配置
总结:在Redis的主从配置中,从服务器是一个只读的设备。不能写操做。
设置一个值:set key value
set name aklman
获取一个值:get key
get name
同时设置多个值:mset key1 value key2 value
同时获取多个值:mget key1 key2
删除值:del key
自增1(值必须是数字):incr key
自增指定的值:incrby key
incrby能够操做的最大范围:有符号的2^64;而修改Memcache的最大范围描述是无符号的2^64超过Redis在整形最大范围的时候,继续自增会报错;而Memcache在最大值时继续增长会到0再继续加。自减也同理,只是把增长数值设定负数便可。Memcache在最小值时继续向下减依然是最小值。
Redis设置的数和增长的数值可使用负数,Memcache不能使用负数。增减与上同理。
形式:key => array(field1=>value1,field2=>value2,field3=>value2);value1能够重复,field不能重复。
设置值:hset key field value
hset user name aklman
获取值:hget key field
hget user name
设定多个值:hmset key field1 value1 field2 value2
hmset student name aklman age 18 sex 1
获取多个值(字段值的顺序能够换):hmget key field1 field2 field3
hash表中设定的字段值是惟一的,若是以前有,就会覆盖!!
获取hash标的field和value(获取因此字段及相应值):hgetall key
获取hash表里面的field:hkeys key
获取hash表里面的value的个数:hlen key
删除hash表里面的field值:hdel key field1 field2
注意:hash表中的操做,必须使用hash的方法来操做,字符串的操做就用字符串的方式,不能混着用。
列表:双向列表,队列,堆栈;里面的值是能够重复的。
1.双向列表:
给一个列表从左(右)边添加内容:lpush(rpush) Listname value1 value2 value3
查看list的内容:lrange Listname 起始位置(0或者其余) 结束位置(-1表示最后面)
从左(右)边弹出一个值:lpop(rpop) Listname
查看列表的长度:llen Listname
2.队列:
给一个列表从左边添加内容:lpushListname value1 value2 value3
从左边弹出一个值:lpop Listname
给一个列表从右边添加内容:rpush Listname value1 value2 value3
从右边弹出一个值:rpop Listname
3.堆栈
给一个列表从左边添加内容:lpushListname value1 value2 value3
从左边弹出一个值:lpop Listname
给一个列表从右边添加内容:rpush Listname value1 value2 value3
从右边弹出一个值:rpop Listname
添加数据:sadd set value1 value2 value3
添加完数据后再想添加数据,能够再sadd setvalue4 value5 value3,发现直插入成功两个,由于集合不容许values的值重复出现。
查看数据:smembers set
随机弹出:spop set
为何集合里面的数据能随机弹出?缘由是集合中的数据是无序的,也就是无序集合有这个特性。随机弹出多个值:spop set n (n不能超过集合元素数)
查看长度:scard set
交集:sinter setA setB
交集就是它们的共同部分,与数学中学的一个样
并集:sunion setA setB
重复的内容只显示一次。
差集:sdiff setA setB
redis里面的差集,是只显示,第一个集合的内容
添加数据:zadd SortedSetKey number1 value1 number2 value2
查看长度:zcard SortedSetKey
查看有序集合里面的值:zrange SortedSetKey 起始位置 结束位置(-1表示最后的位置)
显示有序集合排序的编号:zrange SortedSetKey 起始位置 结束位置(-1表示最后的位置) withscores
修改排序号:zincrby SortedSetKey n value1
显示倒序:zrevrange SortedSetKey 起始位置 结束位置(-1表示最后的位置)
显示带编号的倒序:zrevrange SortedSetKey 起始位置 结束位置(-1表示最后的位置) withscores
注意:
1.查看Redis里面有多少个key:keys *
2.几条经常使用命令:
//在命令行直接运行命令 redis-cli keys '*' //在命令行删除内容,指定删除的key redis-cli del 'test' //结合两个命令实现搜索而且删除key,这样写会报错,由于keys在执行完成以后,一次性把文档里面拿给了del,此时,del就认为你文档里面的值,是一个值,要删除就会报错。 redis-cli keys '*' | redis-cli del //解决方式以下,xargs的含义是:当左边命令结果经过管道的时候,只要有xargs参数,它就是告诉左边的命令,你执行一条结果,就给我一条结果。左边在执行的时候,执行一个结果,就当即传给咱们右边去执行 redis-cli keys '*t' |xargs redis-cli del
思考问题:
1.当咱们左边的查询内容是10G的时候,它要传给右边,须要的内存多少?
占用内存20G,由于使用了xargs参数,就是执行完一个结构就传给右边,一个结构能够占10K,传给右边也是10K,加起来就是20K。
2.在结合find的使用
find /toot/ -name '*php' | xargs ls -l
3.判断key是否存在:exists key
4.设置过时时间:expire key 20
5.查看过时时间:ttl key
6.查看key的类型:type key
7.选择库:select 2
8.是在redis的客户端去ping咱们redis的服务端:ping hello
9.清空当前库:flushdb
10.清空索引的库:flushall
11.Redis的key命名规范
1.EXISTS and DEL
2.TYPE and KEYS
3.RANDOMKEY and CLEAR
4.RENAME and RENAMENX
5.DBSIZE
6.CONFIG GET and CONFIG SET
7.CONFIG RESETSTAT
PHP操做Redis:使用咱们的php客户端(redis扩展)链接到redis服务器
<?php $redis=new redis(); $redis->connect('127.0.0.1',6379); $redis->auth('aklman'); $redis->set('DomainServer','Aklman.com');
就能够在Redis从服务器中看到这条信息了。
INFO [section] :查询Redis相关信息。 INFO命令能够查询Redis几乎全部的信息,其命令选项有以下:
[1] 持久化是指存储到磁盘,服务器重启后还能够存在。而存储到内存中的数据,一重启服务器就不存在。