主页:小王叔叔的博客
支持:点赞👍关注✔️收藏💖
一、效果
二、配置
1.配置pom.xml
2.配置spring.xml
3.配置CacheManager
直接配置会提示错误:
new RedisCacheManager(redisTemplate)没有此构造
现在这么写会有报错The constructor RedisCacheManager(RedisTemplate<capture#1-of ?,capture#2-of ?>) is undefined。
这是因为Spring Boot 2.x版本删除了RedisCacheManager这个构造器, 也不可以通过之前的setDefaultExpiration方法设置默认的缓存过期时间等。
通过设置RedisConnectionFactory factory进行解决,最后RedisConfig.java如下:
创建实体类,一定要实现Serializable序列化,因为redis保存对象的时候要求对象是序列化 如:
实体类配置好后,将redis的操作的接口类进行封装后,进行使用:
package ***;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;
@SuppressWarnings("all")
@Service
public class RedisServiceImpl implements RedisService{
@Autowired
private RedisTemplate redisTemplate;
/**
* 写入缓存
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value) {
boolean result = false;
try {
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 写入缓存设置时效时间
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value, Long expireTime) {
boolean result = false;
try {
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 批量删除对应的value
* @param keys
*/
public void remove(final String... keys) {
for (String key : keys) {
remove(key);
}
}
/**
* 批量删除key
* @param pattern
*/
public void removePattern(final String pattern) {
Set<Serializable> keys = redisTemplate.keys(pattern);
if (keys.size() > 0)
redisTemplate.delete(keys);
}
/**
* 删除对应的value
* @param key
*/
public void remove(final String key) {
if (exists(key)) {
redisTemplate.delete(key);
}
}
/**
* 判断缓存中是否有对应的value
* @param key
* @return
*/
public boolean exists(final String key) {
return redisTemplate.hasKey(key);
}
/**
* 读取缓存
* @param key
* @return
*/
public Object get(final String key) {
Object result = null;
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
}
/**
* 哈希 添加
* @param key
* @param hashKey
* @param value
*/
public void hmSet(String key, Object hashKey, Object value){
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
hash.put(key,hashKey,value);
}
/**
* 哈希获取数据
* @param key
* @param hashKey
* @return
*/
public Object hmGet(String key, Object hashKey){
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
return hash.get(key,hashKey);
}
/**
* 列表添加
* @param k
* @param v
*/
public void lPush(String k,Object v){
ListOperations<String, Object> list = redisTemplate.opsForList();
list.rightPush(k,v);
}
/**
* 列表获取
* @param k
* @param l
* @param l1
* @return
*/
public List<Object> lRange(String k, long l, long l1){
ListOperations<String, Object> list = redisTemplate.opsForList();
return list.range(k,l,l1);
}
/**
* 集合添加
* @param key
* @param value
*/
public void add(String key,Object value){
SetOperations<String, Object> set = redisTemplate.opsForSet();
set.add(key,value);
}
/**
* 集合获取
* @param key
* @return
*/
public Set<Object> setMembers(String key){
SetOperations<String, Object> set = redisTemplate.opsForSet();
return set.members(key);
}
/**
* 有序集合添加
* @param key
* @param value
* @param scoure
*/
public void zAdd(String key,Object value,double scoure){
ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
zset.add(key,value,scoure);
}
/**
* 有序集合获取
* @param key
* @param scoure
* @param scoure1
* @return
*/
public Set<Object> rangeByScore(String key,double scoure,double scoure1){
ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
return zset.rangeByScore(key, scoure, scoure1);
}
}
便于redis-key的整理,创建一个key的管理文件,进行将所有要缓存的业务类进行统一管理,如
基本配置就全部完成,可以启动。
所有配置文件在资源中: 【 新建文件夹-redis+springboot+mysql.zip_redis创建文件夹,redis新建文件夹-Redis文档类资源-CSDN下载 】
启动后可能遇见的问题:
1.问题:HostAndPort need to be seperated by ':'.
解决
如上图,添加端口127.0.0.1:6379
扩展:host变成ip:port,集群多个ip和端口用“,”分割,
2.问题:再次启动出现问题:org.springframework.data.redis.core.HashOperations
解决:
原因就是,缺少redis中HashOperationsbean,其实在下面已经提示了,所以在redisconfig中注入bean,并同时在再调用下就可以了,
如上图的*Service.java文件中
访问这个文章【 Consider defining a bean of type 'org.springframework.data.redis.core.HashOperations' 解决办法_csdn-华仔的博客-CSDN博客 】
3.问题:Cannot retrieve initial cluster partitions from initial URIs [RedisURI [host='127.0.0.1', port=6379]]
当前问题说:在配置redis集群时,地址用的是127的IP
解决 :在配置集群时,一定要用IP地址,不要用127/localhost等代替IP
4.问题:Command timed out 连接请求超时
将spring.xml中时间设长一点
三、所用注解解释
四、Springboot 通过redis实现CRUD
4.1存list
Redis中的 ListOperations<String, Object> ---------> 存list
在controller.java中引入RedisTemplate
当前方法执行成功之后,在redis查看工具(原)Redis-【一】Redis的初始,安装及运行和使用 中
进行查看对应的redis-key的值:(可能会出现乱码情况,出现则进行修改RedisConfig.java中的setValueSerializer()的属性)
附 : Springboot 、redis 、 jwt 实现token验证
- Token 为什么要存储到Redis?
- 1.Token 具有时效性,简单来说就是有效期,超过了这个期限Token 就会失效,需要用户重新登录。但是怎么在项目中实现这个时效性,这个时候就用到Redis,Redis天然支持支持设置过期时间以及通过一些第三方提供包的API到达自动续时效果。
- 2.Redis采用NoSQL技术,可以支持每秒十几万此的读/写操作,其性能远超数据库,在请求数量较多的时候,Redis也可以从容应对
- 3.用户登录信息一般不需要长效储存,放在内存中,可以减少数据库的压力;
4.2取list
Redis中的 取出刚存的list ------------------------------>
判断是否存在 redisTemplate.hasKey( Constants.USER_TOKEN_KEY );
存在就取出 redisTemplate.opsForValue().get( Constants.USER_TOKEN_KEY );
4.3比对前台的某个值 和 redis中list的某个值是否相同一样
通过引入 在拦截器中配置redis缓存机制 实现比对redis中值是否相同
以上代码是比对的所需内容,但是在启动项目时,会提示下面错误,
原因:
springboot拦截器是在Bean实例化之前执行的,所以Bean实例无法注入,也就是当我们想获取redis里面key是token的值时,发现redisTemplate没有是空的没有注入进来
解决:
知道拦截器执行在bean实例化前执行的,那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取。
拦截器配置:WebAppConfig.java
过滤器配置:HandlerInterceptor.java
4.4传参调用
在小程序端head中输入要传的参数值:
然后在后台服务器中通过拦截器进行取head中的wx_userOpenId并进行验证是否验证通过
以上是自己在项目中,一遍配置一边整理的,并测试过,可以直接用;
接下来陆续更新redis在springboot中如果实现基本的CRUD,及基本原理功能内容!
遗留问题就是 redis的客户端工具显示的key是乱码,正在解决,有知道的大佬请帮下谢谢了!!!
⚠️注意 ~
💯本期内容就结束了,如果内容有误,麻烦大家评论区指出!
如有疑问❓可以在评论区留言💬或私信留言💬,尽我最大能力🏃♀️帮大家解决👨🏫!
如果我的文章有帮助到您,欢迎关注+点赞✔️鼓励博主🏃,您的鼓励是我分享的动力🏃🏃🏃~
评论(0)