Redis基础:基本介绍、redis的应用场景、五种数据类型、持久化操做、主从模式

1、Redis基本概念介绍和特性

1.1 Redis基本概念介绍

    clipboard.png

1.Redis是远程的,有客户端和服务端,咱们通常说的是服务端;

2.Redis是基于内存的,因此比基于硬盘的MySQL要快不少,但很是吃内存php

3.Redis是非关系型数据库。本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不须要。html

1.2 Redis 和 Memcached比较

    clipboard.png

    Redis数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。mysql

    与Memcached同样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。redis

1.3 Redis支持主从同步。

    数据能够从主服务器向任意数量的从服务器上同步,从服务器能够是关联其余从服务器的主服务器。这使得Redis可执行单层树复制。存盘能够有意无心的对数据进行写操做。因为彻底实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操做的可扩展性和数据冗余颇有帮助。sql

2、Redis的应用场景

2.1 缓存

    clipboard.png

Redis经常做为 数据缓存

    当某些系统接口比较慢的时候,咱们能够把一些数据放在Redis中缓存起来,下次取数据就不进行很是耗时的SQL操做了,直接从缓存中取数据,提高系统性能最经常使用的方法之一;数据库

2.2 队列

    push和pop操做保证了原子性的实现;windows

2.3 数据存储

    全部的增删改查都是在Redis中进行,Redis有硬盘的持久化机制,按期进行存储,保证了数据的完整性和安全性。数组

    查看redis客户端: which redis-cli
    登陆:redis-cli(默认登陆本机6379端口)
    info命令查看redis信息缓存

3、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

    clipboard.png

3.1 String字符串类型的操做

    clipboard.png

功能:提供字符串或者整型操做。
set key value(string/int/float)
get key
incr string  [value]//自增
decrby string [value] //自减
string是redis最基本的类型

    redisstring能够包含任何数据。包括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的字符串值

3.2 List链表类型

    clipboard.png

功能:存储序列集合,可用于队列, pushpop操做
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既能够用做栈,也能够用做队列。

上进上出 :栈
上进下出 :队列

    clipboard.png

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 key2key1后/前插入key2
4.rpoplpush key1 key2key1右边key左入key2链表,原子性
的操做使用

    clipboard.png

功能:无序集合, 每一个元素都不同
添加元素: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"
}

3.3 Set类型

  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

    clipboard.png

3.4 hash类型

    clipboard.png

功能:存储的是 key-value结构, key必须是string

    常常用于存储比较复杂的结构,Hash只要求键不同,好比姓名,年龄等等

插入/修改:hset hash1 key1 12
获取:hget hash1 key1
查看hash长度:hlen key
一次性获取:hmget hash1 key1 key2

    clipboard.png

    clipboard.png

3.5 Sort Set排序集合类型

    clipboard.png

功能:存储是带分数的有序集合, 常常用于排行榜

    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帖子信息

    clipboard.png

    排序集合中的每一个元素都是值、权的组合 (以前的set集合类型每一个元素就只是一个 值)

    clipboard.png

咱们只作一个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]>

4、持久化操做

    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日志文件存储

4.1 snap shotting快照持久化

该持久化默认开启,一次性把 redis中所有的数据保存一份存储在硬盘中,若是数据很是多( 10-20G)就不适合频繁进行该持久化操做。

    1.快照持久化在本地硬盘保留的数据备份文件

    clipboard.png

    2.快照持久化的备份频率:

    在redis.conf配置文件中

    clipboard.png

save 900 1 #900 秒内若是超过 1 个 key 被修改,则发起快照保存 
save 300 10 #300秒超过10个key被修改,发起快照 
save 60 10000 #60秒超过10000个key被修改,发起快照

    以上三个save的意思:
    数据修改的频率很是高,备份的频率也高
    数据修改的频率低,备份的频率也低

    3.快照持久化文件的命名和存储位置:

    在redis.conf配置文件中

    clipboard.png

    4.手动发起快照持久化

./redis-cli -h 192.168.10.138 -p 6379 bgsave
//给定ip地址发起快照持久化
./redis-cli bgsave   //本机发起快照持久化

4.2 append only file (AOF持久化)

    本质:把用户执行的每一个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已。

    1.开启AOF持久化(会清空redis内部的数据):
    (同时能够修改备份文件的名字,默认是appendonly.aof)
    在redis.conf配置文件中

    clipboard.png

    2.配置文件被修改,须要删除旧进程,再根据新的配置文件启动新进程:

    clipboard.png

    3.新进程启动好后会看到对应的aof持久化备份文件appendonly.aof:

    clipboard.png

    4.aof追加持久化的备份频率:
    在redis.conf配置文件中

    clipboard.png

    5.为aof备份文件作优化处理
    对appendonly.aof文件内容作优化压缩处理。(例如:多个inr指令变为一个set指令)

    clipboard.png

    6.持久化相关指令

    clipboard.png

5、Redis的主从模式

5.1 使用背景

    为了下降每一个redis服务器的负载,能够多设置几个服务器,并作主从模式 一个服务器负载“写”(添加、修改、删除)数据,其余服务器负载“读”数据。主服务器数据会“自动”同步给从服务器。

    clipboard.png

5.2 设置主从模式

    1.在从Redis服务器中,找到配置文件redis.conf

    clipboard.png

    默认是关闭主从模式的,修改后

    clipboard.png

    2.关闭从Redis服务器,从新加载配置文件

./redis-cli shutdown
./redis-server redis.conf

    3.从服务器默认禁止写入操做(能够修改以下图参数使得其能够写入数据):

    clipboard.png

Redis主从复制哨兵模式

windows下安装redis 以及phpredis的扩展 (windows redis php&php7)

6、建立链接redis的客户端

    链接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

参考资料以下:
1. 传智播客redis基础视频教程
2. Redis-传智播客-学习笔记

相关文章
相关标签/搜索