这篇文章主要介绍了java SpringBoot项目整合Redis的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java SpringBoot项目整合Redis的方法是什么文章都会有所收获,下面我们一起来看看吧.
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库.
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用.
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储.
Redis支持数据的备份,即master-slave模式的数据备份.
丰富的数据类型 ndash; Redis支持二进制案例的?String, List, Hash, Set 及 zset数据类型操作.
原子 ndash; Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行.单个操作是原子性的.多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来.
丰富的特性 ndash; Redis还支持?publish/subscribe, 通知, key 过期等等特性
使用cmd窗口打开Redis
redis-server.exe?redis.windows.conf?#加载配置文件启动
注:启动之后,不要关闭窗口,关闭窗口服务停止!
库相关指令:
flushdb?清空当前库 flushall?清空所有库 select?1?切换库
key的相关指令
①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)却可以重复.
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
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
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
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 存储 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的方法是什么相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!