Redis
0、Redis中文文档及版本选择
2015年4月7日
1、更新首页和下载页里redis的最新版本3.0.0
2017年7月15日
1、更新首页和下载页里redis的最新版本4.0.0
2018年10月18日
1、更新首页和下载页里redis的最新版本5.0.0
1、NoSQL
非关系型的数据库(NoSQL=Not Only SQL),都具有非常高的读写性。
读11w次/s
写8w次/s
MongoDB、Redis等非关系型数据库。
键值对存储(KV)
Cache
Persistence
大数据3V
海量Volume
多样Variety
实时Velocity
互联网3高
高并发
高可扩
高性能
1.1、NoSQL应用场景:
1.网站首页:
多数据源、多数据类型。
2.商品基本信息:
关系型数据库MySQL、Oracle。
3.商品描述、详情、评价信息(文字类):
文档类数据库MongoDB。
4.商品图片:
分布式文件系统:淘宝的TFS、Google的GFS、Hadoop的HDFS。
5.商品关键字:
搜索引擎(淘宝内用)ISearch。
6.热点信息:
内存型数据库Tair、Redis、Memcache。
7.商品交易:
外部第三方支付接口。
1.2、NoSQL数据库四大类型
1.2.1、KV键值型数据库
(1)应用场景:
内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等。
(2)数据库
Redis、Oracle等。
(3)数据类型
Key指向Value的键值对。
(4)优点
查找速度快。
(5)缺点
数据无结构化,通常只被当作字符串或者二进制数据。
新浪:BerkeleyDB+Redis
美团:Redis+Tair
阿里、百度:Memcache+Redis
1.2.2、文档型数据库
(1)应用场景:
Web应用(与Key-Value类似。数据库可以了解Value的内容)。
(2)数据库
CouchDB、MongoDB。
(3)数据类型
Key-Value的键值对,Value唯结构化数据。
(4)优点
数据结构要求不严格,表结构可变,不需要像关系型数据库一样要预先定义表结构。
(5)缺点
查询性能不高,缺乏统一的查询语法。
1.2.3、列簇型数据库
(1)应用场景:
分布式文件系统。
(2)数据库
Cassandra、HBase、Riak。
(3)数据类型
以列簇式存储,将同一列数据存在一起。
(4)优点
查找速度快、可扩展性强、更容易进行跟不是扩展。
(5)缺点
功能现对局限。
1.2.4、图关系数据库
(1)应用场景:
社交网络、推荐系统等。专注于构建关系图谱。
(2)数据库
Neo4J、InfoGrid。
(3)数据类型
图结构。
(4)优点
利用图结构相关算法。最短路径寻址、N度关系查找等
(5)缺点
很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群。
并非指存储图片的数据库,而是以图这种数据结构存储和查询数据。
1.3、分布式数据库CAP+BASE原理
1.3.1、CAP原理
C:
Consistency(强一致性)
A:
Availability(可用性)
P:
Partition tolerance(分区容错性)
CAP只能三选二
核心:
一个分布式系统不可能同时很好的满足一致性、可用性、分区容错性这三个需求。最多只能同时满足两个。
根据CAP原理将NoSQL数据库分为以下三类:
CA:
单点集群,满足一致性、可用性的系统。通常可扩展性不太强。
比如:RDBMS(关系数据库管理系统)
CP:
满足一致性、分区容错性的系统。通常性能不太高。
比如:MongoDB、Redis、HBase
NoSQL(非关系型数据库)
AP:
满足可用性、分区容错性的系统。通常对一致性要求低。
比如:CouchDB
大多数网站架构的选择
1.3.2、BASE
核心
为了解决关系型数据库强一致性引起的问题而因袭的可用性降低而提出的解决方案
通过系统对放松某一时刻数据一致性,来换取系统整体伸缩性和性能上的提升。
BA
Basically Available (基本可用性)
指分布式系统在出现不可预知故障的时候,允许损失部分可用性。
S
Soft state (软状态)
允许部分节点的数据存在一定的延时,这个延时不影响可用性。
E
Eventually consistent (最终一致性)
软状态允许有一定延时。
在一定的延时过去之后,所有节点的数据必须保持一致。
1.3.3、分布式与集群
1.分布式
不同的多台服务器上部署不同的服务,他们直接通过Rpc/Rmi
之间通信和调用,对外提供服务和组内合作。
1.Rpc 远程过程调用
一个节点请求另一个节点提供的服务
2.Rmi 远程方法调用
一个本地的JVM可以调用存在于另外一个JVM中的对象方法,就好像它仅仅是在调用本地JVM中某个对象方法一样。
2.集群
不同的多台服务器上部署相同的服务,通过分布式调度软件进行统一的调度,对外提供服务和访问。
2、Redis介绍
REmote DIctionary Server
远程字典服务器
开源免费,使用C语言编写,遵守BSD协议。
一个高性能的(Key/Value)分布式内存数据库,
基于内存运行并持久化的NoSQL数据库,
也称为数据结构服务器。
2.1、Redis三个特点
1.Redis支持数据持久化。
2.Redis不仅仅支持简单的Key/Value类型数据, 同时还支持list、set、zset、hash等数据类型。
3.Redis支持数据备份。
2.2、Redis功能
1.内存存储和持久化。
2.session共享。
3.发布、订阅信息系统。
4.定时器、计数器。
2.3、Redis安装
2.3.1、下载依赖
yum install -y gcc-toolset-9-gcc-c++.x86_64
yum install -y lrzsz.x86_64
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
2.3.2、解压安装
tar -xzvf redis-5.0.5.tar.gz
cd redis-5.0.5
make && make install
2.3.3、修改配置文件
mkdir /redis
cp redis.conf /redis/
vim /redis/redis.conf
132 ################################# GENERAL #####################################
133
134 # By default Redis does not run as a daemon. Use 'yes' if you need it.
135 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
136 daemonize yes #改为yes
2.3.4、启动
redis-server /redis/redis.conf
ps aux | grep redis
redis-cli -p 6379
2.3.5、关闭
# redis-cli -p 6379
127.0.0.1:6379> SHUTDOWN
not connected> EXIT
2.4、Redis五大数据类型
2.4.1、Redis字符串(String)
最基本的类型,一个Key对应一个Value。
二进制安全,string可以包含任何数据。
一个Value最多支持512M。
2.4.2、Redis哈希(Hash)
键值对集合。
是一个string类型的field和Value的映射表。
用于存储对象。
2.4.3、Redis列表(List)
字符串列表。
按照插入顺序排序。
2.4.4、Redis集合(Set)
string类型的无序无重复集合。
通过HashTable实现。
2.4.5、Redis有序合集(Zset)sorted set
和set一样也是string类型元素集合,且不允许成员重复。
每个元素都会关联一个double类型的分数。
通过分数为合集中的成员进行从小到大的排序。
zset的成员是唯一的,分数(score)可以重复。
2.5、Redis常用命令
2.5.1、Key类型常用命令
KEYS * 查询key #生产中不要用
KEYS (key)?
SET (key) (value) 设置key值
多次赋值会覆盖
GET (key) 查询key值
DEL (key) 删除key
EXISTS (key) 判断key是否存在
1存在 0不存在
SELECT 0-15 切换到指定的数据库(一个redis实例中有16个库)
EXPIRE (key) 时间(单位秒) 设置过期时间
EXPIRE (key) 7 key7秒后过期(过期后自动删除)
TTL (key) 查询key过期时间
-1 永不过期 -2 已过期
TYPE (key) 查询key类型
2.5.2、String字符串类型常用命令
APPEND key value 指定的key追加值
#仅支持数字类型
INCR key 将key中储存的数字值增1
DECR key 将key中储存的数字值减1
INCRBY key increment 将key中储存的数字加上指定的增量值
DECRBY key increment 将 key 所储存的值减去指定的减量值
GETRANGE key start end 获取存储在指定key中字符串的子字符串。
GETRANGE key 0 7 获取key中前7个字符
0 -1 全部显示
SETRANGE key offset value 指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。
127.0.0.1:6379> set hello word
127.0.0.1:6379> SETRANGE hello 2 123
(integer) 5
127.0.0.1:6379> get hello
"wo123"
SETEX key seconds value 指定的key设置值及其过期时间。如果key已经存在,SETEX命令将会替换旧的值。
SETEX key 7 Value 7秒后key过期
SETNX key value 指定的key不存在时,为key设置指定的值,不会覆盖。
MSET key value [key value ...] 设置多个key值
MSET k1 v1 k2 v2
MGET key value [key value ...] 查询多个key值
MSETNX key value [key value ...] 所有key都不存在时,同时设置一个或多个key-value对,如果其中一个key存在全都不赋值。
2.5.3、List列表类型常用命令
LPUSH key value [value ...] 将一个或多个值插入到列表头部。
RPUSH key value [value ...] 将一个或多个值插入到列表尾部。
LRANGE key start stop 查询列表中指定区间内的元素,区间以偏移量 START和END指定。
0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
-1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推
LPOP key 移除并返回列表的第一个元素。
RPOP key 移除并返回列表的最后个元素。
LINDEX key index 通过索引获取列表中的元素。
LINDEX k7 7 获取k7表中的第8个元素。
-1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
LLEN key 列表的长度。
如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
LREM key count value 根据count值,删除列表中与value相同的元素。
LREM k7 2 7 删除k7列表中2个Value为7的元素。
LTRIM key start stop 让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表头部并返回。
127.0.0.1:6379> RPUSH list01 1 2 3
127.0.0.1:6379> RPUSH list02 q w e
127.0.0.1:6379> RPOPLPUSH list01 list02
"3"
127.0.0.1:6379> LRANGE list01 0 -1
1) "1"
2) "2"
127.0.0.1:6379> LRANGE list02 0 -1
1) "3"
2) "q"
3) "w"
4) "e"
LSET key index value 通过索引来设置元素的值。
当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。
LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作。
当列表不存在时,被视为空列表,不执行任何操作。
如果 key 不是列表类型,返回一个错误。
127.0.0.1:6379> LRANGE list01 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> LINSERT list01 before 2 wy
(integer) 4
127.0.0.1:6379> LINSERT list01 after 2 dyp
(integer) 5
127.0.0.1:6379> LRANGE list01 0 -1
1) "1"
2) "wy"
3) "2"
4) "dyp"
5) "3"
list是一个字符串链表,left、right都可以插入添加。
如果键不存在,创建新的链表。
如果键已存在,新增内容。
如果值全部删除,对应的键也会消失。
链表操作不论是头和尾效率极高,但对中间元素进行操作效率很低。
2.5.4、Set集合常用命令
SADD key member [member ...] 将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
当集合 key 不是集合类型时,返回一个错误。
SMEMBERS key 查询集合中的所有的成员。 不存在的集合 key 被视为空集合。
SISMEMBER key member 判断成员元素是否是存在。
SCARD key 查询集合中有多少元素。
SREM key member [member ...] 删除合集中的元素。
SRANDMEMBER key [count] 随机出count个元素。
SPOP key [count] 随机出count个元素,之后删除。
SMOVE source destination member 将指定成员 member 元素从 source 集合移动到 destination 集合。
SDIFF key [key ...] 查询集合之间的差集,返回不同元素。
SINTER key [key ...] 查询集合之间的交集,返回相同元素。
SUNION key [key ...] 查询合集之间的并集,去重之后返回所有元素。
2.5.5、Hash哈希常用命令
field-value (字段-值)
HSET key field value 为哈希表中的字段赋值。
HGET key field 查询哈希表中的字段值。
HMSET key field value [field value ...] 为哈希表中的多个字段赋值。
HMGET key field [field ...] 查询哈希表中的一个或多个字段值
HGETALL key 哈希表中,所有的字段和值。
HDEL key field [field ...] 删除哈希表key中的一个或多个字段,不存在的字段将被忽略。
HLEN key 查询哈希表中字段的数量。
HEXISTS key field 查询哈希表的指定字段是否存在。
HKEYS key 查询哈希表key中的所有字段。
HVALS key 查询哈希表key中的所有值。
HINCRBY key field increment 为哈希表中的字段值加上指定增量值。
HINCRBYFLOAT key field increment 为哈希表中的字段值加上指定浮点数增量值。
HSETNX key field value 为哈希表中不存在的的字段赋值。
2.5.6、Zset有序集合常用命令
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
将一个或多个成员元素及其分数值加入到有序集当中。
127.0.0.1:6379> zadd zset 60 v1 70 v2 80 v3
ZRANGE key start stop [WITHSCORES] 查询有序集中,指定区间内的成员。
其中成员的位置按分数值递增(从小到大)来排序。
具有相同分数值的成员按字典序(lexicographical order )来排列。
127.0.0.1:6379> ZRANGE zset 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> ZRANGE zset 0 -1 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
ZREVRANGE key start stop [WITHSCORES] 查询有序集中,指定区间内的成员。
其中成员的位置按分数值递减(从大到小)来排列。
具有相同分数值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按分数值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
127.0.0.1:6379> ZRANGEBYSCORE zset 60 70
1) "v1"
2) "v2"
127.0.0.1:6379> ZRANGEBYSCORE zset 60 90 limit 1 2
1) "v2"
2) "v3"
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。
具有相同分数值的成员按字典序的逆序(reverse lexicographical order )排列。
除了成员按分数值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。
ZREM key member [member ...] 查询有序集中的一个或多个成员,不存在的成员将被忽略。
127.0.0.1:6379> ZRANGE zset 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> ZREM zset v2
(integer) 1
127.0.0.1:6379> ZRANGE zset 0 -1
1) "v1"
2) "v3"
ZCARD key 计算集合中元素的数量。
ZCOUNT key min max 计算有序集合中指定分数区间的成员数量。
ZSCORE key member 查询有序集中,成员的分数值。
ZRANK key member 查询有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。
ZREVRANK key member 查询有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。
排名以 0 为底,也就是说, 分数值最大的成员排名为 0 。
使用 ZRANK 命令可以获得成员按分数值递增(从小到大)排列的排名。
3、Redis持久化
3.1、RDB(Redis DataBase)
RDB默认开启的。
在指定时间间隔内将内存中的数据集快照写入磁盘。
Snapshot快照:恢复时是将快照文件直接读到内存。
写时复制技术:不工作的情况不会占用内存,需要持久化时才会占用内存。
优点
压缩格式,数据恢复速度快。
缺点
不实时,可能会丢失数据,操作比较重量(占用内存)。
恢复
Redis重启会自动加载dump.rdb进行写入磁盘。
3.2、AOF(Append Only File)
AOF默认关闭的。
以日志的行事记录没歌操作。
将Redis执行过的所有写操作进行记录(读操作不记录)。
优势
每秒进行同步:appendfsync always
同步持久化 每次发生数据变更立即写入磁盘,性能较低但数据完整性较好。
每次修改同步:appendfsync everysec
异步操作,每秒进行写入,如果一秒内宕机,有数据丢失。
缺点
相同的数据aof文件大于rdb文件,恢复速度慢。
恢复
Redis重启会根据日志文件的内容将写操作从前到后执行一次来恢复数据。
AOF是采用文件最佳方式,文件会越来越大。
重写机制,当AOF文件超过设定的阈值时,会启动AOF文件内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof。
3.3、RDB和AOF同时存在优先找AOF文件恢复数据
p20