Redis(REmote DIctionary Server)远程字典服务

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
连接过程如下图:

image.png

Redis数据库结构介绍如下图:


image.png

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上浪费过多的时间。


image.png

Redis的应用场景

  • 缓存(数据查询、短连接、新闻内容、商品内容等)
  • 聊天室的在线好友列表
  • 任务队列(秒杀、抢购、12306等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒)
  • 分布式集群架构中的session分离(单点登录)

Redis支持的数据结构及常用命令

Redis支持String(字符串)、List(列表)、Hash(哈希)、Set(集合)、Zset(sorted set:有序集合)五种数据结构。


image.png

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)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容