Redis概述与使用
- 一、Redis简介
- 1.关系数据库瓶颈
- 2.非关系型数据库
- 3.当前数据库应用场景
- 4.Redis简介
- 二、Redis操作
- 1.Redis下载及配置
- (1)下载
- (3)启动
- (4)配置
- 2.String类型操作
- 3.Hash类型操作
- 4.List类型操作
- 5.Set类型操作
- 6.其他操作
- 三、JAVA API Jedis使用
- 1.导入依赖
- 2.创建连接
- 3.使用
- 四、Redis持久化
- 1.RDB持久化
- (1)save方式
- bgsave方式
- (3)save配置自动执行
- (4)RDB特殊启动形式
- 2.AOF持久化
- (1)相关配置
- (2)AOF重写
一、Redis简介
在介绍之前,有一个场景相信大家都经历过,高考查询成绩,在刚公布成绩的时候,很多人登不上去,甚至后面发布了多个网站还是刷新空白,让苦等成绩的我们焦急万分。这一切的主要原因是由于使用人群题量大、并发高,而罪魁祸首确实关系型数据库。下面从关系型数据库弊端说起。
1.关系数据库瓶颈
虽然关系型数据库在数据一致性(事务操作)和数据标准化上有不可取代的优势,但是在高并发的时代仍然有其不可避免的弊端。
1.性能瓶颈:由于利用磁盘存储数据,所以在读取的时候走的是磁盘IO,对性能影响巨大。
2.扩展瓶颈:由于数据关系复杂,想象一下一张表有7、8个外键,这样在查询时不得不关联7、8张表,不仅极大的影响了查询效率而且不利于扩展。
2.非关系型数据库
针对关系型数据库的瓶颈,非关系型数据库(NOSQL)与运而生,他的主要思路为:一是降低磁盘IO次数,越低越好。甚至将数据存在内存中。二是去除数据间关系,越简单越好。
目前NOSQL作为关系型数据库的补充。 广泛应用于海量用户和海量数据前提下的数据处理问题。
3.当前数据库应用场景
我们以电商为例,来看一看他在这里边起到的作用。
第一类,在电商中我们的基础数据一定要存储起来,比如说商品名称,价格,生产厂商,这些都属于基础数据,这些数据放在MySQL数据库。
第二类,我们商品的附加信息,比如说,你买了一个商品评价了一下,这个评价它不属于商品本身。就像你买一个苹果,“这个苹果很好吃”就是评论,但是你能说很好吃是这个商品的属性嘛?不能这么说,那只是一个人对他的评论而已。这一类数据呢,我们放在另外一个地方,我们放到MongoDB。它也可以用来加快我们的访问,他属于NoSQL的一种。
第三,图片内的信息。注意这种信息相对来说比较固定,他有专用的存储区,我们一般用文件系统来存储。至于是不是分布式,要看你的系统的一个整个瓶颈了?如果说你发现你需要做分布式,那就做,不需要的话,一台主机就搞定了。
第四,搜索关键字。为了加快搜索,我们会用到一些技术,有些人可能了解过,像分ES、Lucene、solr都属于搜索技术。那说的这么热闹,我们的电商解决方案中还没出现我们的redis啊!注意第五类信息。
第五,热点信息。访问频度比较高的信息,这种东西的第二特征就是它具有波段性。换句话说他不是稳定的,它具有一个时效性的。那么这类信息放哪儿了,放到我们的redis这个解决方案中来进行存储。
4.Redis简介
概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储。
特征:
(1)数据间没有必然的关联关系;
(2)内部采用单线程机制进行工作;
(3)高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。
(4)多数据类型支持
字符串类型,string list
列表类型,hash set
散列类型,zset/sorted_set
集合类型
有序集合类型
(5)支持持久化,可以进行数据灾难恢复
二、Redis操作
1.Redis下载及配置
(1)下载
下载安装包:
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
解压安装包:
tar –xvf redis-5.0.0.tar.gz
编译(在解压的目录中执行):
make
安装(在解压的目录中执行):
make install
(3)启动
启动服务器——参数启动
redis-server [--port port]
启动服务器——配置文件启动
redis-server config_file_name
启动客户端
redis-cli [-h host] [-p port]
(4)配置
设置服务器以守护进程的方式运行,开启后服务器控制台中将打印服务器运行信息(同日志内容相同)
daemonize yes|no
绑定主机地址,暴露出去的ip,外部只能通过该ip访问redis
bind ip
设置服务器端口
port port
设置服务器文件保存地址
dir path
服务器允许客户端连接最大数量,默认0,表示无限制。当客户端连接到达上限后,Redis会拒绝新的连接
maxclients count
客户端闲置等待最大时长,达到最大值后关闭对应连接。如需关闭该功能,设置为 0
timeout seconds
设置服务器以指定日志记录级别
loglevel debug|verbose|notice|warning
日志记录文件名
logfile filename
注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度。
2.String类型操作
String类型为Redis存储的最简单类型,存储的为字符串格式,最大储存大小为512M。当遇到incr等数字操作时,自动变为数字类型(Long),最大为9223372036854775807。因为Redis操作为单线程运行,所以所有操作都具有原子性,不必担心并发带来的影响。
String类型的基础指令
#添加/修改数据
set key value
#查询数据
get key
#删除数据
del key
#判定性添加数据 及只能对一个key赋予一次值, 第二次赋值失败 若要修改只能用append在value后添加
setnx key value
127.0.0.1:6379> setnx name wlw
(integer) 1
127.0.0.1:6379> get name
"wlw"
127.0.0.1:6379> setnx name wq
(integer) 0
127.0.0.1:6379> append name wq
(integer) 5
#追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value
#添加/修改多个数据
mset k1 v1 k2 v2 k3 v3......
#获取多个数据
mget k1 k2 k3....
#获取数据字符串长度
strlen key
String对于数字的操作
#设置对数的增加操作 具有原子性
incr key
incrby key increment
incrbyfloat key increment
#对于数的减少操作
decr key
decrby key increment
String类型对于时间的操作
#设置key/value的超时时间 可用于有时限的验证码储存
setex key seconds value
psetex key milliseconds value
3.Hash类型操作
value的存储形式为Hash,底层通过Hash表来实现,他存储的不单是一个数据,而是一堆键值对数据,值得注意的是:1.如果field数量较少,存储结构优化为类数组结构。2.如果field数量较多,存储结构使用HashMap结构。3.value只为String类型,不能嵌套其他类型。
基本操作
#添加/修改数据
hset key field value
#查看数据
hget key field
#查看全部数据
hgetall key
#删除数据
hdel key field1 [field2]
#添加/修改多个数据
hmset key field1 value1 field2 value2 .....
#查看多个数据
hmget key field1 field2....
#获取key中field的个数
hlen key
#看field是否存在
hexists key field
数字及其他的操作
#获取hash表(key)中所有字段名或者值
hkeys key
hvals key
#设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
4.List类型操作
List类型为双向链表储存,主要存储顺序数据。
基础操作
#添加/修改数据
lpush key value1 [value2] ……
rpush key value1 [value2] ……
#获取数据
#范围为 0 -1 时为全部遍历
lrange key start stop
lindex key index
llen key
#删除并获取数据
lpop key
rpop key
#指定值移除 count表示移除个数
lrem key count value
时间维度操作
#规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout
5.Set类型操作
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的,由于是hash储存所以他的查询效率很高。
基础操作
#添加数据
sadd key m1 m2 m3....
#获取全部数据
smembers key
#获取集合长度
scard key
#随机获取集合中指定数量数据
srandmember key [count]
#判断集合是否包含指定数据
sismember key member
#删除数据
srem key member1 member2......
#随机获取集中的某个数据并将该数据移除集合
spop key [count]
集合扩展操作
#求两个集合的交、并、差集
sinter key1 [key2 …]
sunion key1 [key2 …]
sdiff key1 [key2 …]
#求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2 …]
sunionstore destination key1 [key2 …]
sdiffstore destination key1 [key2 …]
#将指定数据从原始集合中移动到目标集合中
smove source destination member
6.其他操作
获取命令帮助文档,可以在help用tab建切换查看帮助内容
help [command]
对于key的操作
#删除指定key
del key
#判断key是否存在
exists key
#获取key类型
type key
#改名
rename key newkey
#为key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
#查询key的有效期
ttl key
pttl key
#设置key为永久性
persist key
#查询key
keys pattern
查询模式规则
*匹配任意数量的任意符号 ? 配合一个任意符号 [] 匹配一个指定符号
redis为每个服务提供有16个数据库,编号从0到15 默认使用0号数据库
#切换数据库
select index
#判断连接情况
ping
#移动数据
move key db
#数据总量
dbsize
#数据清除
#数据库域
flushdb
#所有数据库
flushall
三、JAVA API Jedis使用
1.导入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.创建连接
连接池
//最大连接数
int maxTotal = 50;
//初始化连接数
int maxIdel = 10;
//主机ip
String host = "localhost";
//端口号
int port = 6379;
//Jedis连接池配置对象
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(maxTotal);
jpc.setMaxIdle(maxIdel);
//连接池对象
JedisPool jp = new JedisPool(jpc,host,port);
//获取连接
Jedis jedis = jedisPool.getResource();
//释放连接
jedis.close();
普通连接
//1.获取连接对象
Jedis jedis = new Jedis("192.168.40.130",6379);
//2.使用
//3.关闭
jedis.close()
3.使用
指令同Redis客服端这里略过
//2.执行操作
jedis.set("age","39");
四、Redis持久化
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化 。持久化用于防止数据的意外丢失,确保数据安全性。Redis主要两种方式持久化。
第一种:将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据。
第二种:将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,但是丢失率少,关注点在数据的操作过程。
1.RDB持久化
(1)save方式
手动执行一次保存操作
save
save指令相关配置
设置本地数据库文件名,默认值为 dump.rdb,通常设置为dump-端口号.rdb
dbfilename filename
设置存储.rdb文件的路径,通常设置成存储空间较大的目录中,目录名称data
dir path
设置存储至本地数据库时是否压缩数据,默认yes,设置为no,节省 CPU 运行时间,但存储文件变大
rdbcompression yes|no
设置读写文件过程是否进行RDB格式校验,默认yes,设置为no,节约读写10%时间消耗,单存在数据损坏的风险
rdbchecksum yes|no
bgsave方式
后台执行保存任务,及再开一个线程来执行持久化操作。
手动启动后台保存操作,但不是立即执行
bgsave
bgsave指令相关配置
后台存储过程中如果出现错误现象,是否停止保存操作,默认yes
stop-writes-on-bgsave-error yes|no
其 他
dbfilename filename
dir path
rdbcompression yes|no
rdbchecksum yes|no
(3)save配置自动执行
设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化
save second changes
参数
second:监控时间范围
changes:监控key的变化量
范例:
save 900 1
save 300 10
save 60 10000
其他相关配置:
dbfilename filename
dir path
rdbcompression yes|no
rdbchecksum yes|no
stop-writes-on-bgsave-error yes|no
(4)RDB特殊启动形式
服务器运行过程中重启
debug reload
关闭服务器时指定保存数据
shutdown save
2.AOF持久化
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的。与RDB相比可以简单理解为由记录数据改为记录数据产生的变化
AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式
(1)相关配置
启动AOF相关配置**
开启AOF持久化功能,默认no,即不开启状态
appendonly yes|no
AOF持久化文件名,默认文件名为appendonly.aof,建议配置为appendonly-端口号.aof
appendfilename filename
AOF持久化文件保存路径,与RDB持久化文件保持一致即可
dir
AOF写数据策略,默认为everysec
appendfsync always|everysec|no
AOF写数据三种策略(appendfsync)
- always(每次):每次写入操作均同步到AOF文件中数据零误差,性能较低,不建议使用。
- everysec(每秒):每秒将缓冲区中的指令同步到AOF文件中,在系统突然宕机的情况下丢失1秒内的数据 数据准确性较高,性能较高,建议使用,也是默认配置
- no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控
(2)AOF重写
随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重 写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。
AOF重写规则**
- 进程内具有时效性的数据,并且数据已超时将不再写入文件
- 非写入类的无效指令将被忽略,只保留最终数据的写入命令
如del key1、 hdel key2、srem key3、set key4 111、set key4 222等
如select指令虽然不更改数据,但是更改了数据的存储位置,此类命令同样需要记录 - 对同一数据的多条写命令合并为一条命令
如lpushlist1 a、lpush list1 b、lpush list1 c可以转化为:lpush list1 a b c。
为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素
AOF重写方式
- 手动重写
bgrewriteaof
- 自动重写
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage
自动重写触发条件设置
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percent
自动重写触发比对参数( 运行指令info Persistence获取具体信息 )
aof_current_size
aof_base_size