Day09:Redis常用命令和入门案例【缓存实现商品分类】

要记得关闭linux中的防火墙。

一、常用基本命令

在这里插入图片描述
redis可用标志。ping
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
批量添加
在这里插入图片描述
在这里插入图片描述

二、入门案例前期配置

1、引入jar包
在这里插入图片描述
2、测试字符串

//	测试string类型
	@Test
	public void testString() {
		Jedis jedis = new Jedis("192.168.126.166",6379);
		jedis.set("下午", "每天下午都是那么的困");
		System.out.println("为什么"+jedis.get("下午"));
	}

在这里插入图片描述
测试String类型 IP:端口
如果失败了,考虑两个问题:
1、检查防火墙是否关闭了。
2、检查IP绑定是否注释了 默认绑定本机(Linux) #bind ip
3、保护模式是否关闭 默认值yes 改为no 第80行
4、启动方式不对 应用:redis-server redis.conf

在这里插入图片描述

//	测试Hash值
	@Test
	public void testHash() {
		Jedis jedis = new Jedis("192.168.126.166",6379);
		jedis.hset("student", "name","Zhangsan");
		jedis.hset("student", "sex", "female");
		jedis.hset("student", "age","23");
		Map<String,String> map = jedis.hgetAll("student");
		System.out.println(map);
		
	}

redis读取数据每秒11万,写每秒8.1万

在这里插入图片描述

//	测试list
	@Test
	public void testList() {
		Jedis jedis = new Jedis("192.168.126.166",6379);
		jedis.lpush("list","1,2,3,4,5");
		System.out.println(jedis.rpop("list"));
	}

在这里插入图片描述
在这里插入图片描述
事务提交:

@Test 
	public void testTransaction() {
		Jedis jedis = new Jedis("192.168.126.166",6379);
//		开启事务控制
		Transaction transaction = jedis.multi();
	
//		执行入库操作
		transaction.set("name", "lili");
		transaction.set("age", "32");
		
//		事务提交
		transaction.exec();
//		输出
		System.out.println("事务命令:"+jedis.get("name"));
	}

事务回滚,不保存提交后修改的内容:

//	測試事務命令
	@Test 
	public void testTransaction() {
		Jedis jedis = new Jedis("192.168.126.166",6379);
//		开启事务控制
		Transaction transaction = jedis.multi();
	
//		执行入库操作
		transaction.set("name", "lili"); 回滚前
		transaction.set("name", "回滚后"); //回滚后
		transaction.set("age", "32");
		
//		事务提交
//		transaction.exec();
		
//		事务回滚
		transaction.discard();//事务回滚,不保存提交后修改的操作
		
//		输出
		System.out.println("事务命令:"+jedis.get("name"));
		
	}

在这里插入图片描述
3、添加redis的Porperties配置,并在application-context中引入
在这里插入图片描述

redis.host=192.168.126.166
redis.port=6379

在这里插入图片描述
4、添加application-context-redis.xml
在这里插入图片描述

<!-- spring整合redis:【构造注入】 -->
	<!-- Jedis jedis = new Jedis("192.168.126.166",6379); -->
	<bean id="jedis" class="redis.clients.jedis.Jedis">
		<constructor-arg name="host" value="${redis.host}"/>
		<constructor-arg name="port" value="${redis.port}"/>
	</bean>

关于构造注入的注意事项
1、name属性:代表构造方法中的参数名称
注意事项:在使用构造注入时,程序打包部署时最好添加源码。
2、Index属性:表示下标从0开始。根据参数未知匹配构造方法,源码构造方法就不能重载了。
3、type=“” 属性:表示参数类型,一般默认不写,由spring框架内部自动转型。
所以在为参数赋值时,必须严格规范构造方法,否则注入会有问题。

在这里插入图片描述

三、案例之缓存实现商品分类

  1. 修改业务逻辑,首先用户的查询先查询redis缓存。
  2. 如果无缓存数据,表示第一次查询该数据,则先从数据库中查找
  3. 找到数据后,将数据通过API转化为Json串,将数据库k-v写入缓存中
  4. 如果缓存中的数据不为空,则将Json串转化为Java对象,直接return返回

复习Json

  • object类型
    在这里插入图片描述
    在这里插入图片描述
    表示json语句正确。

  • Array类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 复杂格式
    说明:值(value)可以使双引号括起来的字符串string、数值number、true、false、null、、对象object或者数组array。这些结构可以嵌套。

在这里插入图片描述

{id:1,name:"Tom",hobby:["吃","喝","玩"]}在这里插入图片描述
在这里插入图片描述

{id:1,name:"Tom",hobby:[["吃披萨","吃炸鸡","吃火锅"],"喝",{where:"沙滩",time:"清晨",with:"小伙伴"}]}

在这里插入图片描述
在这里插入图片描述

  • Json与对象的转化
public class TestObejctMapper {

//将对象转化为Json格式的字符串
	@Test
	public void objectToJson() {
		User user = new User();
		user.setName("洗碗工");
		user.setAge(23);
		user.setSex("女孩纸");
		user.setId(007);
		
		ObjectMapper objM = new ObjectMapper();
		try {
			
//			转化时调用对象的get方法,如果没有get方法,就转不成json
			String json = objM.writeValueAsString(user);
			System.out.println(json);
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
//	json转化为对象字符串
	@Test
	public void JsonToObject() throws JsonParseException, JsonMappingException, IOException {
		String json = "{\"id\":6,\"name\":\"植发飞哥\",\"age\":25,\"sex\":\"蓝孩纸\"}";
		ObjectMapper objM = new ObjectMapper();
		User user = objM.readValue(json, User.class);
		System.out.println(user);
	}
}

注意:要给User类添加toString()方法
在这里插入图片描述

//	Json格式转为Array格式
	@Test
	public void JsonToArray() throws IOException {
		ArrayList<User> userList = new ArrayList<User>();
		User user1 = new User();
		user1.setId(5);
		user1.setAge(1);
		user1.setName("小小琪");
		user1.setSex("应该是个男宝宝");
		
		User user2 = new User();
		user2.setId(8);
		user2.setAge(1);
		user2.setName("小小祺");
		user2.setSex("应该是个女宝宝");
		
		userList.add(user1);
		userList.add(user2);
		
		ObjectMapper objM = new ObjectMapper();
		String json = objM.writeValueAsString(userList);
		System.out.println("获取Json串:"+json);
		
//		将复杂格式的json转化为对象List
		List<User> userList2 = objM.readValue(json, userList.getClass());
		System.out.println("获取List对象:"+userList2);
	}

在这里插入图片描述

//	Json格式转为Array格式
	@Test
	public void JsonToArray() throws IOException {
		ArrayList<User> userList = new ArrayList<User>();
		User user1 = new User();
		user1.setId(5);
		user1.setAge(1);
		user1.setName("小小琪");
		user1.setSex("应该是个男宝宝");
		
		User user2 = new User();
		user2.setId(8);
		user2.setAge(1);
		user2.setName("小小祺");
		user2.setSex("应该是个女宝宝");
		
		userList.add(user1);
		userList.add(user2);
		
		ObjectMapper objM = new ObjectMapper();
		String json = objM.writeValueAsString(userList);
		System.out.println("获取Json串:"+json);
		
//		将复杂格式的json转化为对象List
		//List<User> userList2 = objM.readValue(json, userList.getClass());
		//System.out.println("获取List对象:"+userList2);
		
//		将数组转化为List集合
		User[] users = objM.readValue(json, User[].class);
		List<User> userList3 = Arrays.asList(users);
		System.out.println("数组转为List集合:"+userList3);
	}

在这里插入图片描述

通过redis缓存实现信息查询

在这里插入图片描述

.writeValueAsString(user);对象转Json格式字符串
.readValue(json, User.class);Json转对象字符串
.writeValueAsString(userList);获取Json串
.readValue(json, User[].class);Json串转数组
  1. 修改业务逻辑,首先用户的查询先查询redis缓存。
  2. 如果无缓存数据,表示第一次查询该数据,则先从数据库中查找。在数据库中找到数据后,将数据通过API转化为Json串,将数据库k-v写入缓存中
  3. 如果缓存中的数据不为空,则将Json串转化为Java对象,直接return返回

一、修改Controller

在这里插入图片描述

二、service层的修改

public interface ItemCatService {

	List<EasyUITree> findItemCatById(Long parentId);

	//通过redis缓存实现信息查询
	List<EasyUITree> findCacheItemCatById(Long parentId);

}

// 通过redis缓存实现信息查询
	public List<EasyUITree> findCacheItemCatById(Long parentId) {
		// TODO Auto-generated method stub

		List<EasyUITree> treeList = null;

		// 1 查询缓存数据 要保证key不重复,操作的是item_cat对象 拼接parentId
		String key = "ITEM_CAT_" + parentId;
		String resultJson = jedis.get(key);

		try {

			// 2判断缓存数据是否为空
			if (StringUtils.isEmpty(resultJson)) {
				// 如果缓存内容为空,需要查询数据库中的内容 调用已经写好的方法
				//找到数据后,将数据通过API转化为Json串
				treeList = findItemCatById(parentId);
				String jsonData = objectMapper.writeValueAsString(treeList);
				//将数据库k-v写入缓存中
				jedis.set(key, jsonData);
				
				System.out.println("第一次查询数据库");
			} else {
				// 如果缓存中的数据不为空,则将Json串转化为Java对象,直接return返回
				//将json串转为java对象【list
				//先或得到数组 再转为集合
				
				EasyUITree[] trees = objectMapper.readValue(resultJson, EasyUITree[].class);
				treeList = Arrays.asList(trees);
				System.out.println("");
			}

		} catch (Exception e) {
			// TODO: handle exception
		}

		return treeList;
	}

三、测试检验

坑:通过域名无法访问,忘记开启Nginx

查询数据库数据:
在这里插入图片描述
154ms
在这里插入图片描述

查询缓存数据:
在这里插入图片描述
4ms、5ms、7ms
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值