要记得关闭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框架内部自动转型。
所以在为参数赋值时,必须严格规范构造方法,否则注入会有问题。
三、案例之缓存实现商品分类
- 修改业务逻辑,首先用户的查询先查询redis缓存。
- 如果无缓存数据,表示第一次查询该数据,则先从数据库中查找
- 找到数据后,将数据通过API转化为Json串,将数据库k-v写入缓存中
- 如果缓存中的数据不为空,则将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串转数组
- 修改业务逻辑,首先用户的查询先查询redis缓存。
- 如果无缓存数据,表示第一次查询该数据,则先从数据库中查找。在数据库中找到数据后,将数据通过API转化为Json串,将数据库k-v写入缓存中
- 如果缓存中的数据不为空,则将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