Redis数据库介绍
1 Redis简介
Redis,全称远程字典服务(REmote DIctionary Server),是一个开源、基于内存、高性能、可数据持久化的key-value存储系统,遵守BSD协议,可用作数据库、缓存和消息中间件。
在Redis中文官网上是这么描述的:
redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets的范围查询,bitmaps,hyperloglogs 和地理空间geospatial索引半径查询。Redis内置了复制replication,LUA脚本Lua scripting,LRU驱动事件LRU eviction,事务transactions和不同级别的磁盘持久化persistence,并通过 Redis哨兵Sentinel和自动分区Cluster提供高可用性high availability。
在日常应用中,Redis主要适用于以下几个场景:
(1)缓存
(2)排行榜
(3)计数器
(4)分布式会话
(5)分布式锁
(6)社交网络
(7)最新列表
(8)消息系统
2 Redis的基本特性
Redis具有许多优秀特性,包括:支持多种数据类型、支持数据的持久化机制、支持事务控制、支持主从复制功能等。
2.1 数据类型
Redis的数据存储是通过Key映射Value的方式,建立字典以保存数据。Redis共支持五种数据类型。
(1)String(字符串)
Redis最基本的类型,一个key对应一个value。
(2)Hash(哈希表)
键值对集合,是一个string类型的数据域field和值value的映射表。
(3)List(列表)
字符串列表,按照插入顺序排序。支持在列表的头部或者尾部添加数据元素。
(4)Set(集合)
字符串类型的无序集合,支持添加、删除、查找,Redis还能对set进行交集、并集、差集等集合操作。
(5)Zset(有序集合)
字符串类型的有序集合,集合中的每个元素都会关联一个double类型的分数。Redis通过这个分数为集合进行排序。
2.2 数据的持久化机制
Redis支持持久化,在运行情况下,Redis以数据结构的形式将数据维持在内存中,通过将内存中的数据保持到磁盘,让这些数据在Redis重启之后可用来持久化。Redis分别提供了两种持久化模方式。
(1)RDB方式
即Snapshotting(快照)方式,是Redis默认的持久化方式。在Redis运行时,每隔几分钟或者几次操作后,RDB程序将内存中的数据以快照的方式保存到磁盘二进制文件dump.rdb中。在Redis重启时,RDB程序通过载入RDB文件的方式做快照持久化。RDB的配置信息保存在reedis.conf文件中。
RDB快照实现的数据持久化方式,存在的问题是:当在RDB程序保存数据的指定间隔之间,Redis断开连接,那么在上一次保存到此刻的数据就无法被保存。因此,为了解决这个问题,Redis还提供了AOF的持久化。
下面是RDB的默认配置(redis.conf)
save 900 1 # 900秒内如果超过1个key被修改,进行快照
save 300 10
save 60 10000
(2)AOF方式
AOF以协议文本的方式,在使用AOF持久化时,Redis会将所有对数据库进行的命令(及其参数)写入到AOF日志文件appendonly.aof中,以此达到记录数据库状态的目的,当Redis重启时,就会通过执行AOF日志记录的命令进行数据的快速恢复。
Redis还设计了AOF重写机制:扫描数据库数据,转化为Redis命令存入临时AOF文件中,在扫描完成后用临时文件代替AOF文件。这使得AOF文件中记录的命令是最简洁的,在一定程度上避免了AOF随着时间的增长,占据磁盘的过多空间。
下面是默认的aof配置(redis.conf)
appendonly no # 是否启动aof持久化方式
appendfilename "appendonly.aof" #aof 文件名称
\# appendfsync always \# 每收到命令就写一次
appendfsync everysec \# 每秒钟写一次
\# appendfsync no # 完全依赖os
2.3 事务控制
Redis事务的本质是一组命令的集合。在事务执行过程,队列中的命令会按照顺序串行化执行,此时,其他命令请求都不会插入到事务执行序列中。Redis可以通过MULTI/EXEC支持简单的事务控制:当客户端使用MULTI命令时,这个连接将会进入一个事务上下文,连接后续的命令都会放在事务队列中。当连接收到exec命令时,Redis将顺序地执行事务队列中的所有命令。
2.4 主从复制
主从复制就是使当前的服务器复制指定服务器的内容。被复制的服务器称为主服务器(master),对主服务器进行复制操作的服务器称为从服务器(slave)。
Redis通过修改redis.conf文件来使用和配置主从复制,复制过程上大体分为建立连接、数据同步、命令传播三个阶段。Redis主从复制功能强大,一个master支持多个slave连接,slave支持其他slave的连接,主从复制时,不会阻塞master和slave。
利用Redis主从复制的特效,可以实现以下功能:实现读写分离,比如用主服务器写数据,用从服务器读;支持备份数据分离,利用主从复制的方便,用slave服务器的一个或两个服务器来进行数据备份。
下面是默认的Master-Slave replication配置(redis.conf)
\# slaveof <masterip> <masterport> # 当前节点是slave时配置
slave-serve-stale-data yes # master失去联系时,slave是否会反馈客户端的请求
slave-read-only yes # salve实例是否接受写操作
slave-priority 100 # slave的优先级
3 Redis安装与使用
3.1 安装Redis
(1)从官网下载redis安装包
(2)解压到文件
(3)启动cmd,切换到redis目录,输入命令 redis-server redis.windows.conf
输入之后,会显示如下界面:
(4)另启一个 cmd 窗口,切换目录,输入命令 redis-cli.exe -h 127.0.0.1 -p 6379
这里的-h表示redis的bind的ip地址,-p指端口,输入之后显示:
(5)开始使用redis
设置键值对 set akey am
取出键值对 get akey
3.2 在Spring中使用Redis
工具:Redis Desktop Manager
(1)导入redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
(2)配置文件配置redis和连接池的信息
spring:
redis:
host: localhost
port: 6379
# password: root # 根据需要
# 连接超时时间(毫秒)
timeout: 10000
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
database: 0
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制) 默认 8
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-wait: -1
# 连接池中的最大空闲连接 默认 8
max-idle: 8
# 连接池中的最小空闲连接 默认 0
min-idle: 0
(3)RedisTemplate配置
public class RedisCacheAutoConfiguration {
@Bean
public RedisTemplate<String, Serializable>
redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){
RedisTemplate<String, Serializable> template = new RedisTemplate<>();
//设置key序列化方式,StringRedisSerializer的序列化方式
template.setKeySerializer(new StringRedisSerializer());
//设置value序列化方式,序列化为json
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//设置连接池
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
(4)使用Redis
声明RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
Redis操作代码
String akey = "akey";
if(redisTemplate.hasKey(akey)){
redisTemplate.delete(akey);
}
redisTemplate.opsForValue().set(key, "am");
Object value = redisTemplate.opsForValue().get(akey);
启动redis服务端,启动可视化工具并连接到redis
3.3 Redis操作命令
(1)对value操作的命令
(2)对String操作的命令
(3)对List操作的命令
(4)对Set操作的命令
(5)对Zset操作的命令
(6)对Hash操作的命令
(7)持久化操作命令
(8)远程服务控制命令
详见:Redis中文官网命令手册
4 Redis与中间件
Redis中文官网的首页这么写到
—— Redis可以用作数据库、缓存和消息中间件。
4.1 中间件
百度百科是这么定义中间件的:
中间件是介于应用系统和系统软件之间一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统各个部分或不同应用,达到资源、功能共享的目的。
中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。
使用中间件,我们能够达到的效果是:使用这项服务的人,不需要知道底层逻辑的具体实现,就可以直接拿着中间件的结果来用。
显然,Redis属于中间件。
4.2 Redis消息中间件
消息中间件关注于数据的发送和接受,利用高效可靠的异步消息传递机制进行平台无关的数据交流,并基于数据通信集成分布式系统。
Redis消息队列通常采用广播发布及订阅模式:基于Redis的Pub/Sub机制,此模式允许生产者只生产一次消息,由中间件负责将消息复制到多个消息队列,每个消息队列由对应的消费组消费。订阅者可以通过subscribe向redis server订阅自己感兴趣的消息类型。redis将信息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该消息类型的全部订阅者都会收到此消息。
Redis的Pub/Sub实现:
(1)启动Redis服务器
(2)启动客户端,订阅am频道
(3)启动另一客户端,向服务器推送am频道的信息
此时,订阅了am频道的客户端接收到了信息
5 参考
[1] 马豫星. Redis数据库特性分析[J]. 物联网技术, 2015(3):105-106.
[2] 曾超宇,李金香. Redis在高速缓存系统中的应用[J]. 微型机与应用, 2013, 32(12):11-13.
[3] 杨雪婵.针对Redis主从复制[J]. 网络安全和信息化. 2017(03)
[4] Xhan. Redis学习笔记之持久化[EP/OL]. 2011-02-07.