1.Redis是远程的,有客户端和服务端,咱们通常说的是服务端;2.Redis是
基于内存
的,因此比基于硬盘的MySQL要快不少,但很是吃内存php3.Redis是非关系型数据库。本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不须要。html
Redis
数据类型都支持push/pop、add/remove
及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。mysql
与Memcached
同样,为了保证效率,数据都是缓存在内存中。区别的是Redis
会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave
(主从)同步。redis
数据能够从主服务器向任意数量的从服务器上同步,从服务器能够是关联其余从服务器的主服务器。这使得Redis
可执行单层树复制。存盘能够有意无心的对数据进行写操做。因为彻底实现了发布/订阅
机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操做的可扩展性和数据冗余颇有帮助。sql
Redis
经常做为
数据缓存。
当某些系统接口比较慢的时候,咱们能够把一些数据放在Redis
中缓存起来,下次取数据就不进行很是耗时的SQL
操做了,直接从缓存中取数据,提高系统性能最经常使用的方法之一;数据库
push和pop操做保证了原子性的实现;windows
全部的增删改查都是在Redis
中进行,Redis
有硬盘的持久化机制,按期进行存储,保证了数据的完整性和安全性。数组
查看redis
客户端: which redis-cli
登陆:redis-cli
(默认登陆本机6379
端口)
info
命令查看redis
信息缓存
在redis
里边,除了\n
和空格 不能做为名字的组成内容外,其余内容均可以做为key
的名字部分。名字长度不作要求。安全
*exists key #测试指定key是否存在 del key1 key2 key3 #删除给定的key *type key #返回给定的value的类型 keys pattern #返回匹配指定模式的全部key rename oldkey newkey#更名字 *dbsize #返回当前数据库的key数量 expire key seconds #为key指定过时时间 *ttl key #返回key的剩余过时秒数 *select db-index #选择数据库,一共16个 move key db-index #将key从当前数据库移动到指定数据库 *flushdb #删除当前数据库中全部key flushall #删除全部数据库中的全部key
功能:提供字符串或者整型操做。
set key value(string/int/float) get key incr string [value]//自增 decrby string [value] //自减
string是redis最基本的类型
redis
的string
能够包含任何数据。包括jpg
图片(二进制)或者序列化的对象。
单个value
值最大上限是1G
字节。
若是只用string
类型,redis
就能够被看做加上持久化特性的memcache
。
set key value #设置key对应的值为string类型的value *mset key1 value1 key2 value2 #一次设置多个key的值 *mget key1 key2 #一次获取多个key的值 *incr key #对key的值作加加操做,并返回新的值 decr key #对key的值作渐减操做,并返回新的值 incrby key integer #同incr,加指定的值 decrby key integer #同decr,减指定的值 *append key value #给指定key的字符串值追加value *substr key start end #返回截取过的key的字符串值
功能:存储序列集合,可用于队列,push
和pop
操做
lpush 左进 rpop 右出 llen key 查看list有几个元素
List
类型是先进先出,适合队列;List不要求里面的元素是惟一的
(一)介绍
得到最新的10个登陆用户信息: select * from user order by logintime desc limit 10
;
以上sql语句能够实现用户需求,可是数据多的时候,所有数据都要受到影响,对数据库的负载比较高。必要状况还须要给关键字段(id或logintime)设置索引,索引也比较耗费系统资源。
若是经过list链表实现以上功能,能够在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。每次就能够从链表中直接得到须要的数据。极大节省各方面资源消耗
(二)应用
list
类型其实就是一个双向链表。经过push
,pop
操做从链表的头部或者尾部添加删除元素。
这使得list
既能够用做栈,也能够用做队列。
上进上出 :栈
上进下出 :队列
lpush key string #在key对应list的头部添加字符串元素 rpop key #在list的尾部删除元素,并返回删除元素 llen key 返回key #对应list的长度,key不存在返回0,若是key对应类型不是list返回错误 lrange key start end #返回指定区间内的元素,下标从0开始 rpush key string #同上,在尾部添加 lpop key #从list的头部删除元素,并返回删除元素 ltrim key start end #截取list,保留指定区间内元素
1.lrange key 0 -1
取出全部元素。
2.lrem key n/-n X
删除指定元素n
次。
3.linsert key after/before key1 key2
在key1
后/前插入key2
。
4.rpoplpush key1 key2
将key1
右边key
左入key2
链表,原子性。
的操做使用
功能:无序集合,
每一个元素都不同
。
添加元素:sadd key value 判断有多少个元素:scard key 判断某个元素是否在set里面:sismember key value 删除某个元素:srem key value 获取所有值,并以数组方式返回:$redis->sMembers('dst')); int(2) array(2) { [0]=> string(1) "4" [1]=> string(1) "2" }
set
类型,无序的方式存储多个不一样的元素,对元素能够进行快速的添加、查找和删除;相同的元素只算一个。
redis的set是string类型的无序集合。
set元素最大能够包含(2的32次方-1)个元素。
关于set集合类型除了基本的添加删除操做,
其余有用的操做还包含集合的取并集(union
),交集(intersection
), 差集(difference
)。经过这些操做能够很容易的实现sns中的好友推荐功能
。
注意:每一个集合中的各个元素不能重复。
sadd key member #添加一个string元素到key对应的set集合中,成功返回1,若是元素已经在集合中,返回0,key对应的set不存在返回错误 srem key member [memeber] #从key对应set中移除给定元素,成功返回1 smove p1 p2 member #从p1 对应set中移除member并添加到p2对应set中 scard key #返回set的元素个数 sismember key member #判断member是否在set中 sinter key1 key2...keyn #返回全部给定key的交集 sunion key1 key2...keyn #返回全部给定key的并集 sdiff key1 key2...keyn #返回全部给定key的差集 smembers key #返回key对应set的全部元素,结果是无序的
该类型应用场合:qq
好友推荐。
tom朋友圈(与某某是好友):mary jack xiaoming wang5 wang6 linken朋友圈(与某某是好友):yuehan daxiong luce wang5 wang6
功能:存储的是key-value
结构,key
必须是string
常常用于存储比较复杂的结构,Hash只要求键不同,好比姓名,年龄等等
插入/修改:hset hash1 key1 12 获取:hget hash1 key1 查看hash长度:hlen key 一次性获取:hmget hash1 key1 key2
功能:存储是带分数的有序集合, 常常用于排行榜。
sort set 常常被用做排名例如 班级成绩排名
存储和hash同样,都是一个映射。存储的是分数与元素的映射。能够看出是排行榜。
value必须是全局惟一。
score 是浮点型。
sort set类型操做,若是两个元素的score同样,按照字节顺序排列前后
增长/修改:zadd zset1 10.1 val1 查看个数:zcard zset1 查看排名:zrange zset1 0 2 withscores 查看某个value排名:zrank zset1 val2
和set
同样sorted set
也是string
类型元素的集合,不一样的是每一个元素都会关联一个权
。 经过权值能够有序的获取集合中的元素。
该Sort set
类型适合场合:
得到热门帖子(回复量)信息:select * from message order by backnum desc limit 5
;
(以上需求能够经过简单sql
语句实现,可是sql
语句比较耗费mysql
数据库资源)
案例:利用sort set实现获取最热门的前5帖子信息
排序集合中的每一个元素都是值、权的组合 (以前的set集合类型每一个元素就只是一个 值)
咱们只作一个sort set排序集合,里边只保留5个元素信息,该5个元素是回复量最高的
每一个帖子被回复的时候,都有机会进入该集合里边,可是只有回复量最高的前5个帖子会存在于在集合,回复量低的就被删除。
127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> zadd hotmessage 102 11 //添加 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 141 12 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 159 13 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 72 14 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 203 15 (integer) 1 127.0.0.1:6379[2]> keys * 1) "hotmessage" 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 //按照权由高到低的顺序得到具体元素值的信息 1) "15" 2) "13" 3) "12" 4) "11" 5) "14" 127.0.0.1:6379[2]> zadd hotmessage 189 16 (integer) 1 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 1) "15" 2) "16" 3) "13" 4) "12" 5) "11" 6) "14" 127.0.0.1:6379[2]> zremrangebyrank hotmessage 0 0 (integer) 1 //把权最低的那个删掉 0 0表示删除第一个权;0 1表示删除第一个,第二个权; 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 1) "15" 2) "16" 3) "13" 4) "12" 5) "11" 127.0.0.1:6379[2]> zrank hotmessage 12 //权由低到高得到元素排名 (integer) 1 127.0.0.1:6379[2]> zrank hotmessage 11 (integer) 0 127.0.0.1:6379[2]> zrevrank hotmessage 13 //权由高到低得到元素排名 (integer) 2 127.0.0.1:6379[2]> zcard hotmessage //得到集合中元素个数 (integer) 5 127.0.0.1:6379[2]> zscore hotmessage 16 //根据元素值得到对应的权 "189" 127.0.0.1:6379[2]> zincrby hotmessage 100 12 //给指定的元素值增长一些权信息 "241" 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 1) "12" 2) "15" 3) "16" 4) "13" 5) "11" 127.0.0.1:6379[2]>
Redis
为了内部数据的安全考虑,会把自己的数据以文件形式
保存到硬盘中一份,在服务器重启以后会自动把硬 盘的数据恢复到内存(redis
)的里边。 数据保存到硬盘的过程就称为持久化
效果
相关指令:
./redis-cli bgsave //异步保存数据到磁盘(快照保存) ./redis-cli 1h 127.0.0.1 -p 6379 bgsave ./redis-cli lastsave //返回上次成功保存到磁盘的unix时间戳 ./redis-cli shutdown //同步保存到服务器并关闭redis服务器 ./redis-cli bgrewriteaof //当日志文件过长时优化AOF日志文件存储
该持久化默认开启,一次性把redis
中所有的数据保存一份存储在硬盘中,若是数据很是多(10-20G
)就不适合频繁进行该持久化操做。
1.快照持久化在本地硬盘保留的数据备份文件
2.快照持久化的备份频率:
在redis.conf配置文件中
save 900 1 #900 秒内若是超过 1 个 key 被修改,则发起快照保存 save 300 10 #300秒超过10个key被修改,发起快照 save 60 10000 #60秒超过10000个key被修改,发起快照
以上三个save的意思:
数据修改的频率很是高,备份的频率也高
数据修改的频率低,备份的频率也低
3.快照持久化文件的命名和存储位置:
在redis.conf配置文件中
4.手动发起快照持久化
./redis-cli -h 192.168.10.138 -p 6379 bgsave //给定ip地址发起快照持久化 ./redis-cli bgsave //本机发起快照持久化
本质:把用户执行的每一个“写”指令(添加、修改、删除
)都备份到文件中,还原数据的时候就是执行具体写指令而已。
1.开启AOF持久化(会清空redis内部的数据
):
(同时能够修改备份文件的名字,默认是appendonly.aof)
在redis.conf配置文件中
2.配置文件被修改,须要删除旧进程,再根据新的配置文件启动新进程:
3.新进程启动好后会看到对应的aof持久化备份文件appendonly.aof:
4.aof追加持久化的备份频率:
在redis.conf配置文件中
5.为aof备份文件作优化处理
对appendonly.aof文件内容作优化压缩处理。(例如:多个inr
指令变为一个set
指令)
6.持久化相关指令
为了下降每一个redis服务器的负载,能够多设置几个服务器,并作主从模式 一个服务器负载“写”(添加、修改、删除)数据,其余服务器负载“读”数据。主服务器数据会“自动”同步给从服务器。
1.在从Redis服务器中,找到配置文件redis.conf
默认是关闭主从模式的,修改后
2.关闭从Redis
服务器,从新加载配置文件
./redis-cli shutdown ./redis-server redis.conf
3.从服务器默认禁止写入操做(能够修改以下图参数使得其能够写入数据):
windows下安装redis 以及phpredis的扩展 (windows redis php&php7)
链接redis
:
建立connect.php
文件
<?php $redis = new \Redis(); //实例化 $redis->connect('127.0.0.1',6379); //string操做 $redis->delete("string1"); $redis->set("string1","val1"); $val = $redis->get("string1"); var_dump($val); //val1 $redis->set("string1",4); $redis->incr("string1",2); $val = $redis->get("string1"); var_dump($val); //6 # 字符串(string) 存储key/value,至关于设一个变量。例如对一个key值执行INCR操做,统计实时点击量。set/get # 哈希(hash) 用于存储对象信息,一个key就是一个对象。field/value构成键值对。hset key field value # 列表(list) lpush/lrange/lpop # 集合(set) 用于交集并集,例如新浪微博的共同关注 sadd/smembers/sunion/sinter # 有序集合(zset) 用于排序,例如top N的获取 zadd/zrangebyscore
命令记忆总结:
字符串和哈希,是key/value相关,用set建立。 set/hset/hmset 集合和有序集合,是集合相关,用add建立。sadd/zadd 列表用push建立。lpush
完