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

一、常用基本命令

redis入门指南李子骅 redis入门案例_User


redis可用标志。ping

redis入门指南李子骅 redis入门案例_User_02


redis入门指南李子骅 redis入门案例_redis入门指南李子骅_03


redis入门指南李子骅 redis入门案例_redis入门指南李子骅_04


批量添加

redis入门指南李子骅 redis入门案例_User_05


redis入门指南李子骅 redis入门案例_User_06

二、入门案例前期配置

1、引入jar包

redis入门指南李子骅 redis入门案例_redis_07


2、测试字符串

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

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_08


测试String类型 IP:端口

如果失败了,考虑两个问题:

1、检查防火墙是否关闭了。

2、检查IP绑定是否注释了 默认绑定本机(Linux) #bind ip 3、保护模式是否关闭 默认值yes 改为no 第80行

4、启动方式不对 应用:redis-server redis.conf

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_09

//	测试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万

redis入门指南李子骅 redis入门案例_json_10

//	测试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"));
	}

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_11


redis入门指南李子骅 redis入门案例_redis_12


事务提交:

@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"));
		
	}

redis入门指南李子骅 redis入门案例_List_13


3、添加redis的Porperties配置,并在application-context中引入

redis入门指南李子骅 redis入门案例_User_14

redis.host=192.168.126.166
redis.port=6379

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_15


4、添加application-context-redis.xml

redis入门指南李子骅 redis入门案例_json_16

<!-- 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框架内部自动转型。
所以在为参数赋值时,必须严格规范构造方法,否则注入会有问题。

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_17

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

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

复习Json

  • object类型
  • redis入门指南李子骅 redis入门案例_redis_18


  • redis入门指南李子骅 redis入门案例_User_19

  • 表示json语句正确。
  • Array类型

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_20


redis入门指南李子骅 redis入门案例_json_21


redis入门指南李子骅 redis入门案例_json_22


redis入门指南李子骅 redis入门案例_User_23

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

redis入门指南李子骅 redis入门案例_User_24

{id:1,name:"Tom",hobby:["吃","喝","玩"]}

redis入门指南李子骅 redis入门案例_User_25


redis入门指南李子骅 redis入门案例_redis_26

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

redis入门指南李子骅 redis入门案例_List_27


redis入门指南李子骅 redis入门案例_List_28

  • 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()方法

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_29

//	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);
	}

redis入门指南李子骅 redis入门案例_json_30

//	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入门指南李子骅 redis入门案例_List_31

通过redis缓存实现信息查询

redis入门指南李子骅 redis入门案例_List_32

.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

redis入门指南李子骅 redis入门案例_redis入门指南李子骅_33

二、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

查询数据库数据:

redis入门指南李子骅 redis入门案例_User_34


154ms

redis入门指南李子骅 redis入门案例_json_35

查询缓存数据:

redis入门指南李子骅 redis入门案例_User_36


4ms、5ms、7ms

redis入门指南李子骅 redis入门案例_List_37