Spring Boot2 redis
Posted 福州-司马懿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot2 redis相关的知识,希望对你有一定的参考价值。
redis简介
Redis(Remote Dictionary Server)是一个由Salvatore Sanfilippo编写的,基于key-value的存储系统
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型
与其他 key - value 缓存产品相比的特点
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
与其他 key - value 缓存产品的区别
-
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
-
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis的优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
搭建redis环境
这里使用docker进行搭建,docker run -itd --name redis -p 6379:6379 redis
,它会自动下载redis镜像并启动
使用docker exec -it redis bash
进入redis容器中,进入根目录,使用find . -name "redis*"
查找所有redis工具
可视化工具
推荐两款免费开源的工具 Medis(https://github.com/x2jia/medis)和 AnotherRedisDesktopManager(https://github.com/qishibo/AnotherRedisDesktopManager)
对于Github访问比较慢的朋友,推荐一款浏览器插件 “Github加速”
然后进入下载页面,点击“加速下载”,速度比之前快多了
Medis(69.2MB)
Medis 是一个可视化的 Redis 客户端,基于 Electron、React 和 Redux 平台构建,由很多很棒的 Node.js 模块所组成,特别是 ioredis 和 ssh2。支持全平台(包含 windos,mac,linux)。支持string,hash,list,set,zset类型的字段
AnotherRedisDesktopManager(54.2MB,推荐)
Another Redis DeskTop Manager作为一款基于nodejs开发的免费的Redis可视化管理工具,可以运行在Windows、Linux、Mac平台,而且是开源免费应用。支持string,hash,list,set,zset,stream类型的字段。且界面较为美观新颖。功能较medis也较为全面
CLI命令
获取服务器信息
选择数据库
每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库
SELECT <databaseIndex>
数据库特性
- Redis不支持自定义数据库的名字,每个数据库都以编号命名
- Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问
- 多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。
综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存
存储数据类型
各类型的使用场景
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | — |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库update一个属性一样,只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化回去) | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 最新消息排行等功能(比如朋友圈的时间线);消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 添加、删除、查找的复杂度都是O(1);为集合提供了求交集、并集合、差集等操作 | 共同好友;利用唯一性,统计访问网站的所有独立ip;好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 排行榜;带权重的消息队列 |
string(字符串)
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB
命令格式 | |
---|---|
设置 | SET <key> <value> |
读取 | GET <key> |
获取多个key的值 | MGET <key1> [key2 ...] |
删除 | DEL <key> |
hash(哈希)
Redis hash 是一个键值(key=>value)对的集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。每个 hash 可以存储 232 -1 键值对(40多亿)
操作 | 命令 |
---|---|
删除一个或多个哈希表字段 | HDEL <key> <field1> [<field2>] |
指定字段是否存在 | HEXISTS <key> <field> |
将哈希表key中的字段field的值设置为value | HSET <key> <field> <value> |
获取哈希表中指定字段的值 | HGET <key> <field> |
获取哈希表中指定key的所有字段和值 | HGETALL <key> |
同时将多个field-value设置到哈希表key中 | HMSET <key> <field1> <value1> [<field2> <value2>...] |
获取所有给定字段的值 | HMGET <key> <field1> [<field2> ...] |
只有在字段field不存在时,设置哈希表字段的值 | HSETNX <key> <field> <value> |
获取哈希表中的所有字段 | HKEYS <key> |
获取哈希表中的所有字段 | HVALS <key> |
获取哈希表中的字段数量 | HLEN <key> |
list(列表)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
操作 | 命令 |
---|---|
移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止,超时时间单位为秒 | BLPOP <key> [<key2> ...] <timeout> |
移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止,超时时间单位为秒 | BRPOP <key> [<key2>...] <timeout> |
从列表中弹出一个值,将弹出的元素插入到另一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出的元素为止,超时时间单位为秒 | BRPOPLPUSH <source> <destination> <timeout> |
通过索引获取列表元素(负数为从后往前,超出长度返回nil) | LINDEX <key> <index> |
在列表的元素前或后插入元素 | LINSERT <key> BEFORE|AFTER <povot> <value> |
获取列表长度 | LLEN <key> |
移出病获取列表的第一个元素 | LPOP <key> |
将一个或多个值插入到列表头部 | LPUSH <key> <value1> [<value2> ...] |
将一个值插入到已存在的列表头部 | LPUSHX <key> <value> |
获取列表指定范围内的元素(包含start和stop位置) | LRANGE <key> <start> <stop> |
移除与value相同的元素count个(count大于0表示从头搜索,小于0表示从后往前,0表示全部) | LREM <key> <count> <value> |
通过索引设置列表元素的值 | LSET <key> <index> <value> |
让列表只保留指定区间内的元素,不在区间内的元素全部被删除 | LTRIM <key> <start> <stop> |
移除列表的最后一个元素,返回值为移除的元素 | RPOP <key> |
移除列表的最后一个元素,并将该元素添加到另一个列表并返回 | RPOPLPUSH <source> <destination> |
在列表中添加一个或多个值 | RPUSH <key> <value1> [<value2> ...] |
为已存在的列表添加值 | RPUSHX <key> <value> |
删除 | DEL <key> |
set(集合)
操作 | 命令 |
---|---|
zset(有序集合,sorted set)
有序集合的每个元素都会关联一个 double 类型的分数。redis 通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
操作 | 命令 |
---|---|
编写代码
添加依赖(pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件(application.yml)
spring:
redis:
# Redis数据库索引(默认为0)
database: 0
# Redis服务器地址
host: 114.115.160.23
# Redis服务器连接端口
port: 6379
#Redis服务器连接密码(默认为空)
password:
jedis:
pool:
#连接池最大连接数(使用负值表示没有限制)
max-active: 8
#连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
#连接池中的最大空闲连接
max-idle: 8
#连接池中的最小空闲连接
min-idle: 0
#连接超时时间(毫秒)
timeout: 3000
java代码
以上是关于Spring Boot2 redis的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot2.X 自定义Redis的cacheManager,保存Json格式到Redis