Redis介绍
Redis官网:redis.io Redis和memcached类似,也属于k-v数据存储 支持更多的value数据类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合) redis使用两种文件格式:全量数据(RDB)和增量请求(aof)。全量数据格式是把内存中数据写入磁盘,便于下次读取文件时进行加载。增量请求则是把内存中的数据序列化为操作请求,用于读取文件时进行replay得到数据,这种类似于mysql binlog redis的存储分为内存存储、磁盘存储和log文件三部分
Redis安装
在官网可以下载最新的安装包,解压安装包进行安装
[root@localhost src]# wget http://download.redis.io/releases/redis-5.0.0.tar.gz
--2018-11-11 21:00:34-- http://download.redis.io/releases/redis-5.0.0.tar.gz
Resolving download.redis.io... 109.74.203.151
Connecting to download.redis.io|109.74.203.151|:80... connected.
HTTP request sent, awaiting response... 200 OK
解压后使用make&&make install 来直接安装,这里和其他软件不同,不需要./configure进行编译
[root@localhost redis-5.0.0]# make
cd src && make all
make[1]: Entering directory `/usr/local/src/redis-5.0.0/src'
CC Makefile.dep
-----------------------------------省略
[root@localhost redis-5.0.0]# make install
cd src && make install
make[1]: Entering directory `/usr/local/src/redis-5.0.0/src'
CC Makefile.dep
make[1]: Leaving directory `/usr/local/src/redis-5.0.0/src'
make[1]: Entering directory `/usr/local/src/redis-5.0.0/src'
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: Leaving directory `/usr/local/src/redis-5.0.0/src'
[root@localhost redis-5.0.0]#
查看redis的安装路径,在解压包的路径下拷贝redis的配置文件到/etc/目录下,对配置文件进行修改,这里会举例一些配置项说明。其中大部分配置不需要改动,后期我也会找出这些配置项的作用说明
[root@localhost redis-5.0.0]# which redis-cli
/usr/local/bin/redis-cli
[root@localhost redis-5.0.0]# cp redis.conf /etc/redis.conf
[root@localhost redis-5.0.0]# vim /etc/redis.conf
bind 127.0.0.1 #redis监听服务的ip,可以设置多个,多个ip使用空格分隔
protected-mode yes #保护模式开启状态
prot 6379 #监听端口
tcp-backlog 511 #
timeout 0 #
tcp-keepalive 300 #
daemonize yes #修改为yes,为no的话redis是在前台终端里启动,关闭终端后redis也会被关闭,yes选项则表示将redis放入后台去运行
supervised no #
pidfile /var/run/redis_6379.pid #redis启动后生成指定的pid文件
loglevel notice #日志启动级别
logfile "/var/log/redis.log" #指定日志的存储路径,redis配置默认没有指定路径
databases 16 #redis库,redis存储数据生成的使用库数量,库默认从0开始
always-show-log yes #
save 9001 #redis持久化的配置
save 300 10 #redis持久化的配置
save 60 10000 #redis持久化的配置
stop-writes-on-bgsave-error yes #
rdbcompression yes #是否压缩RDB文件
rdbchecksum yes #
dbfilename dump.rdb #指定RDB的文件名称
dir /data/redis #redis数据存储路径,默认配置为空
replica-serve-stale-data yes #
replica-read-only yes #配置主从时的配置
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no #开启aof日志,yes表示开启。在/data/redis下生成日志文件
appendfilename "appendonly.aof" #定义aof的生成日志名字
appendfsync everysec #记录日志的时间间隔
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
创建redis存储目录,并启动redis,启动时也需要在内核中添加redis的内核配置,如果想要开机时让内核配置生效,那么需要在/etc/rc.local中添加这些配置 修改内核参数,如果不定义内核参数,redis在启动后日志中会报错,报错信息即这些内核的提示
[root@localhost /]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@localhost /]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
将内核参数配置写入/etc/rc.local文件中,让其开机启动时就生效
[root@localhost /]# vim /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
启动redis并查看启动状态,配置中指定的是监听127.0.0.1这个ip,redis监听6379端口
[root@localhost /]# redis-server /etc/redis.conf
[root@localhost /]# ps aux |grep redis
root 18169 0.0 0.0 146336 4048 ? Ssl 21:56 0:00 redis-server 127.0.0.1:6379
root 18229 0.0 0.0 103388 2160 pts/1 S+ 21:59 0:00 grep redis
[root@localhost /]# netstat -ntlp |grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 18169/redis-server
```
# redis的RDB和AOF两种持久化模式区别
redis提供两种持久化方式,RDB(Redis DataBase)和AOF(Append Only File)两种模式持久化
RDB:简单来说,就是在不同时间上,将redis内存上存储的数据生成快照并存储到磁盘等介质上
AOF:则是换了一个角度来实现持久化,AOF模式是将redis执行过的所有指令记录下来,在下次redis发生重启时,只要把这些指令从前到后再重复执行一遍,就可以实现数据恢复
RDB和AOF两种方式也可以同时使用,在这种情况下,如果Redis发生重启,这种模式下会优先选择AOF方式来恢复数据,这是因为AOF方式恢复数据完整度更高
如果没有持久化需求的话,也可以关闭RDB和AOF的持久化模式,这样的话,redis会变为一个纯内存数据库,就和memcached一样了
配置持久化需要修改/etc/redis.conf的配置文件,启动redis使用redis-server+ 配置文件路径来进行启动redis
##### 编辑redis配置文件
[root@localhost /]# vim /etc/redis.conf #save "" 如果不开启持久化,去掉save ""注释,并将下面间隔更改的配置注释掉则关闭redis的持久化功能 save 900 1 #900秒发生一次数据更改 save 300 10 #300秒发生10次数据更改 save 60 10000 #60秒发生一万次数据更改 --------省略 #appendfsync always 每次更改都记录到硬盘,数据储存的安全性高。但是这样redis会频繁读写磁盘,会造成磁盘IO增高 appendfsync everysec 每秒更改记录到硬盘,每秒钟将redis中的数据存储到硬盘中,这种模式适中,建议开启这种同步模式,安全高效适中 #appendfsync no 关闭写入到磁盘但是打开这项,redis会根据系统自身的数据写入磁盘的频率来写入磁盘中,但是这样会造成redis存储数据不全
# redis数据类型
在本机登入redis,在终端里说明redis的数据类型
[root@localhost /]# redis-cli 127.0.0.1:6379>
**string 数据类型**
string是最简单的类型,与memcached一样,之存储一个key对应一个value的数据。其操作与memcached也是类似的,但redis功能更加丰富,可以设置以二进制存储的对象
127.0.0.1:6379> MSET k1 1 k2 2 k3 3 OK 127.0.0.1:6379> mget k1 k2 k3
- "1"
- "2"
- "3" 127.0.0.1:6379> mget k1 k2
- "1"
- "2" 127.0.0.1:6379> mget k1 k3
- "1"
- "3"
**set数据类型**
set数据是一种数据的集合,对集合操作有添加元素,有对多个集合交查询、合并查询及求差查询等操作。操作中的key值为集合的名字,比如在一款社交的存储数据中。可以将一个用户所有follow的人存储在一个集合中,将其被关注的人放入一个集合。因为redis非常合理的为集合提供求交集、并集、差集等操作。可以非常方便的实现如共同关注、共同爱好、推荐好友等功能。对以上列出的集合操作,还可以使用不同的命令选择将结果返回给用户还是存储到一个新的集合中
set写入一个集合并查看该集合的元素,如:
127.0.0.1:6379> SADD set1 a (integer) 1 127.0.0.1:6379> SADD set1 2 (integer) 1 127.0.0.1:6379> SADD set1 3 (integer) 1 127.0.0.1:6379> SADD set1 4 (integer) 1 127.0.0.1:6379> SADD set1 e (integer) 1 127.0.0.1:6379> SMEMBERS set1
- "4"
- "3"
- "2"
- "a"
- "e"
查询不同集合之间的交集元素,两个集合中存在着相同的元素,要列出这些相同的元素就叫做交集。如:
127.0.0.1:6379> SMEMBERS set1
- "2"
- "3"
- "4"
- "a"
- "e" 127.0.0.1:6379> SMEMBERS set2
- "1"
- "2"
- "3" 127.0.0.1:6379> SINTER set1 set2
- "2"
- "3"
将两个集合合并查询,会对重复的部分进行合并输出显示,将两个集合合并为一个集合输出。如:
127.0.0.1:6379> SUNION set1 set2 #set1和set2的集合是上面求交集中一样的数据
- "2"
- "3"
- "4"
- "a"
- "1"
- "e"
set集合间求差集,比较出两个集合直接没有的元素,比较并需要显示第一集合多第二集合哪些元素,第一集合在写在前面。比如:
127.0.0.1:6379> SMEMBERS set1
- "2"
- "3"
- "4"
- "a"
- "e" 127.0.0.1:6379> SMEMBERS set2
- "1"
- "2"
- "3" 127.0.0.1:6379> SDIFF set1 set2
- "4"
- "e"
- "a" 127.0.0.1:6379> SDIFF set2 set1
- "1"
删除一个集合中的一个元素,如:
127.0.0.1:6379> SMEMBERS set1
- "2"
- "3"
- "4"
- "a"
- "e" 127.0.0.1:6379> SREM set1 e (integer) 1 127.0.0.1:6379> SMEMBERS set1
- "2"
- "3"
- "4"
- "a"
**sort set数据集合(有序集合)**
sorted set是有序集合。比set多了一个权重参数score,使得集合中的元素能够按照score进行有序排序。比如存储一个考试成绩的sorted sets,集合中的value是同学的姓名。而score是考试得分,在数据插入集合的时候,就已经按照顺序规则进行了排序
添加一个有序集合的元素,并将其按照正序和倒序显示出来
127.0.0.1:6379> ZADD set 1 "asd" (integer) 1 127.0.0.1:6379> zadd set 1 "123" (integer) 1 127.0.0.1:6379> zadd set 1 "dds234" (integer) 1 127.0.0.1:6379> ZADD set 1 "123abc" (integer) 1 127.0.0.1:6379> ZRANGE set 0 -1 #集合正序输出
- "123"
- "123abc"
- "asd"
- "dds234" 127.0.0.1:6379> ZREVRANGE set 0 -1 #集合倒序输出
- "dds234"
- "asd"
- "123abc"
- "123"
**hash数据类型**
在memcached中。我们经常将一些结构化的信息打包成hashmap,在客户端序列化之后存储为一个字符串的值(一般是json格式的文件),比如用户的昵称、年龄、性别等等
比如在一个hash数据集合中写入一个姓名年龄的有效元素并查询其结果,比如:
127.0.0.1:6379> hset hash2 name xiaoming (integer) 1 127.0.0.1:6379> hget hash2 name "xiaoming" 127.0.0.1:6379> hset hash2 age 20 (integer) 1 127.0.0.1:6379> hget hash2 age "20" 127.0.0.1:6379> hgetall hash2
- "name"
- "xiaoming"
- "age"
- "20"