作为一个java小白,最近公司项目中用到了redis缓存,便学习了一下,拿来给大家分享。
这次分享的是redis缓存5种数据类型中的String数据类型。
理论知识在这就不多多介绍啦,直接来最喜欢的代码吧。
自定义缓存工具类:
@Component
public class RedisUtils {
@Autowired
StringRedisTemplate stringRedisTemplate;
/**
* 存储key value 形式数据缓存 不设置缓存过期时间
*
* @param key
* @param value
*/
public void setString(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
/**
* 存储key value 形式数据缓存 设置过期时间
*
* @param key
* @param value
* @param expired
* @param timeUnit
*/
public void setString(String key, String value, Long expired, TimeUnit timeUnit) {
stringRedisTemplate.opsForValue().set(key, value, expired, timeUnit);
}
/**
* 根据key 删除缓存
*
* @param key
*/
public void deleteString(String key) {
stringRedisTemplate.delete(key);
}
/**
* 根据key获取value
*
* @param key
* @return
*/
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(String.valueOf(key));
}
}
public class RedisConsts {
/**
* token
*/
public static final String TOKEN_TEMPLATE = "Token_%s";
/**
* 用户信息
*/
public static final String USER_TEMPLATE = "User_%s";
/**
* 所有用户信息
*/
public static final String USER_LIST = "UserList_%s";
}
如上RedisConsts中可以看到,目前使用redis存储了token、用户信息和所有用户信息,下面介绍如何在项目中使用的。
登陆之后将token和当前登陆的用户信息存储到redis中,部分代码:
//获取redisToken
String redisToken = redisUtils.getString(String.format(RedisConsts.TOKEN_TEMPLATE, puser.getId()));
String token = "";
if (StringUtils.isBlank(redisToken)) {
token = KeyUtils.genUniqueKey();
} else {
token = redisToken;
redisUtils.setString(String.format(RedisConsts.TOKEN_TEMPLATE, puser.getId()), token, expired, TimeUnit.MINUTES);
}
//生成token并保存在Redis中
//将token存储在 Redis 中。键是 TOKEN_用户id, 值是token
redisUtils.setString(String.format(RedisConsts.TOKEN_TEMPLATE, puser.getId()), token, expired, TimeUnit.MINUTES);
//将用户信息存放到redis中,用于common服务调用
String userJson = JSON.toJSONString(puser);
redisUtils.setString(String.format(RedisConsts.USER_TEMPLATE, puser.getId()), userJson, expired, TimeUnit.MINUTES);
缓存所有用户信息,是在服务启动时,将所有用户信息存储到redis中:
@Component
public class RedisCodeCache {
@Autowired
private UserMapper userMapper;
private final Logger logger = LoggerFactory.getLogger(RedisCodeCache.class);
@Autowired
RedisUtils redisUtils;
@PostConstruct
public void init() {
logger.info("服务启动中.....加载缓存");
List puserList = userMapper.findWhetherPhone();
//将所有用户信息存放到redis中,用于common服务调用
String userJson = JSON.toJSONString(puserList);
redisUtils.setString(String.format(RedisConsts.USER_LIST, "userList"), userJson);
logger.info("缓存完成");
}
@PreDestroy
public void destroy() {
System.out.println("系统运行结束");
}
}
存储可以了,那么如何取呢?
取当前登陆的用户信息:
@Override
public R findUser(String userId) {
String userJson = redisUtils.getString(String.format(RedisConsts.USER_TEMPLATE, userId));
if (userJson != null && !"".equals(userJson)) {
ObjectMapper mapper = new ObjectMapper();
try {
Puser user = mapper.readValue(userJson, Puser.class);
return R.ok(user);
} catch (IOException e) {
e.printStackTrace();
return R.error(Status.SC_INTERNAL_ERROR, "失败, 请重试");
}
} else {
return R.error(Status.SC_INTERNAL_ERROR, "用户id不存在或未登录");
}
}
取所有用户信息:
String userList = redisUtils.getString(String.format(RedisConsts.USER_LIST, "userList"));
JavaType javaType = getCollectionType(ArrayList.class, Puser.class);
List puserList = null;
try {
puserList = mapper.readValue(userList, javaType);
} catch (IOException e) {
e.printStackTrace();
}
private static ObjectMapper mapper = new ObjectMapper();
/**
* 获取jackson反序列化泛型
* @param collectionClass
* @param elementClasses
* @return
*/
public JavaType getCollectionType(Class> collectionClass, Class>... elementClasses) {
return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
}
服务启动时缓存所有用户信息,是因为用手机号注册时需要判断该手机号是否已经存在,这种方法可能不好,有什么好的办法欢迎大神评论区指点。