Redis概述与使用

一、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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值