2019-10-13

Redis

1.redis是什么?

Remote Dictionary Server(Redis)是一个开源的使用 ANSI C 语言编写、支持网络、可

基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map),

列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

2.为什么要用redis?

为了解决tomcat集群的session丢失问题

方式一:保证一个ip永远只访问一台tomcat(只支持linux)

upstream中添加 ip_hash;但是服务器损坏,还会有session丢失的状况。

方式二:session共享

一种使用tomcat广播机制完成session的共享(使用io流的方式进行存储,和导出,性能差。只支持windows,不推荐的方式)

一种使用redis服务器的方式完成session的共享(redis可将数据存储到内存,查询数据较快,推荐的方式)

3.Redis的特点

1) 支持多种数据结构,如  string(字符串)、 list(双向链表)、dict(hash 表)、set(集合)、zset(排序set)、hyperloglog(基数估算)

2)支持持久化操作,可以进行 aof 及 rdb 数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。

3)  支持通过 Replication 进行数据复制,通过 master-slave 机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave 机制是Redis进行HA的重要手段。

4)  单进程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。

4.安装 Redis 单机版

第一步 需要在linux系统中安装gcc

第二步 需要将下载好的 redis压缩包添加到linux服务器中,并解压文件

第三步 编译redis

第四步 安装redis

进 入 redis 的 解 压 完 毕 的 根 目 录 下 , 执 行 命 令 :   make install

PREFIX=安装的绝对路径

第五步:启动redis

1,前端启动 (不推荐)

在 bin 目录下执行命令:   ./redis-server   (ctrl+c)退出redis

2.后端启动

(1)先将redis解压目录下的 redis.conf文件拷贝到安装好的redis的 bin 目录下  

(2)修改拷贝过来的 redis.conf配置文件

将daemonize no  改为  yes

(3)启动redis

在 bin 目录下执行命令:./redis-serve  rredis.conf

(4)查看redis启动是否成功

两种方法:

1)、输入命令:ps aux|grep redis

2)、在 bin 目录下启动 redis自带的客户端  ./redis-cli  

常见redis命令:

ping--->pong

(5) 关闭redis的命令

./redis-cli shutdown

5.Redis数据类型

reids数据类型常用的有五种:String、Set、字符串(String), 哈希(Map),列表(list), 集合(sets) 和 有序集合(sorted sets)。

5.1 String(字符串)

Redis 字符串是字节序列。Redis 字符串是二进制安全的,这意味着他们有一个已知的

长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限

Set:在redis数据库中增String类型的键值数据

Get: 在redis数据库中根据对应的键查看相对应的值

incr 让当前键值以1 的数量递增,并返回递增后的值

incrby  可以指定参数一次增加的数值,并返回递增后的值

decr 让当前键值以 1的数量递减 并返回递减后的值

decrby  可以指定参数一次递减的数值,并返回递减后的值

incrbyfloat  可以递增一个双精度浮点数

2019-10-13_第1张图片

append  作用是向键值的末尾追加 value。如果键不存在则将该键的值设置为 value。返

回值是追加后字符串的总长度。

mget/mset  作用与get/set相似,不过mget/mset可以同时获得/设置多个键的键值

2019-10-13_第2张图片

del 根据key来删除 value

flushdb 清除当前库的所有数据

5.2 Hash(hash表)

Redis的哈希是键值对的集合。 Redis的哈希值是字符串字段和字符串值之间的映射,

因此它们被用来表示对象

2019-10-13_第3张图片

hset 存储一个哈希键值对的集合

hset key field value

hget获取一个哈希键的值

hget key field

hmset 存储一个或多个哈希是键值对的集合

hmset key field1 value1 ......fieldN keyN

hmget  获取多个指定的键的值

hmget key field1 ... fieldN

hexists 判断哈希表中的字段名是否存在 如果存在返回 1 否则返回0

hexists key field

hdel 删除一个或多个字段

hdel key field

2019-10-13_第4张图片

hgetall 获取一个哈希是键值对的集合

hgetall key

2019-10-13_第5张图片

hvals 只返回字段值

hvals key

hkeys 只返回字段名

hkeys key

2019-10-13_第6张图片

hlen 返回key的 hash的元素个数

hlen key

5. 3 List(链表)

Redis 的链表是简单的字符串列表,排序插入顺序。您可以添加元素到 Redis 的列表的

头部或尾部

2019-10-13_第7张图片


lpush  key value 向链表左侧添加

rpush  key value 向链表右侧添加

lpop key 从左边移出一个元素

rpop  key  从右边移出一个元素

llen key 返回链表中元素的个数 相当于关系型数据库中  select count(*)

lrange key start end  lrange命令将返回索引从 start到stop 之间的所有元素。Redis的列

表起始索引为0。

2019-10-13_第8张图片

lrange也支持负索引  lrange nn -2 -1  如  -1 表示最右边第一个元素  -2 表示最右边第二

个元素,依次类推。

2019-10-13_第9张图片

lindex key indexnumber  如果要将列表类型当做数组来用,lindex 命令是必不可少的。

lindex命令用来返回指定索引的元素,索引从0开始

        如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。

2019-10-13_第10张图片

Lset key indexnumber value    是另一个通过索引操作列表的命令,它会将索引为 index

的元素赋值为value。

5. 4 Set(集合)

Redis的集合是字符串的无序集合。

2019-10-13_第11张图片

sadd key value 添加一个 string元素到,key对应的 set集合中,成功返回1,如果元素已经

在集合中返回0


scard key 返回set的元素个数,如果set是空或者 key不存在返回0

smembers key 返回 key对应 set的所有元素,结果是无序的

2019-10-13_第12张图片

sismember key value 判断value 是否在set中,存在返回 1,0表示不存在或者key不存

srem key value  从 key对应 set中移除给定元素,成功返回 1,如果value  在集合中不存

在或者key不存在返回 0

2019-10-13_第13张图片

5.5 SortedSet(有序集合)zset

Redis的有序集合类似于 Redis的集合,字符串不重复的集合。

zadd key score value 将一个或多个value及其 socre加入到set中

zrange key start end  0 和-1表示从索引为0的元素到最后一个元素(同 LRANGE命

相似)


zrange key 0 -1 withscores  也可以连同score一块输出,使用 WITHSCORES 参数

2019-10-13_第14张图片

zranebyscore key start end 指定范围集合的值(不能有负数)

2019-10-13_第15张图片

zremrangebyscore key start end  可用于范围删除操作

2019-10-13_第16张图片


6.Redis中的其他命令

ping 测试redis是否链接 如果已链接返回 PONG

echo value测试redis是否链接 如果已链接返回  echo命令后给定的值

keys *  返回所有的 key  可以加*通配 

exists key判断 string 类型一个key是否存在 如果存在返回1 否则返回0

expire key time(s)  设置一个key的过期时间 单位秒。时间到达后会删除 key及 value

ttl key 查询已设置过期时间的 key的剩余时间 如果返回-2 表示该键值对已经被删除

2019-10-13_第17张图片

persist 移除给定 key的过期时间

select dbindex 选择数据库(0-15)

2019-10-13_第18张图片

move key dbIndex 将当前数据库中的key转移到其他数据库中

2019-10-13_第19张图片

dbsize 返回当前数据库中的 key的数目

info 获取服务器的信息和统计

flushdb 删除当前选择的数据库中的 key

2019-10-13_第20张图片

flushall 删除所有数据库中的所有 key 

2019-10-13_第21张图片

quit 退出连接

7 .Redis的配置以及持久化方案 


7. 1 redis.conf文件

daemonize yes 

是否在后台执行,yes:后台运行;no:不是后台运行(老版本默认) 

port 6379

redis 监听的端口号。

#bind 127.0.0.1

指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求

timeout 0

此参数为设置客户端空闲超过 timeout,服务端会断开连接,为 0 则服务端不会主动断开连接,不能小于 0。

loglevel notice

#指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有 debug 级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)

logfile /var/log/redis/redis-server.log

#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的 redis 标准输出是/dev/null。

databases 16

数据库的数量,默认使用的数据库是 DB 0。可以通过”SELECT “命令选择一个 db

save 900 1

save 300 10

save 60 10000

快照配置

注释掉“save”这一行配置项就可以让保存数据库功能失效

设置 sedis 进行数据库镜像的频率。

900 秒(15 分钟)内至少1 个 key 值改变(则进行数据库保存--持久化) 

300 秒(5 分钟)内至少 10 个 key 值改变(则进行数据库保存--持久化) 

60 秒(1 分钟)内至少 10000 个 key 值改变(则进行数据库保存--持久化)

rdbchecksum yes

是否校验 rdb 文件。从 rdb格式的第五个版本开始,在 rdb 文件的末尾会带上 CRC64 的校验和。这跟有利于文件的容错性,但是在保存 rdb 文件的时候,会有大概 10%的性能损耗,所以如果你追求高性能,可以关闭该配置。

dbfilename dump.rdb

rdb 文件的名称

dir /root/temp

数据目录,数据库的写入会在这个目录。rdb、aof 文件也会写在这个目录

appendonly no

默认 redis 使用的是 rdb 方式持久化,这种方式在许多应用中已经足够用了。但是 redis 如果中途宕机,会导致可能有几分钟的数据丢失,根据 save 来策略进行持久化,Append Only File 是另一种持久化方式,可以提供更好的持久化特性。Redis 会把每次写入的数据在接收后都写入 appendonly.aof文件,每次启动时 Redis 都会先把这个文件的数据读入内存里,先忽略 RDB 文件。

appendfilename "appendonly.aof"

aof 文件名

appendfsync everysec

aof 持久化策略的配置

no 表示不执行 fsync,由操作系统保证数据同步到磁盘,速度最快。

always 表示每次写入都执行 fsync,以保证数据同步到磁盘。

everysec 表示每秒执行一次 fsync,可能会导致丢失这 1s 数据。

cluster-enabled yes

集群开关,默认是不开启集群模式。

8.Redis的数据持久化

8.2 RDB方式

8.2.1  什么是Redis的RDB备份方式?

将Redis 将内存中的数据库状态压缩成二进制文件保存到磁盘里面,通过该文件可以还原生成RDB文件时的数据库状态(默认下,持久化到dump.rdb 文件,并且在 redis 重启后,自动读取其中文件。恢复内存中的数据。

8.2.2 RDB的备份策略是什么?

1)执行命令手动生成,

有两个Redis 命令可以用于生成 RDB 文件,一个是SAVE,另一个是BGSAVE SAVE

命令会阻塞Redis 服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服

务器不能处理任何命令请求,BGSAVE 命令会派生出一个子进程,然后由子进程负责创建

RDB文件,服务器进程(父进程)继续处理命令请求,创建RDB 文件结束之前,客户端发

送的BGSAVE 和SAVE 命令会被服务器拒绝

 2)通过配置自动生成,在redis.conf中配置如下:

可以设置服务器配置的 save 选项,让服务器每隔一段时间自动执行一次 BGSAVE 命

令,可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会

执行BGSAVE 命令

save 900 1

save 300 10

save 60 10000

那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行

服务器在900秒之内,对数据库进行了至少1次修改

服务器在300秒之内,对数据库进行了至少 10次修改

服务器在60 秒之内,对数据库进行了至少 10000 次修改

8.3 AOF方式

AOF持久化方式在 redis中默认是关闭的,需要修改配置文件开启该方式。

8.3.1 什么是Redis的AOF备份方式

是通过保存Redis服务器所执行的写命令来记录数据库状态的文件。

AOF文件刷新的方式,有三种:

1)   appendfsync always - 每提交一个修改命令都调用 fsync 刷新到AOF文件,非常非常

慢,但也非常安全

2)appendfsync everysec - 每秒钟都调用fsync 刷新到AOF文件,很快,但可能会丢失一秒以内的数据

3) appendfsync no - 依靠OS进行刷新,redis 不主动刷新AOF,这样最快,但安全性就差


默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾

8.3.2 AOF方式的数据恢复?

服务器在启动时,通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数

据库状态,具体过程:

  a载入AOF文件

 b 创建模拟客户端

c  从 AOF 文件中读取一条命令

 d 使用模拟客户端执行命令

 e 循环读取并执行命令,直到全部完成

8.4 Redis集群

8.4.1 Redis的集群原理

每一个蓝色的圈都代表着一个redis 集群中的主节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作,如下:Redis-Cluster架构图 

2019-10-13_第22张图片


8.4.2 Redis集群的容错原理

Redis之间通过互相的 ping-pong 判断是否节点可以连接上。如果有一半以上的节点去ping 一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的从节点。如果某个节点和所有从节点全部挂掉,我们集群就进入 fail 状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入 fail 了状态。

如下图所示:

2019-10-13_第23张图片


8.4.3 Redis集群中数据的分片存储

当我们的存取的key 到达的时候,redis 会根据 crc16 的算法得出一个结果,然后把

结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽(哈希槽被redis集群平均分配),通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

如下所示:

2019-10-13_第24张图片


你可能感兴趣的:(2019-10-13)