21.9 redis介绍mysql
21.10 redis安装linux
21.11 redis持久化nginx
21.12 redis数据类型redis
21.9 redis介绍sql
1.Redis和Memcached相似,也属于k-v数据存储数据库
功能也比memcachd要多。也支持在磁盘中存储,就保证了数据有必定的安全性vim
2.Redis官网redis.io, 当前最新稳定版4.0.1安全
3.支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)app
4.redis使用了两种文件格式(也叫持久化):全量数据(RDB)和增量请求(aof)。(就是咱们把数据存在磁盘里,以上两种格式)memcached
全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。
就是K是什么,V是什么
增量请求文件则是把内存中的数据序列化为操做请求,用于读取文件进行replay获得数据,这种相似于mysql binlog。
这是格式随着使用的愈来愈长,容量也原来越大。能够按期的作一些优化,由于随着时间的过时,以前存储的也就成垃圾文件了,他不会主动的清理
5.redis的存储分为内存存储、磁盘存储和log文件三部分
内存存储相似于memcached,好比存一个K一个V,他就是存在内存里的。
磁盘存储就是RDB
log文件就是AOF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.10 redis安装
1.下载最新稳定版
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
2.cd redis-4.0.1
3.make && make install
比较特殊,不须要./config那一步
4.cp redis.conf /etc/redis.conf
5.vim /etc/redis.conf //修改以下配置
daemonize yes #启动的时候让他在后台运行
logfile "/var/log/redis.log" #定义日志
dir /data/redis_data/ #定义dir
appendonly yes #打开appenonly
6.mkdir /data/redis_data
7.sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
#这两条加在 /etc/rc.local 里,让他一启动就会执行这两条
8.redis-server /etc/redis.conf #启动
实例:
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
ls
tar zxf redis-4.0.1.tar.gz
ls
cd redis-4.0.1/
make
echo $?
make install
echo $?
[root@axinlinux-01 redis-4.0.1]# redis- #两下tab会出来他的命令,出现一下就证实成功了
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
[root@axinlinux-01 redis-4.0.1]# which "redis-cli" #redis不像nginx等,能够指定安装路径,他被安装到了这个路径下
/usr/local/bin/redis-cli
[root@axinlinux-01 redis-4.0.1]# cp redis.conf /etc/ #拷贝配置文件
# bind 192.168.1.100 10.0.0.1 #这是告诉你设置他的监听IP,能够写多个,用空格分割
# bind 127.0.0.1 ::1
protected-mode yes #这里是保护的模式,已经打开
port 6379 #这是监听的端口
daemonize no(改成yes) #这里的daemonize要改成yes!!启动的时候不让他在前台启动,启动的时候咱们能够去作其余的事情,终端不会被占用
pidfile /var/run/redis_6379.pid #这里是pid文件,启动完了以后确定要有这个pid的文件。默认就好
logfile ""(指定为"/var/log/redis.log") #日志的文件,要给他定义一下!!
databases 16 #Redis存在库的概念,默认有16个库,从0开始
save 900 1 #这里是用来设置RDB的持久化的。下面会有介绍
save 300 10
save 60 10000
rdbcompression yes #是否要压缩RDB的文件
dbfilename dump.rdb #他的文件的名字,RDB叫什么
dir ./(改成/data/redis) #这里的dir是RDB的文件把它放到哪里去。包括AOF文件也会放到这里!!
slave-read-only yes #这里的slave是配置主从的时候用到的参数
appendonly no #这里是用来开启AOF日志的。要改成yes!!改成yes就会在上面定义dir目录里成成一个appendonly.aof的文件
appendfilename "appendonly.aof" #在这定义aof文件的名字。默认就好
# appendfsync always
appendfsync everysec #这个是他何时去记录日志。everysec就表明每一秒记录一下。也能够为上面的always,就是每一次有新的变动或增长了一个数据,那么若是是always都会去记录一条日志,无论时间
timeout指的是设置客户端链接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该链接
[root@axinlinux-01 redis-4.0.1]# mkdir /data/redis #建立dir目录
[root@axinlinux-01 redis-4.0.1]# vim /etc/rc.local #如下两条加在这个文件里,一启动就会执行这两条
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.11 redis持久化
1.Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
若是把这两种持久化所有关闭,redis就像memcached同样,只存储在内存里。可是一旦重启数据将会消失,因此必定要作一个持久化
2.RDB,简而言之,就是在不一样的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。
RDB也就是把内存里的数据镜像一份到磁盘上,至于何时存到磁盘上,是:
vim /etc/redis.conf,这面这三个参数肯定的,三个知足任何一个就会存到磁盘上
# save "" #若是关闭持久化,把这行打开。下面三行注释掉
save 900 1 #900秒发生了一次更改
save 300 10 #300秒发生了10次更改
save 60 10000 #60秒发生了10000次更改
以上,更改的意思是好比我增长一个K或更改了一个K或删除了一个K。保持默认便可
3.AOF,则是换了一个角度来实现持久化,那就是将redis执行过的全部写指令记录下来,在下次redis从新启动时,只要把这些写指令从前到后再重复执行一遍,就能够实现数据恢复了。
vim /etc/redis.conf 。根据下面三个参数控制写入磁盘的时间
# appendfsync always #每次写都记录
appendfsync everysec #一秒写入磁盘一次,更高效。建议选择这个
# appendfsync no #根据系统的频率写入
AOF随之时间愈来愈长,将会愈来愈大。能够按期将过时的K删除
4.其实RDB和AOF两种方式也能够同时使用,在这种状况下,若是redis重启的话,则会优先采用AOF方式来进行数据恢复,这是由于AOF方式的数据恢复完整度更高。
5.若是你没有数据持久化的需求,也彻底能够关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache同样。
Redis持久化相关参数
1.save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化
2.save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化
3.save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久
4.save “” #这样能够禁用rdb持久化
5.appendonly yes #若是是yes,则开启aof持久化
6.appendfilename “appendonly.aof” # 指定aof文件名字
7.appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync)。第一种最快,第二种数据最安全,但性能会差一些,第三种为这种方案,默认为第三种。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.12 redis数据类型
redis数据类型一共有五种
1.第一种类型string
string为最简单的类型,与Memcached同样的类型,一个key对应一个value,其支持的操做与Memcached的操做相似,它的功能更丰富。设置能够存二进制的对象。
示例:
# redis-cli
127.0.0.1:6379> set mykey "aminglinux.com"OK
127.0.0.1:6379> get mykey"aminglinux.com"
127.0.0.1:6379> mset key1 1 key2 a key3 c
127.0.0.1:6379> mget key1 key2 key3
1) "1"
2) "a"
3) "c"
2.第二种类型list
list是一个链表结构,主要功能是push、pop、获取一个范围的全部值等等。操做中key理解为链表的名字。
使用 list 结构,咱们能够轻松地实现最新消息排行等功能(好比新浪微博的 TimeLine )。list 的另外一个应用就是消息队列,能够利用 list 的 push操做,将任务存在 list 中,而后工做线程再用pop操做将任务取出进行执行。
示例:
# redis-cli
127.0.0.1:6379> LPUSH list1 "aminglinux"127.0.0.1:6379> LPUSH list1 "1 2 3"127.0.0.1:6379> LPUSH list1 "aaa bbb“
127.0.0.1:6379> LRANGE list1 0 -1
1) "aaa bbb"
2) "1 2 3"
3) "aminglinux“
127.0.0.1:6379> LPOP list1
3.第三种类型set
set是集合,和咱们数学中的集合概念类似,对集合的操做有添加删除元素,有对多个集合求交并差等操做。操做中key理解为集合的名字。好比在微博应用中,能够将一个用户全部的关注人存在一个集合中,将其全部粉丝存在一个集合。由于 Redis 很是人性化的为集合提供了求交集、并集、差集等操做,那么就能够很是方便的实现如共同关注、共同喜爱、二度好友等功能,对上面的全部集合操做,你还可使用不一样的命令选择将结果返回给客户端仍是存集到一个新的集合中。
能够求出交集,把共同的集合存储到另外一个新的集合当中
set示例
127.0.0.1:6379> SADD set1 a
127.0.0.1:6379> SADD set1 b
127.0.0.1:6379> SADD set1 c
127.0.0.1:6379> SADD set1 d
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> SREM set1 c//删除元素
127.0.0.1:6379> SADD set2 a 2 b
127.0.0.1:6379> SINTER set1 set2 //交集
127.0.0.1:6379> SUNION set1 set2 //并集
127.0.0.1:6379> SDIFF set1 set2 //差集
4.第四种类型sort set
sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素可以按 score 进行有序排列,好比一个存储全班同窗成绩的 Sorted Sets,其集合 value 能够是同窗的学号,而 score 就能够是其考试得分,这样在数据插入集合的时候,就已经进行了自然的排序。
127.0.0.1:6379> ZADD set3 12 abc127.0.0.1:6379> ZADD set3 2 "cde 123"127.0.0.1:6379> ZADD set3 24 "123-aaa"127.0.0.1:6379> ZADD set3 4 "a123a"127.0.0.1:6379> ZRANGE set3 0 -1
1) "cde 123"
2) "a123a"
3) "abc"
4) "123-aaa"
倒序
127.0.0.1:6379> ZREVRANGE set3 0 -1
1) "123-aaa"
2) "abc"
3) "a123a"
4) "cde 123"
5.第五种类型hash
1.在 Memcached 中,咱们常常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(通常是 JSON 格式),好比用户的昵称、年龄、性别、积分等。
可理解为多个string的集合
2.示例
127.0.0.1:6379> hset hash1 name aming127.0.0.1:6379> hget hash1 name"aming"127.0.0.1:6379> hset hash1 age 30127.0.0.1:6379> hget hash1 age "30"
127.0.0.1:6379> hgetall hash11) "name"2) "aming"3) "age"4) "30"
实例:
1.
[root@axinlinux-01 ~]# redis-server /etc/redis.conf
[root@axinlinux-01 ~]# redis-cli
127.0.0.1:6379> set mykey "123" #写一个string类型的数据。tab键能够补全
OK
127.0.0.1:6379> get mykey
"123"
127.0.0.1:6379> mset key1 1 key2 2 key3 c #使用mset能够同时写多个数据
OK
127.0.0.1:6379> mget key1 mykey #mget能够同时看多个KEY
1) "1"
2) "123"
2.
127.0.0.1:6379> LPUSH list1 "aminglinux" #lpush推动去数据,格式是这样写的
(integer) 1
127.0.0.1:6379> LPUSH list1 "axinlinux" #能够推多个
(integer) 2
127.0.0.1:6379> LPUSH list1 "123"
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1 #lrange能够查看这个list1。0表示开头,-1表示结尾,也就是表明查看的时候是从开始到结尾的数据
1) "123"
2) "axinlinux"
3) "aminglinux" #最早推动去的是排在最后一个的
127.0.0.1:6379> lpop list1 #lpop把list1的数据取出来,取出来的是123,也就是最后lpush的那个数据
"123"
127.0.0.1:6379> LRANGE list1 0 -1 #再次查看就会发现,取出的那个数据就没有了
1) "axinlinux"
2) "aminglinux"
3.
127.0.0.1:6379> sadd set1 a #sadd写入一个集
(integer) 1
127.0.0.1:6379> SADD set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> SADD set1 d
(integer) 1
127.0.0.1:6379> SMEMBERS set1 #查看这个集
1) "b"
2) "a"
3) "d"
4) "c"
127.0.0.1:6379> sadd set2 a #在写入第二个集
(integer) 1
127.0.0.1:6379> sadd set2 b
(integer) 1
127.0.0.1:6379> sadd set2 1
(integer) 1
127.0.0.1:6379> sadd set2 2
(integer) 1
127.0.0.1:6379> SINTER set1 set2 #求交集
1) "b"
2) "a"
127.0.0.1:6379> SUNION set1 set2 #求并集
1) "c"
2) "a"
3) "1"
4) "b"
5) "d"
6) "2"
127.0.0.1:6379> SDIFF set1 set2 #求差集
1) "d"
2) "c"
4.
127.0.0.1:6379> ZADD set3 12 abc #有序集合中,zadd为写入数据
(integer) 1
127.0.0.1:6379> ZADD set3 24 "123 abc" #能够写多个,用双引号引发来
(integer) 1
127.0.0.1:6379> ZADD set3 2 "123-abc"
(integer) 1
127.0.0.1:6379> ZADD set3 66 "1234 abc"
(integer) 1
127.0.0.1:6379> ZRANGE set3 0 -1 #zrange为升序排列
1) "123-abc" #会发现以score值得大小,升序排列。小的在上面依次排列
2) "abc"
3) "123 abc"
4) "1234 abc"
127.0.0.1:6379> ZREVRANGE set3 0 -1 #zrevrange为倒序排列
1) "1234 abc" #以score值得大小,倒序排列。大的在上面
2) "123 abc"
3) "abc"
4) "123-abc"
5.
127.0.0.1:6379> HSET hash1 name axin #hset为写入一个数据
(integer) 1
127.0.0.1:6379> HSET hash1 age 28
(integer) 1
127.0.0.1:6379> HSET hash1 job it
(integer) 1
127.0.0.1:6379> hget hash1 name #hget为查看
"axin"
127.0.0.1:6379> HGET hash1 age
"28"
127.0.0.1:6379> HGET hash1 job
"it"
127.0.0.1:6379> HGETALL hash1 #hgetall为查看所有
1) "name" #奇数为KEY
2) "axin" #偶数为VALUE
3) "age"
4) "28"
5) "job"
6) "it"