springboot+hibernate+springmvc+mysql+redis

这里跟大家分享一个ssh集成redis的小案例,本人在这上面吃了不少苦头啊,希望我们程序同胞们能少走弯路啊!很简单,看下面demo

在pom文件中加入redis相关的jar包和依赖项:

​
 <parent>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.4.RELEASE</version>
	<relativePath /> 
</parent>
<dependencys>
<dependency>
<artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </exclusion>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
</dependencys>

​

application.properties文件中reids配置项,也有的使用yml文件设置的,其实两种文件设置的东西是一样的:


spring.redis.database=0//redis默认为第0个数据库
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=//密码一般没有
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=50

然后是redis的config文件配置,我们在这里采用的是类文件方式,我在学校的时候是用的xml文件的方式,个人觉得xml简单一些:

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
	/**
    * 注入 RedisConnectionFactory
    */
   @Autowired
   RedisConnectionFactory redisConnectionFactory;

   /**
    * 实例化 RedisTemplate 对象
    *
    * @return
    */
   @Bean
   public RedisTemplate<String, Object> functionDomainRedisTemplate() {
       RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
       initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
       return redisTemplate;
   }

   /**
    * 设置数据存入 redis 的序列化方式
    *
    * @param redisTemplate
    * @param factory
    */
   private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
       //定义key生成策略
       redisTemplate.setKeySerializer(new StringRedisSerializer());
       redisTemplate.setHashKeySerializer(new StringRedisSerializer());
       redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
       redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
       redisTemplate.setConnectionFactory(factory);
   }

   /**
    * 缓存管理器
    * @param redisTemplate
    * @return
    *//*
   @Bean
   public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {
          CacheManager cacheManager = new RedisCacheManager(redisTemplate);
          return cacheManager;
   }
*/
   /**
    * 实例化 HashOperations 对象,可以使用 Hash 类型操作
    *
    * @param redisTemplate
    * @return
    */
   @Bean
   public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
       return redisTemplate.opsForHash();
   }

   /**
    * 实例化 ValueOperations 对象,可以使用 String 操作
    *
    * @param redisTemplate
    * @return
    */
   @Bean
   public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
       return redisTemplate.opsForValue();
   }

   /**
    * 实例化 ListOperations 对象,可以使用 List 操作
    *
    * @param redisTemplate
    * @return
    */
   @Bean
   public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
       return redisTemplate.opsForList();
   }

   /**
    * 实例化 SetOperations 对象,可以使用 Set 操作
    *
    * @param redisTemplate
    * @return
    */
   @Bean
   public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
       return redisTemplate.opsForSet();
   }

   /**
    * 实例化 ZSetOperations 对象,可以使用 ZSet 操作
    *
    * @param redisTemplate
    * @return
    */
   @Bean
   public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
       return redisTemplate.opsForZSet();
   }
}

实体类  注解标注@Entity @Table(name="你的实体表名"):

@Entity
@Table(name="camerainfo")
public class CameraInfo implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	private String id;
	
	private String name;
	private String imagsa_ip;
	private String remark;
	
	private String redisKey;//redis中的key
	public String getRedisKey() {
        return redisKey;
    }

    public void setRedisKey(String keyStr) {
        this.redisKey = "user_"+keyStr;
    }
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getImagsa_ip() {
		return imagsa_ip;
	}

	public void setImagsa_ip(String imagsa_ip) {
		this.imagsa_ip = imagsa_ip;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	public CameraInfo(String id, String name, String imagsa_ip, String remark) {
		super();
		this.id = id;
		this.name = name;
		this.imagsa_ip = imagsa_ip;
		this.remark = remark;
	}

	public CameraInfo() {
		super();
	}

	@Override
	public String toString() {
		return "CameraInfo [id=" + id + ", name=" + name + ", imagsa_ip=" + imagsa_ip + ", remark=" + remark + "]";
	}


	
}

redis服务类 用注解@Service标注:


@Service
public abstract class RedisServer<T> {

    /**
     * 实例化 RedisTemplate对象
     */
    @Autowired
    protected RedisTemplate<String, Object> redisTemplate;

    /**
     * 定义Hash结构 操作存储实体对象
     */
    @Resource
    protected HashOperations<String, String, T> hashOperations;

    /**
     * 定义Hash表的redis key名称
     *
     * @return
     */
    protected abstract String getRedisKey();

    /**
     * 在相应Hash表中添加键值对 key:Object(doamin)
     *
     * @param key    key
     * @param doamin 对象
     * @param expire 过期时间(单位:秒),传入 -1 时表示不设置过期时间
     */
    public void put(String key, T doamin, long expire) {
        hashOperations.put(getRedisKey(), key, doamin);
        if (expire != -1) {
            redisTemplate.expire(getRedisKey(), expire, TimeUnit.SECONDS);
        }
    }

    /**
     * 在相应Hash表中删除key名称的元素
     *
     * @param key 传入key的名称
     */
    public void remove(String key) {
        hashOperations.delete(getRedisKey(), key);
    }

    /**
     * 在相应Hash表中查询key名称的元素
     *
     * @param key 查询的key
     * @return
     */
    public T get(String key) {
        return hashOperations.get(getRedisKey(), key);
    }

    /**
     * 获取在相应Hash表下的所有实体对象
     *
     * @return
     */
    public List<T> getAll() {
        return hashOperations.values(getRedisKey());
    }

    /**
     * 查询在相应Hash表下的所有key名称
     *
     * @return
     */
    public Set<String> getKeys() {
        return hashOperations.keys(getRedisKey());
    }

    /**
     * 判断在相应Hash表下key是否存在
     *
     * @param key 传入key的名称
     * @return
     */
    public boolean isKeyExists(String key) {
        return hashOperations.hasKey(getRedisKey(), key);
    }

    /**
     * 查询相应Hash表的缓存数量
     *
     * @return
     */
    public long count() {
        return hashOperations.size(getRedisKey());
    }

    /**
     * 清空相应Hash表的所有缓存
     */
    public void empty() {
        Set<String> set = hashOperations.keys(getRedisKey());
        set.stream().forEach(key -> hashOperations.delete(getRedisKey(), key));
    }
}

 

重点来了redis增删盖查:

​
    //这里用@Autowired也是可以的
    @Resource
	private CameraInfoDao cameraInfoDao;
	
	@Resource
	private UserRedisimple userRedisimple;
	
	public CameraInfoManagerImpl(CameraInfoDao CameraInfoDao) {
		super(CameraInfoDao);
	}


    //修改添加
	@Override
	@CacheEvict( value="userCache", allEntries=true)
	public void saveTest(CameraInfo cameraInfo) {
		cameraInfoDao.save(cameraInfo);
		 if(cameraInfo.getRedisKey()==null||"".equals(cameraInfo.getRedisKey().trim())){
			 cameraInfo.setRedisKey(cameraInfo.getId().toString());
			 cameraInfoDao.save(cameraInfo);
	        }
	        userRedisimple.put(cameraInfo.getRedisKey(), cameraInfo, -1);
	}

    //删除
	@Override
	@CacheEvict(value="userCache", allEntries=true)
	public void deleteId(String id) {
		CameraInfo cameraInfo=new CameraInfo();
		cameraInfo.setId(id); 
		cameraInfo.setRedisKey(id);
		userRedisimple.remove(cameraInfo.getRedisKey());
		cameraInfoDao.remove(cameraInfo);
	}
	
    //查询全部
	@Override
	@Cacheable(value="userCache")
	public List<CameraInfo> getAllusers() {
		List<CameraInfo> list=cameraInfoDao.findByHQL("from CameraInfo");
		for(CameraInfo ca:list){
			ca.setRedisKey(ca.getId());
		}
		
		userRedisimple.getAll();
		return list;
	}

​

最后就是我们的启动类了,在启动类上添加注解@EnableCaching:

@Configuration
@EnableCaching
@SpringBootApplication
public class CoreApplication {

	public static void main(String[] args) {
		SpringApplication.run(CoreApplication.class, args);
	}
}

redis我在学习期间常看到的注解有三种:

        @Cacheable:有缓存取缓存,没有则放入缓存

        @Cacheput:有缓存刷新缓存,没有则放入缓存

        @CacheEvit:有缓存则清除,可以指定在执行方法前还是执行方法后

好啦,今天的分享就到这里啦!希望各位指出错误!

学习更多IT知识,加qq群:260292706

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值