e3mall项目第六天——Redis内容

今日内容一:Redis的安装

可去我的博客各种服务器安装目录下redis服务器安装

今日内容二:Redis集群的搭建

Redis集群的搭建

今日内容三:Jedis

连接单机版:
需要将jedis的jar包依赖到e3-common工程里面

<!-- Redis客户端 -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
		</dependency>
	/**
	 * 连接单机版
	 */
	@Test
	public void testJedis() {
		// 第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
		Jedis jedis = new Jedis("192.168.25.128",6379);
		// 第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
		String string = jedis.get("hello");
		// 第三步:打印结果。
		System.out.println(string);
		// 第四步:关闭Jedis
		jedis.close();
	}

连接单机版使用连接池:

/**
	 * 连接单机版使用连接池
	 */
	@Test
	public void testJedisPool(){
		// 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口
		JedisPool pool = new JedisPool("192.168.25.128",6379);
		// 第二步:从JedisPool中获得Jedis对象。
		Jedis jedis = pool.getResource();
		// 第三步:使用Jedis操作redis服务器。
		jedis.set("hello1", "xiaoling");
		// 第四步:操作完毕后关闭jedis对象,连接池回收资源。
		System.out.println(jedis.get("hello1"));
		jedis.close();
		// 第五步:关闭JedisPool对象。
		pool.close();
	}

连接集群版

/**
	 * 连接集群版
	 */
	@Test
	public void testJedisCluster(){
		// 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
		Set<HostAndPort> node = new HashSet<>();
		node.add(new HostAndPort("192.168.25.128",7001));
		node.add(new HostAndPort("192.168.25.128",7002));
		node.add(new HostAndPort("192.168.25.128",7003));
		node.add(new HostAndPort("192.168.25.128",7004));
		node.add(new HostAndPort("192.168.25.128",7005));
		node.add(new HostAndPort("192.168.25.128",7006));
		// 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
		JedisCluster jedisCluster = new JedisCluster(node);
		jedisCluster.set("xingning", "xiaoling");
		// 第三步:打印结果
		String string = jedisCluster.get("xingning");
		System.out.println(string);
		// 第四步:系统关闭前,关闭JedisCluster对象。
		jedisCluster.close();
	}

今日内容四:向业务逻辑中添加缓存

接口封装:常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类。

/**
 * 封装了Redis使用的方法
 * <p>Title: JedisClient</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
public interface JedisClient {

	String set(String key, String value);
	String get(String key);
	Boolean exists(String key);
	Long expire(String key, int seconds);
	Long ttl(String key);
	Long incr(String key);
	Long hset(String key, String field, String value);
	String hget(String key, String field);
	Long hdel(String key, String... field);
	Boolean hexists(String key, String field);
	List<String> hvals(String key);
	Long del(String key);
}

单机版实现类:

/**
 * 单机版实现类
 * <p>Title: JedisClientPool</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
public class JedisClientPool implements JedisClient {
	
	private JedisPool jedisPool;

	public JedisPool getJedisPool() {
		return jedisPool;
	}

	public void setJedisPool(JedisPool jedisPool) {
		this.jedisPool = jedisPool;
	}

	@Override
	public String set(String key, String value) {
		Jedis jedis = jedisPool.getResource();
		String result = jedis.set(key, value);
		jedis.close();
		return result;
	}

	@Override
	public String get(String key) {
		Jedis jedis = jedisPool.getResource();
		String result = jedis.get(key);
		jedis.close();
		return result;
	}

	@Override
	public Boolean exists(String key) {
		Jedis jedis = jedisPool.getResource();
		Boolean result = jedis.exists(key);
		jedis.close();
		return result;
	}

	@Override
	public Long expire(String key, int seconds) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.expire(key, seconds);
		jedis.close();
		return result;
	}

	@Override
	public Long ttl(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.ttl(key);
		jedis.close();
		return result;
	}

	@Override
	public Long incr(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.incr(key);
		jedis.close();
		return result;
	}

	@Override
	public Long hset(String key, String field, String value) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.hset(key, field, value);
		jedis.close();
		return result;
	}

	@Override
	public String hget(String key, String field) {
		Jedis jedis = jedisPool.getResource();
		String result = jedis.hget(key, field);
		jedis.close();
		return result;
	}

	@Override
	public Long hdel(String key, String... field) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.hdel(key, field);
		jedis.close();
		return result;
	}

	@Override
	public Boolean hexists(String key, String field) {
		Jedis jedis = jedisPool.getResource();
		Boolean result = jedis.hexists(key, field);
		jedis.close();
		return result;
	}

	@Override
	public List<String> hvals(String key) {
		Jedis jedis = jedisPool.getResource();
		List<String> result = jedis.hvals(key);
		jedis.close();
		return result;
	}

	@Override
	public Long del(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.del(key);
		jedis.close();
		return result;
	}

集群版实现类:

/**
 * 集群版实现类
 * <p>Title: JedisClientCluster</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
public class JedisClientCluster implements JedisClient {
	
	private JedisCluster jedisCluster;
	

	public JedisCluster getJedisCluster() {
		return jedisCluster;
	}

	public void setJedisCluster(JedisCluster jedisCluster) {
		this.jedisCluster = jedisCluster;
	}

	@Override
	public String set(String key, String value) {
		return jedisCluster.set(key, value);
	}

	@Override
	public String get(String key) {
		return jedisCluster.get(key);
	}

	@Override
	public Boolean exists(String key) {
		return jedisCluster.exists(key);
	}

	@Override
	public Long expire(String key, int seconds) {
		return jedisCluster.expire(key, seconds);
	}

	@Override
	public Long ttl(String key) {
		return jedisCluster.ttl(key);
	}

	@Override
	public Long incr(String key) {
		return jedisCluster.incr(key);
	}

	@Override
	public Long hset(String key, String field, String value) {
		return jedisCluster.hset(key, field, value);
	}

	@Override
	public String hget(String key, String field) {
		return jedisCluster.hget(key, field);
	}

	@Override
	public Long hdel(String key, String... field) {
		return jedisCluster.hdel(key, field);
	}

	@Override
	public Boolean hexists(String key, String field) {
		return jedisCluster.hexists(key, field);
	}

	@Override
	public List<String> hvals(String key) {
		return jedisCluster.hvals(key);
	}

	@Override
	public Long del(String key) {
		return jedisCluster.del(key);
	}

单机版和集群版只需要在spring 里面的配置文件打开注释和关闭注释即可,两者只能存在一个,需要独立的创建一个配置文件:applicationContext-redis.xml。配置如下:

     <!-- 连接redis单机版 -->
	<bean id="jedisClientPool" class="cn.e3mall.common.jedis.JedisClientPool">
		<property name="jedisPool" ref="jedisPool"></property>
	</bean>
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
		<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
		<constructor-arg name="port" value="6379"></constructor-arg>
	</bean>
	
	<!-- 连接集群版 -->
	<!-- <bean id="jedisClientCluster" class="cn.e3mall.common.jedis.JedisClientCluster">
		<property name="jedisCluster" ref="jedisCluster"></property>
	</bean>
	<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
		<constructor-arg name="nodes" >
			<set>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
					<constructor-arg name="port" value="7001"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
					<constructor-arg name="port" value="7002"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
					<constructor-arg name="port" value="7003"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
					<constructor-arg name="port" value="7004"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
					<constructor-arg name="port" value="7005"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
					<constructor-arg name="port" value="7006"></constructor-arg>
				</bean>
				
			</set>
		</constructor-arg>
	</bean> -->

.封装代码测试:

/**
	 * 单机版和集群版代码测试
	 * <p>Title: testJedisClient</p>
	 * <p>Description: </p>
	 */
	@Test
	public void testJedisClient(){
		//初始化Spring容器
		ApplicationContext application = new ClassPathXmlApplicationContext(
				"classpath:spring/applicationContext-redis.xml");
		//从容器中获得JedisClient对象
		JedisClient jedisClient = application.getBean(JedisClient.class);
		jedisClient.set("test", "JedisclientTest");
		System.out.println(jedisClient.get("test"));
	}

向业务逻辑中添加缓存:
功能分析:
查询内容列表时添加缓存。
1、查询数据库之前先查询缓存。
2、查询到结果,直接响应结果。
3、查询不到,缓存中没有需要查询数据库。
4、把查询结果添加到缓存中。
5、返回结果。
注意:添加缓存不能影响正常业务逻辑。

/**
	 * 根据内容分类id查询内容列表
	 * <p>Title: getContentListByCid</p>
	 * <p>Description: </p>
	 * @param cid
	 * @return
	 * @see cn.e3mall.content.service.ContentService#getContentListByCid(long)
	 */
	@Override
	public List<TbContent> getContentListByCid(long cid) {
		
		try {
			//查询缓存
			//如果缓存中有直接响应结果
			String json = jedisClient.hget(COUNTENT_LIST, cid + "");
			//判断json不为空,查询缓存 将json转换成list
			if(StringUtils.isNotBlank(json)){
				List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class);
				return list;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		//如果没有查询数据库
		TbContentExample example = new TbContentExample();
		Criteria criteria = example.createCriteria();
		//设置查询条件
		criteria.andCategoryIdEqualTo(cid);
		//执行查询
		List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example);
		//把结果添加到缓存
		try {
			jedisClient.hset(COUNTENT_LIST, cid +""	, JsonUtils.objectToJson(list));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

COUNTENT_LIST代表的是在redis缓存中创建一个key值,不能写死,创建一个配置文件resource.propertoes:
COUNTENT_LIST=COUNTENT_LIST
需要在dao.xml中加载配置文件:

<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath:conf/*.properties" />
@Override
	public E3Result addContent(TbContent content) {
		//将内容数据插入到内容表
		content.setCreated(new Date());
		content.setUpdated(new Date());
		//插入到数据库
		contentMapper.insert(content);
		//缓存同步,删除缓存中对应的数据。
		jedisClient.hdel(COUNTENT_LIST, content.getCategoryId().toString());
		return E3Result.ok();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值