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 # 当前节点是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依赖

org.springframework.boot

spring-boot-starter-data-redis

2.2.1.RELEASE

(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
redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){
RedisTemplate 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.