我们常学的数据库是MySQl,Redis,Oracle
其中MySQl,Oracle是关系型数据库,而Redis是就是NoSQl(Not Only SQl),意味“不仅仅是SQL",是一项全新的数据库理念,泛指非关系型的数据库。而Redis就是非关系型数据库

关系型数据库与非关系型数据库的区别

  • 1) 关系型数据库特点(Mysql Oracle SqlServer)
  1. 数据是由一张张的表组成,而且这些表与表之间有关系(一对一,一对多,多对多)
  2. 数据是存在硬盘上,每次访问时,是将数据从硬盘读取到内存中
  • 2)非关系型数据库(NOSQL)特点 (Redis )
  1. 数据是有一个个的键值对:键 值 键 值
  2. 数据是存在内存中,在满足需要的时候,也可以将数据存在硬盘上(Redis的持久化)
    为什么需要NOSQL?
    (1) 所有的关系型数据库,都有三高问题
  1. 高并发
    1秒内访问量
  2. 高效率
    读写速度
  3. 高扩展
    不能随意修改表

NOSQL数据库(Redis)可以全部解决三高问题
(2)案例:12306

Redis的介绍

(1)什么是Redis?
Redis(Remote Dictionary Server ) 远程字典服务,是一个非关系型数据库,非关系型数据库被称为NOSQL数据库
(2)Redis有什么用?
有了redis是否可以不使用Mysql,Oralce?
Redis一般用来存储经常访问的,但有不经常改变的数据
在这里插入图片描述

redis 实现订单延迟取消_redis 实现订单延迟取消

》》1:查询redis,没有json数据,就调用CategoryDao,去获取集合List
先返回给CategorySrvice,再转成json存进redis
》》2:第二次起,直接获取redis中的json,将json转成List

Redis数据类型

(1)Redis与Map类比

Redis是以键和值的形式存储数据 Redis可以理解成Map集合

1:键:都是字符串

2:值:有五种数据类型 字符串 json串

字符串(String)!!! 键----值 Map<String,String>

哈希(hash) 大键—小键–值 Map<String,Map<String,String>>

字符串列表(list) 键----值1,值2,值3 Map<String,LinkedList>

字符串集合(set) 键----值1,值2,值3 Map<String,HashSet>

有序字符串集合(sorted set) 键----值1,值2,值3 Map<String,LinkedHashSet>

redis 实现订单延迟取消_数据库_02

Redis的指令-字符串类型***

(1)字符串类型string
(2)指令

set name baoqiang  //添加一个键值对  如果键存在,则修改  set()
 get name           //根据键获取值
 del name           //根据键删除键值对
 mget name age      //根据多个键查看值

Redis的指令-Hash类型

(1)哈希(hash)

hset myhash username haohao  //添加数据
  hset 北京    111     冰冰
  hget myhash username         //根据大键和小键获取值
  hdel myhash username         //根据大键和小键删除值

Redis的指令-Hash类型
(1)哈希(hash)

hset myhash username haohao  //添加数据
  hset 北京    111     冰冰
  hget myhash username         //根据大键和小键获取值
  hdel myhash username         //根据大键和小键删除值

Redis的指令-列表类型List
(1)列表类型list
这里的值可以重复
栈:先进后出
(2)指令

lpush mylist a b c  //压栈 添加数据,键为mylist 值为:a b  c
lpop  mylist        //从左边弹栈  删除操作,删除的顺序和添加的顺序相反
rpop  mylist        //从右边弹栈

Redis的指令-集合类型set

(1)集合类型set
这里的值不能重复

sadd myset a b c  //添加数据
  smembers myset    //获取数据
  srem myset a b    //删除数据

Redis的指令-通用指令

(1)Redis通用指令
所有的数据类型都可以使用的指令

keys *      //查看Redis中所有的键  
  del  myset  //删除指定的键值对
  exists key  //判断键是否存在   0表示不存在,  1表示存在
  type myset  //测试你的键是什么类型

Redis案例实操

(1) 编写CategoryServiceTest

test\java\com\wzx\pack01\TestCategoryService.java

//第一步:测试开发CategoryService
public class TestCategoryService {
    @Test
    public void test01() throws Exception {

        //0: 创建业务类对象
        CategoryService categoryService = new CategoryService();

        //1: 查询分类集合
        List<Category> list = categoryService.queryAll();

        for(Category category:list){
            System.out.println(category);
        }
    }
}

(2)编写javaBean与CategoryDao

src\com\qst\bean\Category.java

在这里插入代码片public class Category {
    private String name;
    private int id;

src\com\qst\Dao\CategoryDao.java

public class CategoryDao {

    public List<Category> findAll() {
        List<Category> list=new ArrayList<>();
        for(int i=0;i<10;i++){
            Category category=new Category(1+i,"种类"+i);
            list.add(category);
        }
        return list;
    }
}

(3)编写CategoryService

src\com\qst\service\CategoryService.java

public class CategoryService {
    CategoryDao dao = new CategoryDao();
    ObjectMapper objectMapper = new ObjectMapper();
    public List<Category> queryList() throws IOException {
        Jedis redis = JedisUtils.getRedis();
        //缓存
        String json = redis.get("list");
        if(json==null){
            List<Category> list=new ArrayList<Category>();
            list=dao.findAll();
            String jsonValue=objectMapper.writeValueAsString(list);
            redis.set("list",jsonValue);
            return list;
        }else{
            List<Category> list=objectMapper.readValue(json,new TypeReference<List<Category>>(){});//将json转成对象   参1 json数据  参2
            return list;
        }

    }
}

(4)解决Servlet显示分类列表

src\com\qst\servlet\Servlet01.java

@WebServlet("/servlet01")
public class Servlet01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        CategoryService categoryService = new CategoryService();

        //1: 查询分类集合
        List<Category> list = categoryService.queryList();
        request.setAttribute("list",list);
        request.getRequestDispatcher("list.jsp").forward(request,response);
    }
}

(5)JedisUtils

src\com\qst\utils\JedisUtils.java

public class JedisUtils {
    private static   JedisPool pool;
    static {//静态代码在项目中,如果被使用只会加载一次
        InputStream inputStream= JedisUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        Properties properties = new Properties();
        try {
            properties.load(inputStream);//将流中的数据读成map
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 1:创建连接池的配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        //设置最大链接数
        config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
        //设置空闲连接数  "3"
        config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
        //2:创建连接池
        pool = new JedisPool(config, properties.getProperty("url"), Integer.parseInt(properties.getProperty("port")));
    }
    public static Jedis getRedis() {
//        3:从连接池中获取一个连接
        Jedis jedis = pool.getResource();//获取一个连接
        return jedis;

    }


    //3:提供释放资源的方法
    public static void close(Jedis jedis){
        if(jedis != null) {
            jedis.close();
        }
    }
}

(6)list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:forEach items="${list}" var="item">
        <div > ${item.name} </div>
    </c:forEach>
</body>
</html>

(7)其他

Lib

redis 实现订单延迟取消_redis 实现订单延迟取消_03

jedis.properties

maxTotal=30
maxIdle=10
url=localhost
port=6379