缓存之使用redis缓存

作为一个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);
    }

服务启动时缓存所有用户信息,是因为用手机号注册时需要判断该手机号是否已经存在,这种方法可能不好,有什么好的办法欢迎大神评论区指点。

你可能感兴趣的:(缓存,redis,缓存,String)