我们常学的数据库是MySQl,Redis,Oracle
其中MySQl,Oracle是关系型数据库,而Redis是就是NoSQl(Not Only SQl),意味“不仅仅是SQL",是一项全新的数据库理念,泛指非关系型的数据库。而Redis就是非关系型数据库
关系型数据库与非关系型数据库的区别
- 1) 关系型数据库特点(Mysql Oracle SqlServer)
- 数据是由一张张的表组成,而且这些表与表之间有关系(一对一,一对多,多对多)
- 数据是存在硬盘上,每次访问时,是将数据从硬盘读取到内存中
- 2)非关系型数据库(NOSQL)特点 (Redis )
- 数据是有一个个的键值对:键 值 键 值
- 数据是存在内存中,在满足需要的时候,也可以将数据存在硬盘上(Redis的持久化)
为什么需要NOSQL?
(1) 所有的关系型数据库,都有三高问题
- 高并发
1秒内访问量 - 高效率
读写速度 - 高扩展
不能随意修改表
NOSQL数据库(Redis)可以全部解决三高问题
(2)案例:12306
Redis的介绍
(1)什么是Redis?
Redis(Remote Dictionary Server ) 远程字典服务,是一个非关系型数据库,非关系型数据库被称为NOSQL数据库
(2)Redis有什么用?
有了redis是否可以不使用Mysql,Oralce?
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的指令-字符串类型***
(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
jedis.properties
maxTotal=30
maxIdle=10
url=localhost
port=6379