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的剩余时间  */ @Testpublic 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("宝可梦"));*/ }@Testpublic 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")); }@Testpublic 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");//解锁操作 }@Testpublic 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); }} }

商品的缓存实现

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