Redis与本地缓存组合使用| 青训营笔记

115 阅读2分钟

开发中经常用到Redis作为缓存,将高频数据放在Redis中能够提高业务性能,降低MySQL等关系型数据库压力,甚至一些系统使用Redis进行数据持久化,Redis松散的文档结构非常适合业务系统开发,在精确查询,数据统计业务有着很大的优势。但是高频数据流处理系统中,Redis的压力也会很大,同时I/0开销才是耗时的主要原因,这时候为了降低Redis读写压力我们可以用到本地缓存,Guava为我们提供了优秀的本地缓存API,包含了过期策略等等,编码难度低,个人非常推荐。 代码示例

```// 伪代码示例 Xx代表你的的业务对象 如User Goods等等\
public class XxLazyCache {\
    @Autowired\
    private RedisTemplate<String, Xx> redisTemplate;\
    \
    @Autowired\
    private XxService xxService;// 你的业务service\
    \
    /**\
     * 查询 通过查询缓存是否存在驱动缓存加载 建议在前置业务保证id对应数据是绝对存在于数据库中的\
     */\
    public Xx getXx(int id) {\
        // 1.查询缓存里面有没有数据\
        Xx xxCache = getXxFromCache(id);\
        if(xxCache != null) {\
            return xxCache;// 卫语句使代码更有利于阅读\
        }\
        // 2.查询数据库获取数据 我们假定到业务这一步,传过来的id都在数据库中有对应数据\
        Xx xx = xxService.getXxById(id);\
        // 3.设置缓存、这一步相当于Redis缓存懒加载,下次再查询此id,则会走缓存\
        setXxFromCache(xx);\
        return xx;\
        }\
    }\
    \
    /**\
     * 对xx数据进行修改或者删除操作 操作数据库成功后 删除缓存\
     * 删除请求 - 删除数据库数据 删除缓存\
     * 修改请求 - 更新数据库数据 删除缓存 下次在查询时候就会从数据库拉取新的数据到缓存中\
     */\
    public void deleteXxFromCache(long id) {\
        String key = "Xx:" + xx.getId();\
        redisTemplate.delete(key);\
    }\
    \
    private void setXxFromCache(Xx xx) {\
        String key = "Xx:" + xx.getId();\
        redisTemplate.opsForValue().set(key, xx);\
    }\
    \
    private Xx getXxFromCache(int id) {\
        // 通过缓存前缀拼装唯一主键作为缓存Key 如Xxx信息 就是Xxx:id\
        String key = "Xx:" + id;\
        return redisTemplate.opsForValue().get(key);\
    }\
    \
}\
// 业务类\
public class XxServie {\
    @Autowired\
    private XxLazyCache xxLazyCache;\
    // 查询数据库\
    public Xx getXxById(long id) {\
        // 省略实现\
        return xx;\
    }\
    \
    public void updateXx(Xx xx) {\
        // 更新MySQL数据 省略\
        // 删除缓存\
        xxLazyCache.deleteXxFromCache(xx.getId());\
    }\
    \
    public void deleteXx(long id) {\
        // 删除MySQL数据 省略\
        // 删除缓存\
        xxLazyCache.deleteXxFromCache(xx.getId());\
    }\
}\
// 实体类\
@Data\
public class Xx {\
    // 业务主键\
    private Long id;\
    // ...省略\
}