在项目中使用redis缓存

1.在pom.xml引入依赖:

<!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

2.在入口类Application上边添加注解

@EnableCaching //启用缓存

里边添加配置:
 //实例化 RedisConnectionFactory 对象
    @Bean(name = "jedisConnectionFactory")
    public JedisConnectionFactory connectionFactory() {
        return RedisConfig.connectionFactory(1);
    }

    //  实例化 RedisTemplate 对象
    @Bean(name = "redistemplate")
    public RedisTemplate<Object, Object> functionDomainRedisTemplate(@Qualifier(value = "jedisConnectionFactory") JedisConnectionFactory factory) {
        return RedisConfig.functionDomainRedisTemplate(factory);
    }

    /** 生成key的策略 */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

    //缓存管理器
    @Bean
    public CacheManager cacheManager(@Qualifier(value = "redistemplate") RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //设置缓存过期时间
        cacheManager.setDefaultExpiration(Integer.parseInt(ComDef.RdeisExpireTimeout));
        return cacheManager;
    }
3.在service层的类的方法上边添加对应缓存注解:
@Service
@Transactional
public class GroupService {

    @Autowired
    private GroupInfoMapper groupinfo;

    /**
     * 查询所有角色信息
     */
    @Cacheable(value = "group", key = "'groupinfoAll'+#map")
    public String groupinfoAll(Map map) {
        List<GroupInfo> list = groupinfo.groupinfoAll(map);
        String result = JsonManager.parseListToJson(list);
        return result;
    }

    /**
     * 根据角色id查询角色信息
     */
    @Cacheable(value = "group", key = "'selectGroupInfoById'+#groupid")
    public String selectGroupInfoById(String groupid) {
        List<GroupInfo> list = groupinfo.selectGroupInfoById(groupid);
        String result = JsonManager.parseListToJson(list);
        return result;
    }

    /**
     * 角色的添加和修改
     */
    @CacheEvict(value = "group", key = "'selectGroupInfoById'+#group.groupid")
    public String submitgroupInfo(GroupInfo group) {
        int count = 0;
        if (StringUtil.isEmpty(group.getGroupid())) {
            //判断该角色编号是否存在
            String groupcode=group.getGroupcode();
            if (groupinfo.selectGroupCountByNo(groupcode)!=0){
                return "该编号已存在";
            }
            group.setGroupid(PublicUtil.GetUid());
            count = groupinfo.insertGroupInfo(group);
        } else {
            count = groupinfo.updateGroupInfo(group);
        }
        boolean result = count == 1 ? true : false;
        return String.valueOf(result);
    }

    /**
     * 角色的删除
     */
    @CacheEvict(value = "group", allEntries = true)
    public String deleteGroupInfo(String groupid) {
        int userCount = groupinfo.selectUserRoleCount(groupid);
        if (userCount != 0) {
            return "该角色还有" + userCount + "用户存在";
        }
        if (groupinfo.selectGroupMenuCount(groupid) != 0) {
            if (groupinfo.deleteGroupMenu(groupid) != 1) {
                return "删除角色菜单表失败";
            }
        }
        if (groupinfo.deleteGroupInfo(groupid) != 1) {
            return "删除角色信息表失败";
        }
        return "true";
    }

    /**
     * 分配权限
     *
     * @return
     */
    @CacheEvict(value = "menuinfo", allEntries = true)
    public String distributionAuth(String groupid, String menulist) {
        //删除groupmenu 表中的guoupid 的数据
        groupinfo.deleteGroupMenu(groupid);
        String[] menulists = menulist.split("[,]");
        int length = menulists.length;
        //遍历menulist,将menulist添加到groupmenu中
        for (int i = 0; i < length; i++) {
            HashMap map=new HashMap();
            map.put("groupid",groupid);
            map.put("menuid",menulists[i]);
            if (groupinfo.insertGroupMenu(map)!=1){
                return "更新权限失败";
            }
        }
        return "true";
    }
}

4.运行这个必须在项目启动之前运行。

5.启动项目。

PS:安装

后可以查看缓存信息,如:


缓存的注解说明:

1.使用@CacheEvict注解
@CacheEvict注解表示如果用户查询的数据已经保存在缓存中时则清空缓存,往往用于修改用户数据时使用。
例如下面的例子,如果account=001的用户数据在缓存中已经存在了,就会清空key=001的缓存,如果没有则不做处理。

@CacheEvict
方法执行成功后会从缓存中移除相应数据。
参数: value缓存名、 key缓存键值、 condition满足缓存条件、 unless否决缓存条件、 allEntries是否移除所有数据(设置为true时会移除所有缓存)

@CacheEvict(value = "user", key = "#user.id") // 移除指定key的数据
public User delete(User user) {
users.remove(user);
return user;
}

@CacheEvict(value = "user", allEntries = true) // 移除所有数据
public void deleteAll() {
users.clear();
}

 

2.使用@Cacheable注解
@Cacheable注解主要有两个作用
1)如果用户请求的数据已经被缓存,使用@Cacheable可以直接返回缓存数据
2)如果用户请求的数据没有被缓存,将执行Controller的方法,将查询结果保存在缓存中。例如在下面的例子中,以user.account作为查询缓存的key值。

@Cacheable(value = "user", key = "#id")
public User findById(final Long id) {
System.out.println("cache miss, invoke find by id, id:" + id);
for (User user : users) {
if (user.getId().equals(id)) {
return user;
}
}
return null;
}

 

3.@CachePut
和 @Cacheable 类似,但会把方法的返回值放入缓存中, 主要用于数据新增和修改方法。
@CachePut(value = "user", key = "#user.id")
public User save(User user) {
users.add(user);
return user;
}



posted on 2018-01-22 13:32  SailorMoon  阅读(395)  评论(0编辑  收藏  举报