回顾
html+css(2天)-->javascript(2天)--->jquery+ajax(2天)--->Vue+ElementUI(2天)
DOM操作:
操作内容:
javascript:
元素对象.innerHTML;
元素对象.value;
jquery:
jquery元素对象.html();
jquery元素对象.val();
Vue:
插值表达式:{{表达式}}、v-html指令
v-model表单数据双向绑定
操作属性:
javascript:
元素对象.setAttribute(name,value);
元素对象.getAttribute(name);
jquery:
jquery元素对象.attr();
设置值:jquery元素对象.attr(name,value);
获取值:jquery元素对象.attr(name);
jquery元素对象.prop(); //一般用于操作checked、selected属性
Vue:
v-bind:属性名 将vue中变量的值绑定到标签的属性中,也可以简写(:属性名)
操作样式:
javascript:
元素对象.style.样式名=样式值;
元素对象.className="class属性值";
jquery:
jquery元素对象.css();
设置值:jquery元素对象.css(name,value);
设置值:jquery元素对象.css({name:value,name:value,...});
Vue:
先使用类选择器写好样式,然后给class属性绑定值
v-bind:属性名 将vue中变量的值绑定到标签的属性中,也可以简写(:属性名)
标签增删改查:
javascript:
推荐使用innerHTML属性
jquery:
推荐使用html()方法
append()
remove()
Vue:
v-for遍历展示数据
事件:
单击事件:
javascript:
方式1:<input type="button" value="新按钮" onclick="fun()"/>
方式2:标签对象.onclick=function(){}
jquery:
标签对象.click(function(){
})
Vue:
第一步:
<input type="button" value="新按钮" @click="fun()"/>
第二步:
methods:{
fun(){
}
}
失去焦点事件:
页面加载完成事件
javascript:
window.onload=function(){}
jquery:
$(function{
})
Vue:利用生命周期方法
new Vue({
created(){
//Vue对象被创建完成了
}
});
内容改变事件:
表单提交事件:必须有一个true或者false的返回值表示允许提交或者阻止提交
ajax异步请求:重点
jquery中的ajax操作:
$.ajax({
url:"", //请求路径
data:"", //请求参数,两种写法
type:"", //请求方式
dataType:"json",//响应回来的数据类型
success:function(resp){ //响应成功要调用的函数,resp表示响应结果
//在成功的函数中需要进行DOM操作:获取标签对象,拼接html代码,添加到标签的内容体中
}
})
$.get(url,data,function(resp){},dataType);
$.post(url,data,function(resp){},dataType);
说明:传递给服务器的参数格式最终都是name=value&name=value...,在后台Servlet中可以使用BeanUtils封装请求参数
Vue和axios异步操作:
axios.get(url?参数).then((resp)=>{
//响应成功要调用的函数,resp封装了响应结果,如果需要获取响应数据,那么就需要resp.data;
})
axios.get(url,{params:参数对象).then((resp)=>{ //params是固定写法
//响应成功要调用的函数,resp封装了响应结果,如果需要获取响应数据,那么就需要resp.data;
})
axios.post(url,拼接参数字符串).then((resp)=>{
//响应成功要调用的函数,resp封装了响应结果,如果需要获取响应数据,那么就需要resp.data;
})
说明:以上三种方式,传递给服务器的参数格式最终都是name=value&name=value...,在后台Servlet中可以使用BeanUtils封装请求参数
axios.post(url,参数对象).then((resp)=>{ //params是固定写法
//响应成功要调用的函数,resp封装了响应结果,如果需要获取响应数据,那么就需要resp.data;
})
注意/特殊点:axios底层会先使用JSON将参数对象转换成json字符串,然后发送给服务器。在服务器端无法使用request.getParameter()等方法获取,也无法使用BeanUtils封装。需要使用jackson中的ObjectMapper中的readValue(request.getReader(),bean类.class)将json转换成Java对象
【第一章】redis入门
学习redis , 以后用的最多的使用场景 就是用来 做缓存, 一般开发过程中,对于 那种 不经常改变的时候, 通常就 会 用redis 来做 缓存 . 从而 提高 效率, 优化 性能 .
redis 是目前市面最重要 的一种 缓存 技术 .
另外一点, 希望 能够 后面 每学 一个 新的技术, 能够 清楚的 定位 这个技术是用来 哪里的 .
https://www.runoob.com/redis/redis-commands.html redis 的 中文 命令文档, 大家 可以 多翻翻 这个文档, 里面 都是中文的, 非常的友好 .
【第二章】数据类型及对应操作
1 数据类型-string基本操作
SET key value 保存一个值 key表示字符串的名称,value表示值
保存复杂的字符串value是使用引号: set msg "hello word"
get key 获取一个值
MSET key value [key value ...] 保存多组值,[]表示可选值
MGET key [key ...] 获取多组值
APPEND key value 在原有的字符串上追加一段内容
strlen key 获取字符串的长度
del key 删除key,对应的value值也就被一起删除了
2 数据类型-hash基本操作
1 存值/修改
语法:hset hash名称 field value; //存一组值
hset user:123 name tom
语法:hmset hash名称 field value field value field value ...; //存一组值
hset user:123 age 20 address wh
2 获取
hget hash名称 field //获取一组值
hmget hash名称 field field field...//获取多组值
hgetAll hash名称 //获取所有的field以及对应的value值
hlen hash名称 //获取hash中存储的数据的长度
hkeys hash名称 //获取hash中存储的所有的key
hvals hash名称 //获取hash中存储的所有的value
3 删除
hdel hash名称 field //删除field对应的value
3 数据类型-list基本操作
LPUSH list名称 value [value ...] 向集合的头部保存一个值 key表示集合名称
LRANGE list名称 start stop lrange list01 0 -1 获取集合中所有的值 正数表示从左往右数,0开始,负数表示从右往左数,-1开始,-1表示最后一个值
LPOP list名称 弹出集合头部元素
LREM list名称 count value 移除指定count个数的value值
LINDEX list名称 index 根据索引获取值
4 数据类型-set基本操作
sadd set名称 value [value ...] //存值
smembers set名称 //取值
sismember set名称 value //是否有该值
srem set名称 value //删除该值
scard set名称 //获取集合的长度
srandmember set名称 [count] //随机取cout个值
补充:给redis设置密码:搜索/requirepass关键字,将注释的密码放开
5 其他操作
5.1 key常用指令
删除指定的key : del username; 删除username
查看所有的key : keys *
查看key对应value的类型: type key
5.1 DB常用指令
select 数据库索引; redis中默认有16个数据库,索引从0-15
flushdb 清空当前数据库中的所有key
flushall 清空所有数据库中的所有key
【第三章】Jedis的使用
/*
目的:将jedis连接池封装到工具类中
这个工具类需要做哪些事?
1 读取配置文件
2 创建jedis连接池对象 连接池对象和配置文件只需要加载一次,可以放到static静态代码块中
3 对外提供一个方法,从连接池中获取连接返回
4 对外提供一个方法,释放资源
注意:1 需要讲redis.conf配置文件中的bind 127.0.0.1 注释掉。2 给redis添加访问密码,搜索/requirepass关键字。
*/
public class JedisUtils {
private static JedisPool jedisPool;
//连接池对象和配置文件只需要加载一次,可以放到static静态代码块中
static{
//1 读取配置文件
//使用ResourceBundle加载属性文件
ResourceBundle bundle = ResourceBundle.getBundle("jedis");//只能从类路径(src)中读取属性文件,不需要写文件后缀名
//获取值
String host = bundle.getString("redis.host");
int port=Integer.parseInt(bundle.getString("redis.port"));
String password = bundle.getString("redis.auth");
//获取最大连接数和默认数据库
int maxActive = Integer.parseInt(bundle.getString("redis.maxActive"));
//2 创建jedis连接池对象
//创建连接池配置对象
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(maxActive);
//创建jedis连接池对象
jedisPool=new JedisPool(config,host,port,6000,password);
}
//3 对外提供一个方法,从连接池中获取连接返回
public static Jedis getJedis(){
return jedisPool.getResource();
}
// 4 对外提供一个方法,释放资源
public static void close(Jedis jedis){
if(jedis!=null){
jedis.close();
}
}
}
【第四章】redis持久化
上面的这两张图, 分别就是 RDB 和 AOF 两种 存储 持久化存储方式.
RDB: 是通过 快照的形式来 做 持久化存储
AOF: 是通过 记录 操作 的过程来 来做 持久化存储
问题1:RDB和AOF两种持久化方案保持数据的区别?
RDB文件中保持的是某一时刻redis中所有的数据。AOF保存的是每次的操作,AOF方式要在配置文件中手动开启,appendonly yes。
问题2:RDB和AOF优缺点对比?
见上图
【具体演示效果】
1.redis概述、命令、持久化存储方法
1.1.redis概述(了解)
-
什么是redis?
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis 的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色,Redis的官网: https://redis.io/
-
redis的特性:
Redis 与其他 key - value 缓存产品有以下三个特点:
①、Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
②、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
③、Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势:
①、性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
②、丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
③、原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
④、丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
总结:
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,
让NoSQL数据库对关系型数据库的不足进行弥补。
一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
1.2.redis数据类型string常见操作介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
常见操作
- SET key value
设定该Key持有指定的字符串Value,如果该Key已经存在,则覆盖其原有值。
返回值:总是返回"OK"
- GET key
获取指定Key的Value。如果与该Key关联的Value不是string类型,Redis将返回错误信息,因为GET命令只能用于获取string Value。
返回值:与该Key相关的Value,如果该Key不存在,则返回nil。
-
MSET key value [key value …]
该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SET命令。
返回值:该命令不会失败,始终返回OK。
-
MGET key [key …]
返回所有指定Keys的Values,如果其中某个Key不存在,或者其值不为string类型,该Key的Value将返回nil。
返回值:返回一组指定Keys的Values的列表。
- APPEND key value
如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾。如果该Key不存在,APPEND命令将会创建一个新的Key/Value。
返回值:追加后Value的长度。
- SETRANGE key offset value
替换指定Key的部分字符串值。从offset开始,替换的长度为该命令第三个参数value的字符串长度,其中如果offset的值大于该Key的原有值Value的字符串长度,Redis将会在Value的后面补齐(offset - strlen(value))数量的0x00,之后再追加新值。如果该键不存在,该命令会将其原值的长度假设为0,并在其后添补offset个0x00后再追加新值。鉴于字符串Value的最大长度为512M,因此offset的最大值为536870911。最后需要注意的是,如果该命令在执行时致使指定Key的原有值长度增加,这将会导致Redis重新分配足够的内存以容纳替换后的全部字符串,因此就会带来一定的性能折损。
返回值:修改后的字符串Value长度。
注意:从左往右数,从0开始依次递增,不能从右往左数;多个单词需要使用引号引起来。
- GETRANGE key start end
截取字符串。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,如果end值超过Value的字符长度,该命令将只是截取从start开始之后所有的字符数据。
返回值:子字符串;
注意:从左往右数,从0开始依次递增;从右往左数,从-1开始依次递减,-1表示最后一位,例如:
1.3.redis数据类型hash常见操作介绍
Redis中的Hashes类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如用户信息:Username、Password和Age等。每一个Hash可以存储4294967295个键值对。
常见操作
- HSET key field value
为指定的Key设定Field/Value对,如果Key不存在,该命令将创建新Key以参数中的Field/Value对,如果参数中的Field在该Key中已经存在,则用新值覆盖其原有值。
返回值:1表示新的Field被设置了新值,0表示Field已经存在,用新值覆盖原有值。
-
HGET key field
返回指定Key中指定Field的关联值。
返回值:返回参数中Field的关联值,如果参数中的Key或Field不存,返回nil。
-
HLEN key
获取该Key所包含的Field的数量。 返回Key包含的Field数量,如果Key不存在,返回0。
- HMSET key field value [field value …]
逐对依次设置参数中给出的Field/Value对。如果其中某个Field已经存在,则用新值覆盖原有值。如果Key不存在,则创建新Key,同时设定参数中的Field/Value。
- HMGET key field [field …]
获取和参数中指定Fields关联的一组Values。如果请求的Field不存在,其值返回nil。如果Key不存在,该命令将其视为空Hash,因此返回一组nil。
返回值:返回和请求Fields关联的一组Values,其返回顺序等同于Fields的请求顺序。
-
HGETALL key
获取该键包含的所有Field/Value。其返回格式为一个Field、一个Value,并以此类推。
返回值:Field/Value的列表。
-
HKEYS key
返回指定Key的所有Fields名。
返回值:Field的列表。
-
HVALS key
返回指定Key的所有Values名。
返回值:Value的列表。
- HDEL key field [field …]
从指定Key的Hashes Value中删除参数中指定的多个字段,如果不存在的字段将被忽略。
返回值:如果Key不存在,则将其视为空Hashes,并返回0,否则返回实际删除的Field数量。
1.4.redis数据类型list常见操作介绍
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。
常见操作
- LPUSH key value [value …]
在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。
返回值:插入后链表中元素的数量。
- LRANGE key start stop
该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。
返回值:返回指定范围内元素的列表。
- LPOP key
返回并弹出/移除指定Key关联的链表中的第一个元素,即头部元素。如果该Key不存,返回nil。
返回值:链表头部的元素。
- LLEN key
返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息。
返回值:链表中元素的数量。
-
LSET key index value
设定链表中指定位置的值为新值,其中0表示第一个元素,即头部元素,-1表示尾部元素。如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息。
(对指定脚标的值进行设置)
-
LINDEX key index
该命令将返回链表中指定位置(index)的元素,index是0-based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。
返回值:返回请求的元素,如果index超出范围,则返回nil。
(读出指定脚标的值)
-
RPUSH key value [value …]
在指定Key所关联的List Value的尾部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的尾部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。
返回值:插入后链表中元素的数量。
-
RPOP key
返回并弹出指定Key关联的链表中的最后一个元素,即尾部元素,。如果该Key不存,返回nil。
返回值:链表尾部的元素。
1.5.redis中key通用操作
通用操作
-
KEYS pattern
获取所有匹配pattern参数的Keys。需要说明的是,在我们的正常操作中应该尽量避免对该命令的调用,因为对于大型数据库而言,该命令是非常耗时的,对Redis服务器的性能打击也是比较大的。pattern支持glob-style的通配符格式,如*表示任意一个或多个字符,?表示任意字符,[abc]表示方括号中任意一个字母。 匹配模式的键列表。
- DEL key [key …]
从数据库删除中参数中指定的keys,如果指定键不存在,则直接忽略。还需要另行指出的是,如果指定的Key关联的数据类型不是String类型,而是List、Set、Hashes和Sorted Set等容器类型,该命令删除每个键的时间复杂度为O(M),其中M表示容器中元素的数量。而对于String类型的Key,其时间复杂度为O(1)。
返回值:实际被删除的Key数量。
- EXISTS key
判断指定键是否存在。
返回值:1表示存在,0表示不存在。
- RENAME key newkey
为指定的键重新命名,如果参数中的两个Keys的名字相同,或者是源Key不存在,该命令都会返回相关的错误信息。如果newKey已经存在,则直接覆盖。
-
TYPE key
获取与参数中指定键关联值的类型,该命令将以字符串的格式返回。
返回值:返回的字符串为string、list、set、hash和zset,如果key不存在返回none。
2.Jedis的使用
2.1.使用jedis操作string类型数据
前提:导入开发jar包
public class StringTest {
/**
* 存值
*/
@Test
public void test1(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
jedis.set("username","王郑浩");
//3 释放连接
jedis.close();
}
/**
* 取值
*/
@Test
public void test2(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
String username = jedis.get("username");
System.out.println("username = " + username);
//3 释放连接
jedis.close();
}
/**
* strlen key 获取字符串的长度
*/
@Test
public void test3(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
Long length = jedis.strlen("username");
System.out.println("length = " + length);
//3 释放连接
jedis.close();
}
/**
* 追加字符串
*/
@Test
public void test4(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
jedis.append("username"," is boy");
//3 释放连接
jedis.close();
}
/**
* 一次性存储多个值
*/
@Test
public void test5(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
jedis.mset("age","18","address","武汉");
//3 释放连接
jedis.close();
}
/**
* 一次性取多个值
*/
@Test
public void test6(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
List<String> list = jedis.mget("username", "age", "address","hobby");
System.out.println("list = " + list);
//3 释放连接
jedis.close();
}
/**
* 给key设置超时时间
*/
@Test
public void test7(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
jedis.setex("hobby",5,"sing");
//3 释放连接
jedis.close();
}
}
2.2 使用Jedis操作hash类型数据
public class HashTest {
/**
* 存值
*/
@Test
public void test1(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
jedis.hset("myhash","username","wangzhenghao");
//3 释放连接
jedis.close();
}
/**
* 取值
*/
@Test
public void test2(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
String username = jedis.hget("myhash", "username");
System.out.println("username = " + username);
//3 释放连接
jedis.close();
}
/**
* 存多组值
*/
@Test
public void test3(){
//1 创建连接对象
Jedis jedis=new Jedis();
Map<String,String> map=new HashMap<>();
map.put("age","20");
map.put("address","黑马");
//2 执行操作
jedis.hmset("myhash",map);
//3 释放连接
jedis.close();
}
/**
* 获取多个值
*/
@Test
public void test4(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
List<String> list = jedis.hmget("myhash", "username", "age", "address");
System.out.println("list = " + list);
//3 释放连接
jedis.close();
}
/**
* 获取多组键值对
*/
@Test
public void test5(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
Map<String, String> map = jedis.hgetAll("myhash");
System.out.println("map = " + map);
//3 释放连接
jedis.close();
}
/**
* 删除key
*/
@Test
public void test6(){
//1 创建连接对象
Jedis jedis=new Jedis();
//2 执行操作
jedis.hdel("myhash","username","address");
//3 释放连接
jedis.close();
}
}
2.3 将JedisPool连接池封装到JedisUtils工具类中
- 配置文件内容
redis.host=172.16.87.160
redis.port=6379
redis.auth=123456
#链接数据库
redis.default.db=0
#客户端超时时间单位是毫秒
redis.timeout=60000
#最大连接数
redis.maxActive=300
#最大空闲数
redis.maxIdle=100
#最小空闲数
redis.minIdle=1
#最大建立连接等待时间
redis.maxWait=1000
#指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true
#当调用return Object方法时,进行有效性检查
redis.testOnReturn=true
- 工具类代码
/*
目的:将jedis连接池封装到工具类中
这个工具类需要做哪些事?
1 读取配置文件
2 创建jedis连接池对象 连接池对象和配置文件只需要加载一次,可以放到static静态代码块中
3 对外提供一个方法,从连接池中获取连接返回
4 对外提供一个方法,释放资源
*/
public class JedisUtils {
private static JedisPool jedisPool;
//连接池对象和配置文件只需要加载一次,可以放到static静态代码块中
static{
//1 读取配置文件
//使用ResourceBundle加载属性文件
ResourceBundle bundle = ResourceBundle.getBundle("jedis");//只能从类路径(src)中读取属性文件,不需要写文件后缀名
//获取值
String host = bundle.getString("redis.host");
int port=Integer.parseInt(bundle.getString("redis.port"));
String password = bundle.getString("redis.auth");
//获取最大连接数和默认数据库
int maxActive = Integer.parseInt(bundle.getString("redis.maxActive"));
//2 创建jedis连接池对象
//创建连接池配置对象
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(maxActive);
//创建jedis连接池对象
jedisPool=new JedisPool(config,host,port,6000,password);
}
//3 对外提供一个方法,从连接池中获取连接返回
public static Jedis getJedis(){
// ....
return jedisPool.getResource();
}
// 4 对外提供一个方法,释放资源
public static void close(Jedis jedis){
if(jedis!=null){
jedis.close();
}
}
}
5.作业:
1. 能够自己去独立实现启动 redis, 并且连接上 redis .
2. 谈谈你理解的redis 的使用场景.
排行榜、直播人数、关注列表粉丝列表、分析共同好友、通信消息的显示顺序
3. redis的数据 类型 是哪几种 .
String、Hash、List、set、sorted set
4. 能够 去编写 redis 的 java连接程序, 并且 去 调用 实现 CRUD 操作 (不记得的api 去翻看 菜鸟教程 )
5. 抽取 jedis 的工具类
预习后面的 maven ,