Redis介绍
redis是一个key-value存储系统。它反对存储的value类型绝对更多,包含string(字符串)、list(链表)、set(汇合)、zset(sorted set –有序汇合)和hash(哈希类型)。这些数据类型都反对push/pop、add/remove及取交加并集和差集及更丰盛的操作,而且这些操作都是原子性的。
原子性阐明: Redis的操作是单过程复线程操作,所以没有线程并发性的平安问题. 采纳队列的形式一个一个操作.
Redis常见用法:
1.Redis能够当做缓存应用
2.Redis能够当做数据库应用 验证码
3.Redis能够消息中间件应用 银行转账等
Redis装置
1).解压 Redis安装包
先下载https://redis.io/
下载好压缩包移至LINUX服务器 cd /usr/local/src/
解压
[root@localhost src]# tar -zxvf redis-5.0.4.tar.gz
2). 装置Redis
阐明:在Redis的根目录中执行命令
命令: 1.make
2.make install

3). 批改Redis的配置文件
命令1: 展示行号 :set nu
批改地位1: 正文IP绑定
批改地位2: 敞开保护模式
批改地位3: 开启后盾启动
redis 服务器命令
1.启动命令: redis-server redis.conf
2.检索命令: ps -ef | grep redis
3.进入客户端: redis-cli -p 6379
4.敞开redis: kill -9 PID号 | redis-cli -p 6379 shutdown
Redis入门案例
引入jar包文件
编辑测试API
package com.jt.test;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
public class TestRedis {
/**
* 1.测试redis程序链接是否失常
* 步骤:
* 1.实例化jedis工具API对象(host:port)
* 2.依据实例 操作redis 办法就是命令
*
* 对于链接不通的阐明:
* 1.查看Linux防火墙
* 2.查看Redis配置文件批改项
* 2.1 IP绑定
* 2.2 保护模式
* 2.3 后盾启动
* 3.查看redis启动形式 redis-server redis.conf
* 4.查看IP 端口 及redis是否启动...
*
* */
@Test
public void test01(){
String host = "192.168.126.129";
int port = 6379;
Jedis jedis = new Jedis(host,port);
jedis.set("cgb2006","好好学习 天天向上");
System.out.println(jedis.get("cgb2006"));
//2.练习是否存在key
if(jedis.exists("cgb2006")){
jedis.del("cgb2006");
}else{
jedis.set("cgb2006", "xxxx");
jedis.expire("cgb2006", 100);
}
}
/* 2.需要:
* 1.向Redis中插入数据
* 2.为key设定超时工夫
* 3.线程sleep 3秒
* 4.获取key的剩余时间
*/
@Test
public void test02() throws InterruptedException {
Jedis jedis = new Jedis("192.168.126.129",6379);
/*
* 如果应用Redis 并且须要增加超时工夫时 个别须要满足原子性要求
* 要么同时胜利 要么同时失败
*/
jedis.setex("宝可梦",60,"小火龙");
Thread.sleep(3000);
System.out.println(jedis.ttl("宝可梦"));
/* jedis.set("宝可梦","小火龙");
int a=1/0;//出现异常 程序不会往下执行
jedis.expire("宝可梦",60);
Thread.sleep(3000); System.out.println(jedis.ttl("宝可梦"));*/
}
@Test
public void test03() throws InterruptedException {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.setnx("a","ab");//a存在不做批改 不存在则新建
/*if (jedis.exists("a")) {
System.out.println("key曾经存在");
} else { jedis.set("a", "ac"); }*/ System.out.println(jedis.get("a"));
}
@Test
public void test04() throws InterruptedException {
Jedis jedis = new Jedis("192.168.126.129", 6379);
SetParams setParams=new SetParams();
setParams.nx().ex(10);//加锁操作 并设置超时工夫 秒
String result=jedis.set("b","办法四",setParams);
System.out.println(result);//加锁胜利会返回OK 反 //之null
System.out.println(jedis.get("b"));
Thread.sleep(3000);
System.out.println(jedis.ttl("b"));
jedis.del("b");//解锁操作
}
@Test
public void test05() throws InterruptedException {
Jedis jedis = new Jedis("192.168.126.129", 6379);
//开启事务
Transaction transaction=jedis.multi();
try{
transaction.set("aa","aa");
//提交事务
transaction.exec();
}catch (Exception e){
e.printStackTrace();
//回滚事务
transaction.discard();
}
}
秒杀业务逻辑
SpringBoot整合Redis
编写配置文件
@Configuration
@PropertySource("classpath:/properties/redis.properties")
public class JedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private Integer port;
@Bean
public Jedis jedis(){
return new Jedis(host,port);
}
}
对象与JSON转化
ObjectMapper介绍
入门案例
public class TestObjectMapper {
@Test
public void test01() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(100L).setItemDesc("商品详情");
//对象转化为json
String json=objectMapper.writeValueAsString(itemDesc);
System.out.println(json);
//json转化为对象
ItemDesc itemDesc1=objectMapper.readValue(json,ItemDesc.class);
System.out.println(itemDesc1.getItemDesc());
}
}
编辑对象API
public class ObjectMapperUtil {
private static final ObjectMapper mapper=new ObjectMapper();
//1.将用户传递的数据转化为json
public static String toJson(Object object){
if(object==null) {
throw new RuntimeException("传递的数据为null 请查看");
}
try {
String json = mapper.writeValueAsString(object);
return json ;
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
//要求用户传递什么样的类型,就返回什么样的对象
public static <T> T toObject(String json,Class<T> targer){
if (StringUtils.isEmpty(json)||targer==null) {
throw new RuntimeException("参数不能为空");
}
try {
return mapper.readValue(json, targer);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
商品的缓存实现
@Override
public List<EasyUiTree> findAll(long parentId) {
QueryWrapper<ItemCat>queryWrapper=new QueryWrapper<>();
queryWrapper.eq("parent_id",parentId);
//1.查询数据库一级的记录
List<ItemCat> itemCats = itemCatMapper.selectList(queryWrapper);
//须要把List<ItemCat> 汇合转成 List<EasyUiTree>
List<EasyUiTree> tree=new ArrayList<>();
//1.遍历List<ItemCat> 汇合
for (ItemCat it:itemCats
) {
long id = it.getId();
String name = it.getName();
String state=it.getIsParent()?"closed":"open";
//含参结构
EasyUiTree easyUiTree=new EasyUiTree(id,name,state);
//转换
tree.add(easyUiTree);
}
return tree;
}
@Override
public List<EasyUiTree> findAllCache(Long parentId) {
List<EasyUiTree> treeList =new ArrayList<>();
//定义key
String key="ITEM_CAT_PARENTID::"+parentId;
//检索是否蕴含key
if(jedis.exists(key)){
//数据存在
String json = jedis.get(key);
//串转化为对象
treeList = ObjectMapperUtil.toObject(json, treeList.getClass());
}else {
//数据不存在 查询数据库
treeList=findAll(parentId);
//将数据保留到缓存中
String json = ObjectMapperUtil.toJson(treeList);
jedis.set(key,json);
}
return treeList;
}
发表回复