redis安装、持久化及数据类型

redis安装、持久化及数据类型

evobot 807 2018-08-19
  1. redis介绍
  2. redis安装
  3. redis持久化
  4. redis数据类型

Redis介绍

  • Redis和Memcached类似,也属于k-v数据存储,但redis支持更多value类型,除了k-v的string类型外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合);
  • redis使用了两种文件格式:全量数据(RDB)和增量请求(aof);
    • 全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;
    • 增量请求文件 则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql binlog;
  • redis的存储分为内存存储、磁盘存储(RDB)和log文件(aof)三个部分。

redis安装

下载安装

  • 首先下载稳定版的redis安装包,到redis官网下载,这里使用的是4.0.11版本;

  • 然后解压安装包,进行编译安装,redis编译不需要./configure步骤,直接make && make install即可;

  • 安装完成后,复制配置文件:

    $ cp redis.conf /etc/ 
    

redis配置文件

  • 打开配置文件,找到daemonize no配置项,将其改为yes,这个选项表示将redis启动模式改为后台启动,否则redis默认以前台启动方式启动;

  • 然后找到logfile配置项,指定redis的日志保存路径:

    logfile "/var/log/redis.log"
    
  • redis存在库的概念,默认有16个库,从0-15,默认在0库里;在选项databases 16可以看到;

  • rdbcompression yes配置表示是否压缩RDB文件,默认yes表示压缩;

  • dbfilename dump.rdb配置指定rdb的文件名;

  • dir ./配置则是指定RDB文件存储位置,默认为安装目录,建议更改为其他路径,另外aof文件也会放在这个目录,如:

    dir /data/redis/
    
  • appendonly no配置,是用来指定是否开启aof配置的,默认为no不开启,appendfilename "appendonly.aof"配置则是指定aof日志的文件名,生产的文件会保存在之前的dir配置项配置的目录里;

  • appendfsync everysec配置是指定什么时候记录aof日志,everysec表示每秒记录,always则表示总是记录,即每执行一个操作就记录一次,而no则是根据系统算法进行记录,不够安全,一般使用everysec配置;

启动redis

  • 启动redis前,可以修改以下两个内核参数,不修改内核参数,redis同样能够正常工作,但会在日志中产生告警,所以建议修改内核参数:

    sysctl vm.overcommit_memory=1
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
  • 另外定义高负载的环境,还需要修改/proc/sys/net/core/somaxconn每个端口最大的监听队列的长度 参数,系统默认为128,建议修改为1024或2048:

    echo 2048 > /proc/sys/net/core/somaxconn
    
  • 命令行中执行上面的命令只是临时生效,永久生效需要将上面的命令写入/etc/rc.local文件中;

  • 然后启动redis服务,使用命令redis-server /etc/redis.conf

    $ redis-server /etc/redis.conf
    
    $ ps aux |grep redis
    root     32082  0.0  0.1 145264  2172 ?        Ssl  23:49   0:00 redis-server 127.0.0.1:6379
    root     32106  0.0  0.0 112676   984 pts/0    R+   23:49   0:00 grep --color=auto redis
    
    

redis持久化

redis持久化介绍

  • redis提供了两种持久化的方式,分别为RDB(Redis DataBase)和AOF(Append Only File);
  • 如果关闭RDB和AOF,那么redis的数据则都存储在内存中,一旦服务器关闭或redis服务关闭,则redis中存储的数据都会丢失;
  • RDB,就是在不同的时间点,将redis存储的数据生成快照病存储到磁盘等介质上;
  • AOF,则是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只需要将这些写指令从前到后再重复执行一遍,就可以实现数据恢复;
  • RDB和AOF两种方式可以同时使用,在这种情况下,redis重启时会优先采用AOF方式进行数据恢复,这是因为AOF方式恢复的数据完整度更高;
  • 如果没有数据持久化需求,则可以关闭RDB和AOF,这样redis就和memcached相同,成为纯内存数据库

redis持久化配置

  • redis的RDB方式,存储到磁盘上的时间,是由配置文件中的save配置项指定的,如果关闭RDB,则注释save的三行配置,打开save ""配置即可,下面是默认redis的RDB写入磁盘的配置:

    save 900 1	# 表示900秒更改了一次
    save 300 10	# 表示300秒更改了10次
    save 60 10000	# 60秒发生了10000次更改
    
    • 以上3个配置,只要满足一项,redis就会将数据写入磁盘,这里的更改是指增加、删除、修改操作。
    • 一般保持默认配置即可满足大部分需求。
  • AOF会随着redis的运行时间,存储的文件也会也来越大,因为AOF并不会删除已经过期的记录,AOF的配置在配置文件中就是appendfsync配置项。

redis数据类型

string类型

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

  • 使用redis-cli命令进行redis的命令行工具,使用set [key][value]增加一个键值记录:

    [root@evobot ~]# redis-cli
    127.0.0.1:6379> SET mykey 123
    OK
    127.0.0.1:6379> SET mykey2 "evobot"
    OK
    127.0.0.1:6379>
    
    
  • 使用get [key]获取一个键的值:

    127.0.0.1:6379> GET mykey
    "123"
    127.0.0.1:6379> get mykey2
    "evobot"
    
  • 使用mset [key1][value1] [key2][value2] ...可以一次增加多个k-v记录,使用mget [key1] [key2] ...可以一次获取多个键的值:

    127.0.0.1:6379> mset key1 "evobot" key2 "hell world" key3 "myredis"
    OK
    
    127.0.0.1:6379> mget key1 key2 key3
    1) "evobot"
    2) "hell world"
    3) "myredis"
    
    

list类型

  • list是一个链表结构,主要功能是push、pop、获取一个范围所有值等,操作中的key理解为链表的名字;

  • 使用list结构,可以轻松实现最新消息排列等功能,如微博的TimeLine,list的另一个作用就是消息队列,可以利用list的push操作,将任务存在list中,然后工作线程再用pop操作将任务取出后进行执行;

  • 对于list类型的数据操作如下:

    • PUSH操作
    127.0.0.1:6379> LPUSH list1 "evobot"
    (integer) 1
    127.0.0.1:6379> LPUSH list1 "second value"
    (integer) 2
    127.0.0.1:6379> LPUSH list1 "third value"
    (integer) 3
    
    
    • LRANGE操作,查看list中的数据:
    127.0.0.1:6379> LRANGE list1 0 -1
    1) "third value"
    2) "second value"
    3) "evobot"
    127.0.0.1:6379> LRANGE list1 0 1
    1) "third value"
    2) "second value"
    
    
    • POP操作:
    127.0.0.1:6379> LPOP list1
    "third value"
    127.0.0.1:6379> LRANGE list1 0 -1
    1) "second value"
    2) "evobot"
    # pop取出后,原list中就没有了最后一个值
    

    这里的LPUSH、LRANGE、LPOP中的L都是指left,即从左往右正向取值。

set类型

  • set是集合,与数学概念中的集合类似,对集合的操作有添加、删除元素,有多个集合求交并差等操作;

  • 操作中key理解为集合的名字,例如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有的粉丝存在另一个集合中,因为redis提供了求交集、并集、差集等操作,就可以非常方便的实现如共同关注、共同喜好、二度好友等功能;

  • 对于集合的操作,还可以使用不同的命令,将结果返回客户端或存到一个新的集合中;

  • set类型的操作如下:

    • SADD [setname] [value]为集合增加元素:
    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> SADD set1 d
    (integer) 1
    
    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 e
    (integer) 1
    
    
    • SMEMBERS [setname]查看集合的所有元素:
    127.0.0.1:6379> SMEMBERS set1
    1) "b"
    2) "a"
    3) "d"
    4) "c"
    
    127.0.0.1:6379> SMEMBERS set2
    1) "1"
    2) "e"
    3) "a"
    
    
    • SUNION [set1] [set2]并集操作:
    127.0.0.1:6379> SUNION set1 set2
    1) "1"
    2) "d"
    3) "c"
    4) "e"
    5) "b"
    6) "a"
    
    
    • SINTER [set1] [set2]交集操作:
    127.0.0.1:6379> SINTER set1 set2
    1) "a"
    
    • SDIFF [set1] [set2]差集操作:
    127.0.0.1:6379> SDIFF set1 set2
    1) "b"
    2) "c"
    3) "d"
    
    • SREM [setname] [value]删除集合中元素:
    127.0.0.1:6379> SREM set1 c
    (integer) 1
    127.0.0.1:6379> SMEMBERS set1
    1) "b"
    2) "a"
    3) "d"
    
    

sort set类型

  • sort set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按照score进行有序排列;

  • 例如存储一个班的同学成绩的sorted sets,其集合value可以是同学的学号,而score就可以是其考试得分,这样数据在插入集合时,就已经进行了天然的排序;

  • sort set类型的操作如下:

    • ZADD [setname] [score] [value]为sort set添加有序集合和值:
    127.0.0.1:6379> ZADD set3 12 abc
    (integer) 1
    127.0.0.1:6379> ZADD set3 2 "abc123"
    (integer) 1
    127.0.0.1:6379> ZADD set3 24 "evobot"
    (integer) 1
    127.0.0.1:6379> ZADD set3 4 "string"
    (integer) 1
    
    • ZRANGE [setname] [start] [stop]查看从start开始到stop结束范围内的有序集合的值:
    127.0.0.1:6379> ZRANGE set3 0 -1
    1) "abc123"
    2) "string"
    3) "abc"
    4) "evobot"
    
    

    ZRANGE查看有序集合的值的时候,score不会输出,而值的排列时按照score大小进行有序排列输出的。

    • ZREVRANGE [setname] [start] [stop],反序输出集合的值:
    127.0.0.1:6379> ZREVRANGE set3 0 -1
    1) "evobot"
    2) "abc"
    3) "string"
    4) "abc123"
    
    

hash类型

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

  • 对于hash类型的操作如下:

    • HSET [hashname] [field] [value],添加字段field的值value到名为hashname哈希字段中:
    127.0.0.1:6379> HSET hash1 name evobot
    (integer) 1
    127.0.0.1:6379> HSET hash1 age 25
    (integer) 1
    127.0.0.1:6379> HSET hash1 job it
    (integer) 1
    
    
    • HGET [hashname] [field]获取指定哈希的字段的值:
    127.0.0.1:6379> HGET hash1 name
    "evobot"
    127.0.0.1:6379> HGET hash1 age
    "25"
    127.0.0.1:6379> HGET hash1 job
    "it"
    
    
    • HGETALL [hashname]获取指定哈希的所有字段及其对应的值,输出中奇数行为字段名,偶数行为字段的值:
    127.0.0.1:6379> HGETALL hash1
    1) "name"
    2) "evobot"
    3) "age"
    4) "25"
    5) "job"
    6) "it"
    
    


# NoSQL # redis