关于redis:Redis简介-商品缓存案例

30次阅读

共计 4872 个字符,预计需要花费 13 分钟才能阅读完成。

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
  ![image.png](/img/bVcHiTE)

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

正文完
 0