Login
网站首页 > 文章中心 > 其它

java SpringBoot项目整合Redis的方法是什么

作者:小编 更新时间:2023-09-30 08:33:22 浏览量:265人看过

这篇文章主要介绍了java SpringBoot项目整合Redis的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java SpringBoot项目整合Redis的方法是什么文章都会有所收获,下面我们一起来看看吧.

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库.

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用.

Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储.

Redis支持数据的备份,即master-slave模式的数据备份.

Redis 的优势

丰富的数据类型 ndash; Redis支持二进制案例的?String, List, Hash, Set 及 zset数据类型操作.

原子 ndash; Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行.单个操作是原子性的.多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来.

丰富的特性 ndash; Redis还支持?publish/subscribe, 通知, key 过期等等特性

Redis 安装

java SpringBoot项目整合Redis的方法是什么

java SpringBoot项目整合Redis的方法是什么

使用cmd窗口打开Redis


redis-server.exe?redis.windows.conf?#加载配置文件启动

java SpringBoot项目整合Redis的方法是什么

注:启动之后,不要关闭窗口,关闭窗口服务停止!

java SpringBoot项目整合Redis的方法是什么

库相关指令:


flushdb?清空当前库

flushall?清空所有库

select?1?切换库

key的相关指令

Redis 数据类型

①String(字符串)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value.

string 类型是二进制安全的.意思是 redis 的 string 可以包含任何数据.比如jpg图片或者序列化的对象.

操作指令:

value)对集合.

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象.

Redis 列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边).

操作指令

Redis 的 Set 是 string 类型的无序集合.

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1).

Redis ZSet?和?Set?一样也是?String?类型元素的集合,且不允许重复的成员.

不同的是每个元素都会关联一个?double?类型的分数.Redis?正是通过分数来为集合中的成员进行从小到大的排序.

ZSet?的成员是唯一的,但分数(score)却可以重复.

SpringBoot 操作 Redis

emsp;emsp;spring boot data redis中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是Redistemplate的子类,两个方法基本一致,不同之处主要体现在操作的数据类型不同,RedisTemplate中的两个泛型都是Object,意味着存储的key和value都可以是一个对象,而StringRedisTemplate的两个泛型都是String,意味着StringRedisTemplate的key和value都只能是字符串.

引入依赖


?org.springframework.boot
?spring-boot-starter-data-redis


SpringBoot 配置 Redis

spring:
?redis:
?#?Redis数据库索引(默认为0)
?database:?0
?#?Redis服务器地址
?host:?12⑦0.0.1
?#?Redis服务器连接端口
?port:?6379
?#?Redis服务器连接密码(默认为空)
?password:
?#?连接池最大连接数(使用负值表示没有限制)
?jedis.pool.max-active:?20
?#?连接池最大阻塞等待时间(使用负值表示没有限制)
?jedis.pool.max-wait:?-1
?#?连接池中的最大空闲连接
?jedis.pool.max-idle:?10
?#?连接池中的最小空闲连接
?jedis.pool.min-idle:?0
?#?连接超时时间(毫秒)
?timeout:?1000

RedisTemplate 及其相关方法

emsp;emsp;Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api.RedisTemplate位于spring-data-redis包下.RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅.

redisTemplate.opsForValue(); //操作字符串

redisTemplate.opsForHash(); //操作hash

redisTemplate.opsForList(); //操作list

redisTemplate.opsForSet(); //操作set

redisTemplate.opsForZSet(); //操作有序set

或者:

redistempalate.boundValueOps

redistempalate.boundSetOps

redistempalate.boundListOps

redistempalate.boundHashOps

redistempalate.boundZSetOps

opsForXXX和boundXXXOps的区别:XXX为value的类型,前者获取一个operator,但是没有指定操作的对象(key),可以在一个连接(事务)内操作多个key以及对应的value;后者获取了一个指定操作对象(key)的operator,在一个连接(事务)内只能操作这个key对应的value.

SpringBootTest 实现Redis数据库增删改查

/**
?*?使用RedisTemplate?操作Redis数据的不同数据类型
?*/
@SpringBootTest
public?class?Springbootday03ApplicationTests?{
?@Autowired
?private?RedisTemplate?redisTemplate;

?/**
??*?String?类型数据操作
??*/
?@Test
?public?void?operateString()?{

??//添加值
??redisTemplate.opsForValue().set("str",?"strValue1");

??//添加值?判定是否存在?存在则不添加
??Boolean?aBoolean?=?redisTemplate.opsForValue().setIfAbsent("str",?"strAbsent");
??System.out.println("str设置成功:"?◆?aBoolean);

??//获取值
??String?str?=?redisTemplate.opsForValue().get("str");
??System.out.println("str?=?"?◆?str);

??//更新值
??redisTemplate.opsForValue().set("str",?"strValue2");
??str?=?redisTemplate.opsForValue().get("str");
??System.out.println("newStr?=?"?◆?str);

??//删除值
??Boolean?b?=?redisTemplate.delete("str");
??System.out.println("str删除成功:"?◆?b);

?}

?/**
??*?操作string类型数据?设置过期时间
??*/
?@Test
?public?void?operateString2()?{
??redisTemplate.opsForValue().set("str",?"strTimeout",?10,?TimeUnit.SECONDS);
??//判定值是否存在?不存在则设置值?同时设置过期时间
??Boolean?aBoolean?=?redisTemplate.opsForValue().setIfAbsent("str2",?"strTimeoutAbsent",?20,?TimeUnit.SECONDS);
??System.out.println("setIfAbsent:"?◆?aBoolean);
?}

?/**
??*?操作hash类型数据
??*/
?@Test
?public?void?operateHash()?{
??//添加hash类型数据?key?-?value
??redisTemplate.opsForHash().put("hash",?"username",?"admin");
??//修改hash类型数据
??redisTemplate.opsForHash().put("hash",?"username",?"tom");
??redisTemplate.opsForHash().put("hash",?"password",?"123456");

??//添加hash类型数据?key?-?map
??HashMap?map?=?new?HashMap<>();
??map.put("driverName",?"com.mysql.jdbc.Driver");
??map.put("url",?"jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC");
??redisTemplate.opsForHash().putAll("hash",?map);

??//获取hash类型数据?entries
??Map?hash?=?redisTemplate.opsForHash().entries("hash");
??hash.forEach((key,?value)?->?{
??System.out.println(key?◆?"::"?◆?value);
??});

??//获取所有的key
??Set?keys?=?redisTemplate.opsForHash().keys("hash");
??for?(Object?key?:?keys)?{
??System.out.println("key:"?◆?key);
??}
??//获取所有value
??List?values?=?redisTemplate.opsForHash().values("hash");
??values.forEach(value?->?System.out.println("value:"?◆?value));

??//删除hash类型数据?删除一个?返回删除的个数
??Long?delete?=?redisTemplate.opsForHash().delete("hash",?"username");
??System.out.println("delete?=?"?◆?delete);

??//删除hash类型数据?删除多个?返回删除的个数
??delete?=?redisTemplate.opsForHash().delete("hash",?"username",?"password",?"driverName");
??System.out.println("delete?=?"?◆?delete);

??//删除hash类型数据?删除所有
??Boolean?delHash?=?redisTemplate.delete("hash");
??System.out.println("delHah:"?◆?delHash);

?}

?/**
??*?操作List类型?有序?可重复
??*/
?@Test
?public?void?operateList()?{

??//左压栈
??//?redisTemplate.opsForList().leftPush("list",?"listValue1");
??//?redisTemplate.opsForList().leftPush("list",?"listValue1");
??//?redisTemplate.opsForList().leftPush("list",?"listValue2");
??//?redisTemplate.opsForList().leftPush("list",?"listValue3");

??//右压栈
??redisTemplate.opsForList().rightPush("list",?"listValue0");
??redisTemplate.opsForList().rightPush("list",?"listValue2");
??redisTemplate.opsForList().rightPush("list",?"listValue0");

??//左出栈
??String?list1?=?redisTemplate.opsForList().leftPop("list");
??System.out.println("leftPop?list1?=?"?◆?list1);
??//右出栈
??String?list2?=?redisTemplate.opsForList().rightPop("list");
??System.out.println("rightPop?list2?=?"?◆?list2);

??//获取所有数据
??List?lists?=?redisTemplate.opsForList().range("list",?0,??redisTemplate.opsForList().size("list")?-?1);
??lists.forEach(list?->?System.out.println(list));


??//设置指定位置的数据
??redisTemplate.opsForList().set("list",?0,?"listValue0");
??/**
??*?从存储在键中的列表中删除等于值的元素的第一个计数事件.
??*?count>?0:删除等于从左到右移动的值的第一个元素;
??*?count?set?=?redisTemplate.opsForSet().members("set");
??set.forEach(str?->?{
??System.out.println("str?=?"?◆?str);
??});
?}

?/**
??*?操作?ZSet?有序?不可重复
??*/
?@Test
?public?void?operateZSet()?{
??//存储值
??Boolean?add?=?redisTemplate.opsForZSet().add("zset",?"zsetValue0",?10);
??System.out.println("add?=?"?◆?add);
??System.out.println("add?=?"?◆?add);
??add?=?redisTemplate.opsForZSet().add("zset",?"zsetValue2",?2);
??System.out.println("add?=?"?◆?add);
??//获取值
??//?Boolean?zset?=?redisTemplate.delete("zset");
??//?System.out.println("delete?zset?=?"?◆?zset);
?}
}


Redis工具类的封装

/**
?*?Redis?工具类
?*?@author?mosin
?*?date?2021/11/30
?*?@version?1.0
?*/
@Component
public?final?class?RedisUtil?{

?private?RedisUtil(){};
?@Autowired
?private?RedisTemplate?redisTemplate;

?//设置值
?public?void?setValue(String?key,String?value){
??redisTemplate.opsForValue().set(key,?value);
?}
?//?设置值?同时设置有效时间
?public?void?setValue(String?key,?String?value,?Long?timeOut,?TimeUnit?timeUnit){
??redisTemplate.opsForValue().setIfAbsent(key,?value,?timeOut,?timeUnit);
?}

?//设置值?没有则设置?有则不设置
?public?void?setNx(String?key,String?value){
??redisTemplate.opsForValue().setIfAbsent(key,?value);
?}

?//设置值?没有则设置?同时设置有效时间?有则不设置
?public?void?setNx(String?key,String?value,long?timeOut,TimeUnit?timeUnit){
??redisTemplate.opsForValue().setIfAbsent(key,?value,timeOut,timeUnit);
?}

?//删除值
?public?boolean?del(String?key){
??return?redisTemplate.delete(key);
?}
?
??//获取值
?public?String?getValue(String?key){
??return?redisTemplate.opsForValue().get(key);
?}
}

Redis 业务实践

redis 存储 token,实现非法请求拦截

①编写拦截器

@Component
public?class?AdminInterceptor?implements?HandlerInterceptor?{
?@Autowired
?private?RedisUtil?redisUtil;
?@Override
?public?boolean?preHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)?throws?Exception?{
??System.out.println("拦截器以拦截请求");
??//从请求头中获取token?验证用户是否登录
??String?token?=?request.getHeader("token");
??System.out.println(token);
??String?tokenValue?=?redisUtil.getValue(token);
??System.out.println("tokenValue?=?"?◆?tokenValue);
??if(tokenValue!=null){?//用户已登录?放行请求
??return?true;
??}else{//重定向到登录页面
??response.sendRedirect(request.getContextPath()◆"/login.jsp");
??return?false;
??}
?}
}

@Configuration
public?class?LoginConfig?implements?WebMvcConfigurer?{
?@Autowired
?private?AdminInterceptor?adminInterceptor;
?@Override
?public?void?addInterceptors(InterceptorRegistry?registry)?{
??InterceptorRegistration?registration?=?registry.addInterceptor(adminInterceptor);
??registration.addPathPatterns("/**");
??registration.excludePathPatterns("/user/login","/user/register","/login.jsp");
?}
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public?class?JsonResult?{
?private?Integer?code;
?private?String?msg;
?private?Long?count;
?private?T?data;
}

@Controller
@RequestMapping("/user")
public?class?UserController?{
?@Autowired
?private?UserService?userService;
?@Autowired
?private?RedisUtil?redisUtil;
?@ResponseBody
?@RequestMapping("/login")
?public?Object?login(User?user)?throws?JsonProcessingException?{
??User?usr?=?User.builder().id(1).name("admin").password("123456").build();
??//获取token?放入redis
??String?token?=?UUID.randomUUID().toString().replace("-",?"");
??//将user?转为json格式放入?redis
??ObjectMapper?objectMapper?=?new?ObjectMapper();
??String?s1?=?objectMapper.writeValueAsString(usr);
??//将?token?和用户信息存入?redis
??redisUtil.setValue(token,?s1,?2L,?TimeUnit.MINUTES);
??//将token?存入map集合返回
??HashMap?map?=?new?HashMap<>();
??map.put("token",?token);
??return?map;
?}

?@ResponseBody
?@RequestMapping("/register")
?public?Object?register(User?user){
??HashMap?map?=?new?HashMap<>();
??map.put("msg",?"ok");
??return?map;
?}

?@ResponseBody
?@RequestMapping("/add")
?public?Object?add(User?user){
??HashMap?map?=?new?HashMap<>();
??map.put("msg",?"ok");
??return?map;
?}
}

关于"java SpringBoot项目整合Redis的方法是什么"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"java SpringBoot项目整合Redis的方法是什么"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注***行业资讯频道.

以上就是土嘎嘎小编为大家整理的java SpringBoot项目整合Redis的方法是什么相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章