SpringBoot集成Redis
Redis简介
官网redis.io有一段定义:
作为数据库,Redis是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与5种不同类型的值(Value)之间的映射(Mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写能性。
作为缓存中间键,Redis支持更多的数据结构和更丰富的数据操作,另外Redis有着丰富的集群方案和使用场景。
数据类型
Redis数据类型不仅与关系数据库管理系统(RDBMS)不同,也不同于任何简单的NoSQL键-值数据存储。受支持的数据类型包括:
- String(字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- Zset(Sorted Set:有序集合)
关键优势
Redis的优势包括它的速度、对富数据类型的支持、操作的原子性,以及通用性:
- 性能极高,它每秒可执行100000个Set以及约100000个Get操作
- 丰富的数据类型,Redis对大多数开发人员啊已知的大多数数据类型提供了原生的支持,这使得各种问题得以轻松解决。
- 原子性因为所有Redis操作都是原子性的,所以多个客户端会并发地访问一个Redis服务器,获取相同的更新值
- 丰富的特性,Redis是一个多效用工具,有非常多的应用场景,包括缓存、消息队列(Redis 原生支持发布/订阅)、短期应用程序数据
Redis基本使用
Windows安装
下载地址:https://github.com/MSOpenTech/redis/releases点这里!
Redis支持32位和64位。这个需要根据你系统平台的实际情况选择,这里我们下载Redis-x64-3.2.100.zip压缩包,解压到D:\Program Files后,将文件夹重新命名为redis即可。
配置
安装后,在不配置Redis的情况下,Redis也可以直接启动,因为有一个默认配置文件。在官方发布的版本一般叫做redis.conf,这个文件中包含了Redis各方面的配置,注意大部分配置行都是英文且以#开头,表示注解,只有不以#开头的行才是生效的配置项,这里只简单介绍下几个配置项:
bind 127.0.0.1 :绑定的主机
port 6379 :端口号
requirepass foobared :请求密码,默认是注释的
启动
打开一个cmd窗口
使用cd命令切换目录到:D:\Program Files \redis 运行 redis.windows.conf
想方便的话,可以把redis路径加到系统环境变量path里,这样就省的再输路径了。
输入之后,显示如下界面,表示服务器启动成功(注意,启动之后cmd窗口不能关闭)
连接
再打开一个cmd
使用cd命令切换目录到 D:\Program Files \redis 运行:
无密码:redis-cli.exe -h 127.0.0.1 -p 6379
有密码:redis-cli.exe -h 127.0.0.1 -p 6379 foobared
输入之后,显示如下界面,表示连接成功:
可视化工具
在开发期间要查看Redis服务器中存储的数据,可以命令启动redis-clli,为了提高开发效率,可以再安装一个很好用的GUI工具:Redis Desktop Manager
下载地址:https://redisdesktop.com/ 点这里!!
在Redis服务器启动的情况下,打开Redis Desktop Manager,点击如下按钮添加一个服务器端的配置信息,进行连接。
然后双击这个服务器端的配置,连接成功就可以看到Redis服务器目前缓存的Key-Value集合了。
Jedis操作Redis
Jedis是Redis官方推荐的Java连接开发工具。
Jedis的基本使用非常简单,只需要创建Jedis对象的时候指定host,port,password即可。
常用方法API
在Jedis库中,Jedis类就代表了与Redis服务器的连接,因此对服务器的操作都是通过它来进行,Redis的各种操作命令在Jedis类中也直接体现为同名的方法。
Jedis对象常用方法API,包括对键操作、字符串操作、整数和浮点数操作、列表操作、集合操作、哈希操作、有序集合操作、排序操作等几大类,可执行查阅:https://blog.csdn.net/asd051377305/article/details/90234620 点这里!!!
基本操作
可在之前原有的JPA项目基础上操作Jedis操作
1.添加jedis依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.编写junit单元测试JedisTester:
@RunWith(SpringRunner.class)
@SpringBootTest
public class JedisTester {
private Jedis jedis;
@Before
public void setup(){
jedis=new Jedis("127.0.0.1",6379);
}
}
操作字符串:
@Test
public void testString(){
jedis.set("name","crm");
System.out.println(jedis.get("name"));
jedis.append("name","lll");
System.out.println(jedis.get("name"));
jedis.del("name");
System.out.println(jedis.get("name"));
jedis.mset("name","hyq","age","18","add","hn");
jedis.incr("age");
System.out.println(jedis.get("name")+"-"+jedis.get("age")+"-"+jedis.get("add"));
}
连接池
在我们实际的使用过程中,不会每次使用时都创建Jedis对象,一般会使用连接池,并提供一个工具类来对外使用。
使用连接池的好处:1、效率更高;2、线程安全
连接池:
public final class RedisPool {
private static String ADDR="192.168.0.100";
private static int PORT=6379;
//private static String AUTH="123456";
private static int MAX_ACTIVE=1024;
private static int MAX_IDLE=200;
private static int MAX_WAIT=10000;
private static int TIEMOUT=10000;
private boolean TEST_ON_BORROW=true;
private static JedisPool jedisPool=null;
/**
* 初始化Redis连接池
*/
static {
try{
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(BaseObjectPoolConfig.DEFAULT_TEST_ON_BORROW);
jedisPool=new JedisPool(config,ADDR,PORT,TIEMOUT);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取Jedis实例
*
* @Return
*/
public synchronized static Jedis getJedis(){
try{
if(jedisPool!=null){
Jedis resource=jedisPool.getResource();
return resource;
}else{
return null;
}
}catch (Exception e){
e.printStackTrace();
return null;
}
}
/**
* 释放Jedis资源
*
* @param jedis
*/
public static void returnResource(final Jedis jedis){
if(jedis!=null){
jedisPool.returnResource(jedis);
}
}
}
工具类:
public class RedisUtil {
/**
* 设置key的有效期,单位是秒
* @param key
* @param exTime
* @return
*/
public static Long expire(String key,int exTime){
Jedis jedis=null;
Long result=null;
try{
jedis= RedisPool.getJedis();
result=jedis.expire(key,exTime);
}catch (Exception e){
e.printStackTrace();
return result;
}finally {
RedisPool.returnResource(jedis);
}
return result;
}
public static String setEx(String key,String value,int exTime){
Jedis jedis=null;
String result=null;
try {
jedis=RedisPool.getJedis();
result=jedis.setex(key,exTime,value);
}catch (Exception e){
e.printStackTrace();
return result;
}finally {
RedisPool.returnResource(jedis);
}
return result;
}
public static String set(String key,String value){
Jedis jedis=null;
String result=null;
try {
jedis=RedisPool.getJedis();
result=jedis.set(key,value);
}catch (Exception e){
e.printStackTrace();
return result;
}finally {
RedisPool.returnResource(jedis);
}
return result;
}
public static String get(String key){
Jedis jedis=null;
String result=null;
try {
jedis=RedisPool.getJedis();
result=jedis.get(key);
}catch (Exception e){
e.printStackTrace();
return result;
}finally {
RedisPool.returnResource(jedis);
}
return result;
}
public static Long del(String key){
Jedis jedis=null;
Long result=null;
try {
jedis=RedisPool.getJedis();
result=jedis.del(key);
}catch (Exception e){
e.printStackTrace();
return result;
}finally {
RedisPool.returnResource(jedis);
}
return result;
}
}
SpringBoot操作Redis
Spring-boot-starter-data-redis
SpringBoot提供了对Redis集成的组件包:spring-boot-starter-data-redis,它依赖于spring-data-redis和lettuce。
- Lettuce:是一个可伸缩线程安全的Redis客户端,多个线程可以共享同一个RedisConnection,它利于优秀Netty NIO框架来高效的管理多个连接。
- Spring Data:是Sprin框架中的一个主要项目,目的是为了简化构建基于Spring框架应用的数据访问,包括非关系数据库、Map-Reduce框架、云数据服务等,另外也包含对关系数据库的访问支持。
- Spring Data Redis :是Spring Data项目中的一个主要模块,实现了对Redis客户端API的高度封装,使对Redis的操作更加便捷。
基本操作
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.application.properties配置相关信息
#redis数据索引
spring.redis.database=0
#redis服务地址
spring.redis.host=localhost
#redis服务器连接端口
spring.redis.port=6379
#连接密码
#spring.redis.password=root
#最大连接数
spring.redis.lettuce.pool.max-active=8
#最大阻塞等待时间
spring.redis.lettuce.pool.max-wait=-1
#最大空闲连接
spring.redis.lettuce.pool.max-idle=8
#最小空闲连接
spring.redis.lettuce.pool.min-idle=0
3.测试使用
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTemplateTester {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private RedisTemplate redisTemplate;
}