linux 学习笔记-078-NoSQL-redis 介绍,安装,redis 持久化,redis 数据类型

发布于 2018-05-02  211 次阅读


redis 介绍

Redis 和 Memcached 类似,也属于 k-v 数据存储

Redis 官网:https://redis.io/

当前最新稳定版 4.0.9

支持更多 value 类型,除了和 string 外,还支持 hash、lists(链表)、sets(集合)和 sorted sets(有序集合)

redis 使用了两种文件格式:全量数据(RDB)和增量请求(aof)。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行 replay 得到数据,这种类似于 mysql binlog。

增量请求(aof)建议定期的去做一些优化,预防文件越来越大占用磁盘空间

redis 的存储分为内存存储、磁盘存储和 log 文件三部分

redis 安装

01:

到官方网站下载最新稳定版 4.0.9,redis 比较特殊,没有"./configure",直接"make"和"make install"

[root@am-01:~#] cd /usr/local/src/

[root@am-01:/usr/local/src#] wget http://download.redis.io/releases/redis-4.0.9.tar.gz

--2018-05-02 23:17:22--  http://download.redis.io/releases/redis-4.0.9.tar.gz

正在解析主机 download.redis.io (download.redis.io)... 109.74.203.151

正在连接 download.redis.io (download.redis.io)|109.74.203.151|:80... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:1737022 (1.7M) [application/x-gzip]

正在保存至: “redis-4.0.9.tar.gz”



100%[===============================================================>] 1,737,022    399KB/s 用时 4.3s  



2018-05-02 23:17:32 (399 KB/s) - 已保存 “redis-4.0.9.tar.gz” [1737022/1737022])

[root@am-01:/usr/local/src#] tar xvf redis-4.0.9.tar.gz

[root@am-01:/usr/local/src#] cd redis-4.0.9/

[root@am-01:/usr/local/src/redis-4.0.9#] make

[root@am-01:/usr/local/src/redis-4.0.9#] echo $?

0

[root@am-01:/usr/local/src/redis-4.0.9#] make install

[root@am-01:/usr/local/src/redis-4.0.9#] echo $?

0

02:

redis 跟 httpd 之类的不一样,并不能指定安装路径等信息,默认安装到/usr/local/bin

[root@am-01:/usr/local/src/redis-4.0.9#] which redis-cli

/usr/local/bin/redis-cli

03:

拷贝配置文件到 etc,编辑一下,同时还要手动创建 dir 所定义的目录/data/redis

[root@am-01:/usr/local/src/redis-4.0.9#] cp redis.conf /etc/

[root@am-01:/usr/local/src/redis-4.0.9#] vim /etc/redis.conf

bind 127.0.0.1    #监听的 IP 地址,多个地址可以使用空格分隔

protected-mode yes    #默认打开的保护模式

port 6379    #监听的端口

daemonize yes    #改为 yes,即使 redis 后台启动

pidfile /var/run/redis_6379.pid    #pid 文件,可以指定一下或者默认

loglevel notice    #日志的级别

logfile "/var/log/redis.log"    #定义日志文件的存放路径

databases 16    #redis 有个库的概念,这里默认支持 16 个库

save 900 1

save 300 10

save 60 10000    #这三个为 rdb 持久化的相关设置

rdbcompression yes    #设置是否压缩 rdb 文件

dbfilename dump.rdb    #rdb 文件的名称

dir /data/redis    #定义 rdb 文件的存放路径,aof 文件也会存放在这个路径

appendonly no    #定义是否开启 aof

appendfilename "appendonly.aof"    #aof 文件的名称

appendfsync everysec    #定义什么时候记录一次日志,"everysec"为每一秒,"always"为有更新的时候记录一次

[root@am-01:/usr/local/src/redis-4.0.9#] mkdir /data/redis

04:

启动 redis,最后还要修改一下内核参数,要不然机器内存过小的情况下可能会出问题,其中修改内核参数的命令建议放到/etc/rc.local 中,让机器启动的时候自动执行命令

[root@am-01:/usr/local/src/redis-4.0.9#] redis-server /etc/redis.conf

[root@am-01:/usr/local/src/redis-4.0.9#] ps -aux | grep redis

root      84247  0.1  0.7 145264  7520 ?        Ssl  23:38   0:00 redis-server 127.0.0.1:6379

root      84252  0.0  0.0 112676   980 pts/0    S+   23:38   0:00 grep --color=auto redis

[root@am-01:/usr/local/src/redis-4.0.9#] sysctl vm.overcommit_memory=1

vm.overcommit_memory = 1

[root@am-01:/usr/local/src/redis-4.0.9#] echo never > /sys/kernel/mm/transparent_hugepage/enabled

[root@am-01:/usr/local/src/redis-4.0.9#] vim /etc/rc.local

sysctl vm.overcommit_memory=1

echo never > /sys/kernel/mm/transparent_hugepage/enabled

redis 持久化

Redis 提供了两种持久化的方式,分别是 RDB(Redis DataBase)和 AOF(Append Only File)

RDB,简而言之,就是在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上。

AOF,则是换了一个角度来实现持久化,那就是将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

其实 RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。

如果你没有数据持久化的需求,也完全可以关闭 RDB 和 AOF 方式,这样的话,redis 将变成一个纯内存数据库,就像 memcache 一样,但这样每次重启机器或者 redis 的时候都会导致数据丢失

redis 持久化相关参数

save 900 1    #表示每 15 分钟且至少有 1 个 key 改变,就触发一次持久化

save 300 10    #表示每 5 分钟且至少有 10 个 key 改变,就触发一次持久化

save 60 10000    #表示每 60 秒至少有 10000 个 key 改变,就触发一次持久

save ""    #这样可以禁用 rdb 持久化

appendonly yes    #如果是 yes,则开启 aof 持久化

appendfilename "appendonly.aof"    #指定 aof 文件名字

appendfsync everysec    #指定 fsync()调用模式,有三种 no(不调用 fsync),always(每次写都会调用 fsync),everysec(每秒钟调用一次 fsync)。第一种最快,第二种数据最安全,但性能会差一些,第三种为即安全又高效,默认为第三种

redis 数据类型

string:

string 为最简单的类型,与 Memcached 一样的类型,一个 key 对应一个 value,其支持的操作与 Memcached 的操作类似,它的功能更丰富。设置可以存二进制的对象

例子:

"mykey"是 key 的名;"123"为 key 的值;mset 可以设置多个 key;mget 可以查询多个 key

命令可以使用 tab 键补全

[root@am-01:~#] redis-cli

127.0.0.1:6379> set mykey 123

127.0.0.1:6379> get mykey

"123"

127.0.0.1:6379> mset key1 1 key2 2 key3 3

OK

127.0.0.1:6379> mget key1 key2 key3 mykey

1) "1"

2) "2"

3) "3"

4) "123"

list:

list 是一个链表结构,主要功能是 push、pop、获取一个范围的所有值等等。操作中 key 理解为链表的名字。使用 list 结构,我们可以轻松地实现最新消息排行等功能。list 的另一个应用就是消息队列,可以利用 list 的 push 操作,将任务存在 list 中,然后工作线程再用 pop 操作将任务取出进行执行

例子:

LPUSH 把数据放到链表中;LRANGE 列出链表的数据,其中"0 -1"指第一个到最后一个;LPOP 指从链表中取出数据,取出之后,链表将会少一个数据

127.0.0.1:6379> LPUSH list1 "am"

(integer) 1

127.0.0.1:6379> LPUSH list1 "123"

(integer) 2

127.0.0.1:6379> LPUSH list1 "321"

(integer) 3

127.0.0.1:6379> LRANGE list1 0 -1

1) "321"

2) "123"

3) "am"

127.0.0.1:6379> LPOP list1

"321"

127.0.0.1:6379> LRANGE list1 0 -1

1) "123"

2) "am"

set:

set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中 key 理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中

例子:

SADD 创建集合,并把一些元素放进去;SMEMBERS 列出集合的元素;SUNION 求两个集合的并集,即去重;SINTER 求两个集合的交集,即列出相同的;SDIFF 求差集,即 set1-set2;SREM 表示删除集合中的指定元素

127.0.0.1:6379> SADD set1 a

(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> SMEMBERS set1

1) "c"

2) "a"

3) "b"

127.0.0.1:6379> SADD set2 a

(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> SMEMBERS set2

1) "a"

2) "2"

3) "1"

127.0.0.1:6379> SUNION set1 set2

1) "a"

2) "c"

3) "2"

4) "b"

5) "1"

127.0.0.1:6379> SINTER set1 set2

1) "a"

127.0.0.1:6379> SDIFF set1 set2

1) "c"

2) "b"

127.0.0.1:6379> SREM set1 c

(integer) 1

127.0.0.1:6379> SMEMBERS set1

1) "a"

2) "b"

sort set:

sorted set 是有序集合,它比 set 多了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序

例子:

ZADD 创建有序集合,其中 set3 X 中的 X 指 score,一个用来排序的参数;ZRANGE 为顺序排序;ZREVRANGE 指倒序排序

127.0.0.1:6379> ZADD set3 12 abc

(integer) 1

127.0.0.1:6379> ZADD set3 2 "cbe 123"

(integer) 1

127.0.0.1:6379> ZADD set3 4 am

(integer) 1

127.0.0.1:6379> ZADD set3 23 aamm

(integer) 1

127.0.0.1:6379> ZRANGE set3 0 -1

1) "cbe 123"

2) "am"

3) "abc"

4) "aamm"

127.0.0.1:6379> ZREVRANGE set3 0 -1

1) "aamm"

2) "abc"

3) "am"

4) "cbe 123"

hash:

在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等

例子:

HSET 创建 hash 类型的数据;HGET 查询指定 key 的信息;HGETALL 查询所有 key 的信息

"hash1 name am"可以理解为,hash 的名称,key,value

127.0.0.1:6379> HSET hash1 name am

(integer) 1

127.0.0.1:6379> HSET hash1 age 30

(integer) 1

127.0.0.1:6379> HSET hash1 job IT

(integer) 1

127.0.0.1:6379> HGET hash1 name

"am"

127.0.0.1:6379> HGETALL hash1

1) "name"

2) "am"

3) "age"

4) "30"

5) "job"

6) "IT"