1、redis定义
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 三特点:
- 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- 支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- 支持数据的备份,即master-slave模式的数据备份。
概述
此文档介绍Redis数据库与spring boot集成。
Redis简介
- Redis是一个高性能的key-value数据库。
- Redis是由C语言编写,是完全开源免费的。
- Redis性能极高,一般情况下,Redis能读的速度是110000次/s,写的速度是81000次/s。
- Redis支持数据的持久化,可以将内存中的数据保存到磁盘上,也可以将磁盘上的数据读取到内存中。
- Redis支持丰富的数据类型:String(字符串)、List(列表)、Hash(哈希)、Set(集合)、Zset(sorted set:有序集合)。
- Redis的所有操作都是原子性的,要么全部成功,要么全部失败。
- Redis官网地址:https://redis.io/
Redis背景
在互联网项目中往往存在大数据量的需求,比如一些商品抢购的场景,或是访问量瞬间较大的时候,一瞬间成千上万的请求就会到来。这就需要在短时间内完成成千上万次读或者写的操作,对于传统数据库来说,容易使系统宕机,所以这时候NoSQL的出现改变了这个现状,Redis就是NoSQL中的一种。Redis具有以下特性:
- Redis以内存作为数据存储介质,读写数据的效率极高。
- 储存在Redis中的数据是持久化的,断电或重启,数据也不会丢失。
- Redis的存储分为内存存储、磁盘存储和log文件。
- Redis可以从磁盘重新将数据加载到内存中,也可以通过配置文件对其进行配置。
- Redis支持主从模式,可以配置集群,更利于支撑大型的项目。
Redis数据库的连接工具
查看Redis数据库可以采用Redis Desktop软件,下载地址是:https://redisdesktop.com/download
连接过程如下图:
Redis数据库结构介绍如下图:
Redis的设计核心
5.1 Redis的纯内存操作
Redis缓存数据存放在内存中,内存的响应时间一般情况下大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。
5.2 Redis的单线程机制
Redis采用单线程,避免了不必要的上下文切换和竞争条件。
单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求。因为Redis的性能瓶颈在内存的大小和网络的带宽。Redis数据存储在内存,不涉及I/O操作,因此单线程是最快的。
5.3 Redis采用非阻塞I/O多路复用机制
多路I/O复用模型是利用select、poll、epoll可以同时监察多个流的I/O事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里"多路"指的是多个网络连接,"复用"指的是复用同一个线程。加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间。
Redis的应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等)
- 聊天室的在线好友列表
- 任务队列(秒杀、抢购、12306等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
- 分布式集群架构中的session分离(单点登录)
Redis支持的数据结构及常用命令
Redis支持String(字符串)、List(列表)、Hash(哈希)、Set(集合)、Zset(sorted set:有序集合)五种数据结构。
7.1 string(字符串)
- 赋值:set key value
- 取值:get key
- 查询所有的键:keys *
- 自增长:incr key
- 自减:decr key
- 删除键:del key
- 增加指定的值:incrby key num
- 拼接字符串:append key value
7.2 hash(哈希)
- 赋值:hset hash field value
- 取值:hget hash field
- 查询hash中所有的键:hkeys hash
- 查询hash中所有的值:hvals hash
- 查询hash中的键和值:hgetall hash
- 删除hash中的键:hdel hash field
7.3 list(列表)
List允许值重复,有序。
- 从左添加:lpush list val1 val2 val3
- 从右添加:rpush list val1 val2 val3
- 查看:lrange list 0 -1 (0表示开始索引,-1表示查询到最后。)
- 从左取值:lpop list (注意:取出之后,list中就没有这个值了。)
- 从右取值:rpop list (注意:取出之后,list中就没有这个值了。)
- 查看list中元素个数:llen list
7.4 set(集合)
Set不允许值重复,无序。
- 添加:sadd set val1 val2 val3
- 查看:smembers set
- 删除:srem set val1
- 差集:sdiff set1 set2
- 交集:sinter set1 set2
- 并集:sunion set1 set2
7.5 SortedSet(zset有序集合)
有序,不能重复。
- 添加:zadd zset num1 val1 num2 val2 (第一个数为值的排序比重,越大越靠后。)
- 查看:zrange zset 0 -1
- 删除:zrem zset val1
Redis在项目中的使用
8.1 项目框架介绍
项目依赖的JDK版本:1.8
依赖说明:
|
groupId
|
artifactId
|
版本
|
说明
|
|
org.springframework.boot
|
spring-boot-starter-parent
|
2.1.7.RELEASE
|
项目框架springboot版本
|
|
org.springframework.boot
|
spring-data-redis
|
2.1.7.RELEASE
|
SpringBoot整合Redis驱动
|
|
redis.clients
|
jedis
|
2.9.3
|
Redis连接池依赖版本
|
8.2 配置Redis的地址
在application-prod.yml文件中配置Redis的地址信息。
[图片上传失败...(image-90b850-1590482730108)]
8.3 RedisCacheConfig类
说明:RedisCacheConfig类是实现Redis数据库的连接方法,该类从application-prod.yml文件中获取Redis数据库的连接地址。
加了@Bean注解,在项目启动的时候就会自动创建redisTemplate。
[图片上传失败...(image-e1c4b4-1590482730108)]
[图片上传失败...(image-fb06b4-1590482730108)]
在spring容器中创建的名为redisTemplate的Redis数据库操作对象,在使用时可通过Autowired注入。
[图片上传失败...(image-57bd1-1590482730108)]
8.4 RedisBaseUtil类
说明:此类的Redis数据库的操作工具。 。
方法说明(包含常用的查询处理,不足的可以自行添加或自定义类):
(1)expire:输入键和时间,设置缓存的失效时间;
(2)getExpire:根据键,获得缓存失效的时间;
(3)hasKey:判断key是否存在;
(4)del:根据键,删除缓存,可传入多个key;
(5)get、set、incr、decr:string数据结构类型的查看、添加、自增、自减;
(6)hget、hset、hmget、hmset、hdel、hHasKey、hincr、hdecr:hash数据类型的查看、添加、查询所有的key、批量添加、删除、判断key是否存在、自增、自减;
(7)sGet、sHasKey、sSet、sGetSetSize、setRemove、:set数据类型的查看、判断key是否存在、添加、获取set集合的长度、删除;
(8)lGet、lGetListSize、lGetIndex、lSet、lUpdateIndex、lRemove:list数据类型的查看、获得list列表的长度、根据索引获得list列表的值、根据索引更新list列表的值、删除。
展开源码
8.5 RedisRequestDto类
说明:该类用来处理客户端发来的请求参数,可以根据需要自己定义或重写类。
[图片上传失败...(image-687681-1590482730108)]
Redis使用代码示例
对于一些访问比较频繁的,但数据又不经常变化查询,可以将数据放到Redis缓存中。查询的时候先去判断缓存中是否存在,缓存中有则直接查询,缓存中没有则去查数据库,并将查询的结果放到缓存中,减轻服务器的压力。
9.1 启动项目,访问swagger页面。
使用开发工具导入项目后,启动项目。url:http://ip:port/dCustomService/docs.html
参数key为必填项,是要查询的缓存的键。
[图片上传失败...(image-7dc881-1590482730108)]
9.2 controller层实现
DemoRedisApiCotroller类接收客户端发来的请求,交由service层进行处理。
折叠源码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package
[com.hikvision.idatafusion.dcustom.api.controller.demo;](http://bb.corp.hzcominfo.com:8090/pages/com.hikvision.idatafusion.dcustom.api.controller.demo;)
import
[com.hikvision.idatafusion.dcustom.base.common.BaseController;](http://bb.corp.hzcominfo.com:8090/pages/com.hikvision.idatafusion.dcustom.base.common.BaseController;)
import
[com.hikvision.idatafusion.dcustom.base.common.bean.response.CommonResponse;](http://bb.corp.hzcominfo.com:8090/pages/com.hikvision.idatafusion.dcustom.base.common.bean.response.CommonResponse;)
import
[com.hikvision.idatafusion.dcustom.base.constants.Constants;](http://bb.corp.hzcominfo.com:8090/pages/com.hikvision.idatafusion.dcustom.base.constants.Constants;)
import
[com.hikvision.idatafusion.dcustom.datasource.common.bean.dto.atomic.RedisRequestDto;](http://bb.corp.hzcominfo.com:8090/pages/com.hikvision.idatafusion.dcustom.datasource.common.bean.dto.atomic.RedisRequestDto;)
import
[com.hikvision.idatafusion.dcustom.datasource.service.RedisService;](http://bb.corp.hzcominfo.com:8090/pages/com.hikvision.idatafusion.dcustom.datasource.service.RedisService;)
import
[io.swagger.annotations.Api;](http://bb.corp.hzcominfo.com:8090/pages/io.swagger.annotations.Api;)
import
[io.swagger.annotations.ApiOperation;](http://bb.corp.hzcominfo.com:8090/pages/io.swagger.annotations.ApiOperation;)
import
[org.springframework.beans.factory.annotation.Autowired;](http://bb.corp.hzcominfo.com:8090/pages/org.springframework.beans.factory.annotation.Autowired;)
import
[org.springframework.web.bind.annotation.PostMapping;](http://bb.corp.hzcominfo.com:8090/pages/org.springframework.web.bind.annotation.PostMapping;)
import
[javax.validation.Valid;](http://bb.corp.hzcominfo.com:8090/pages/javax.validation.Valid;)
/**
*
*/
@Api``(tags = {``"demo-Redis"``})
public
class
DemoRedisApiCotroller ``extends
BaseController {
@Autowired
private
RedisService redisService;
@ApiOperation``(``"Redis新增数据"``)
@PostMapping``(``"/v3/api/insertRedis"``)
public
CommonResponse insertRedis(``@Valid
RedisRequestDto redisRequestDto){
return
success([Constants.SUCCESS,redisService.insertRedis(redisRequestDto));](http://bb.corp.hzcominfo.com:8090/pages/Constants.SUCCESS,redisService.insertRedis(redisRequestDto));)
}
@ApiOperation``(``"Redis修改数据"``)
@PostMapping``(``"/v3/api/updateRedis"``)
public
CommonResponse updateRedis(``@Valid
RedisRequestDto redisRequestDto){
return
success([Constants.SUCCESS,redisService.updateRedis(redisRequestDto));](http://bb.corp.hzcominfo.com:8090/pages/Constants.SUCCESS,redisService.updateRedis(redisRequestDto));)
}
@ApiOperation``(``"Redis查询数据"``)
@PostMapping``(``"/v3/api/findRedis"``)
public
CommonResponse findRedis(``@Valid
RedisRequestDto redisRequestDto){
return
success([Constants.SUCCESS,redisService.findRedis(redisRequestDto));](http://bb.corp.hzcominfo.com:8090/pages/Constants.SUCCESS,redisService.findRedis(redisRequestDto));)
}
@ApiOperation``(``"Redis删除数据"``)
@PostMapping``(``"/v3/api/deleteRedis"``)
public
CommonResponse deleteRedis(``@Valid
RedisRequestDto redisRequestDto){
return
success([Constants.SUCCESS,redisService.deleteRedis(redisRequestDto));](http://bb.corp.hzcominfo.com:8090/pages/Constants.SUCCESS,redisService.deleteRedis(redisRequestDto));)
}
}
|
9.3 serviceImpl层实现
RedisServiceImpl接收controller层传递过来的请求,采用RedisBaseUtil类进行处理。
展开源码
9.4 测试
以string数据结构类型为例,测试Redis缓存的使用方法
(1)往Redis缓存中添加数据
[图片上传失败...(image-12f564-1590482730108)]
通过Redis Desktop查看Redis缓存中的数据,与新添加的value值一致。
[图片上传失败...(image-9f6aaa-1590482730108)]
(2)从Redis缓存中查询数据
[图片上传失败...(image-d6efff-1590482730108)]
(3)修改Redis缓存中的数据
[图片上传失败...(image-9c994a-1590482730108)]
通过Redis Desktop查看Redis缓存中的数据,与新修改的value值一致。
[图片上传失败...(image-7fb402-1590482730108)]
(4)删除Redis缓存中的数据
[图片上传失败...(image-b35fb7-1590482730108)]
通过Redis Desktop查看Redis缓存中的数据。
[图片上传失败...(image-d49c06-1590482730108)]