redis(入门)

回顾

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 来做 缓存 .  从而 提高 效率, 优化 性能 .

redis 是目前市面最重要 的一种 缓存 技术 .

另外一点, 希望 能够 后面  每学 一个 新的技术, 能够 清楚的 定位 这个技术是用来 哪里的 .  

https://www.runoob.com/redis/redis-commands.html redis 的 中文 命令文档, 大家 可以 多翻翻 这个文档, 里面 都是中文的, 非常的友好 .

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值也就被一起删除了

redis(入门)

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持久化

redis(入门)

上面的这两张图, 分别就是 RDB 和 AOF 两种 存储 持久化存储方式.

RDB: 是通过 快照的形式来 做 持久化存储

AOF: 是通过 记录 操作 的过程来 来做 持久化存储

redis(入门)

问题1:RDB和AOF两种持久化方案保持数据的区别?

​ RDB文件中保持的是某一时刻redis中所有的数据。AOF保存的是每次的操作,AOF方式要在配置文件中手动开启,appendonly yes。

问题2:RDB和AOF优缺点对比?

​ 见上图

redis(入门)

redis(入门)

【具体演示效果】

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"

redis(入门)

  • GET key

获取指定Key的Value。如果与该Key关联的Value不是string类型,Redis将返回错误信息,因为GET命令只能用于获取string Value。

返回值:与该Key相关的Value,如果该Key不存在,则返回nil。

redis(入门)

  • MSET key value [key value …]

    该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SET命令。

返回值:该命令不会失败,始终返回OK。

redis(入门)

  • MGET key [key …]

    返回所有指定Keys的Values,如果其中某个Key不存在,或者其值不为string类型,该Key的Value将返回nil。

返回值:返回一组指定Keys的Values的列表。

redis(入门)

  • APPEND key value

如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾。如果该Key不存在,APPEND命令将会创建一个新的Key/Value。

返回值:追加后Value的长度。

redis(入门)

  • 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长度。

redis(入门)

注意:从左往右数,从0开始依次递增,不能从右往左数;多个单词需要使用引号引起来。

  • GETRANGE key start end

截取字符串。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,如果end值超过Value的字符长度,该命令将只是截取从start开始之后所有的字符数据。

返回值:子字符串;

redis(入门)

注意:从左往右数,从0开始依次递增;从右往左数,从-1开始依次递减,-1表示最后一位,例如:

redis(入门)

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已经存在,用新值覆盖原有值。

redis(入门)

  • HGET key field

    返回指定Key中指定Field的关联值。

返回值:返回参数中Field的关联值,如果参数中的Key或Field不存,返回nil。

redis(入门)

  • HLEN key

    获取该Key所包含的Field的数量。 返回Key包含的Field数量,如果Key不存在,返回0。

redis(入门)

  • HMSET key field value [field value …]

逐对依次设置参数中给出的Field/Value对。如果其中某个Field已经存在,则用新值覆盖原有值。如果Key不存在,则创建新Key,同时设定参数中的Field/Value。

redis(入门)

  • HMGET key field [field …]

获取和参数中指定Fields关联的一组Values。如果请求的Field不存在,其值返回nil。如果Key不存在,该命令将其视为空Hash,因此返回一组nil。

返回值:返回和请求Fields关联的一组Values,其返回顺序等同于Fields的请求顺序。

redis(入门)

  • HGETALL key

    获取该键包含的所有Field/Value。其返回格式为一个Field、一个Value,并以此类推。

返回值:Field/Value的列表。

redis(入门)

  • HKEYS key

    返回指定Key的所有Fields名。

返回值:Field的列表。

redis(入门)

  • HVALS key

    返回指定Key的所有Values名。

返回值:Value的列表。

redis(入门)

  • HDEL key field [field …]

从指定Key的Hashes Value中删除参数中指定的多个字段,如果不存在的字段将被忽略。

返回值:如果Key不存在,则将其视为空Hashes,并返回0,否则返回实际删除的Field数量。

redis(入门)

1.4.redis数据类型list常见操作介绍

在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。

从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。

常见操作

  • LPUSH key value [value …]

在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。

返回值:插入后链表中元素的数量。

redis(入门)

  • LRANGE key start stop

该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。

返回值:返回指定范围内元素的列表。

redis(入门)

  • LPOP key

返回并弹出/移除指定Key关联的链表中的第一个元素,即头部元素。如果该Key不存,返回nil。

返回值:链表头部的元素。

redis(入门)

  • LLEN key

返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息。

返回值:链表中元素的数量。

redis(入门)

  • LSET key index value

    设定链表中指定位置的值为新值,其中0表示第一个元素,即头部元素,-1表示尾部元素。如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息。

(对指定脚标的值进行设置)

redis(入门)

  • LINDEX key index

    该命令将返回链表中指定位置(index)的元素,index是0-based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。

返回值:返回请求的元素,如果index超出范围,则返回nil。

(读出指定脚标的值)

redis(入门)

  • 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]表示方括号中任意一个字母。 匹配模式的键列表。

redis(入门)

  • DEL key [key …]

从数据库删除中参数中指定的keys,如果指定键不存在,则直接忽略。还需要另行指出的是,如果指定的Key关联的数据类型不是String类型,而是List、Set、Hashes和Sorted Set等容器类型,该命令删除每个键的时间复杂度为O(M),其中M表示容器中元素的数量。而对于String类型的Key,其时间复杂度为O(1)。

返回值:实际被删除的Key数量。

redis(入门)

  • EXISTS key

判断指定键是否存在。

返回值:1表示存在,0表示不存在。

redis(入门)

  • RENAME key newkey

为指定的键重新命名,如果参数中的两个Keys的名字相同,或者是源Key不存在,该命令都会返回相关的错误信息。如果newKey已经存在,则直接覆盖。

redis(入门)

  • TYPE key

    获取与参数中指定键关联值的类型,该命令将以字符串的格式返回。

返回值:返回的字符串为string、list、set、hash和zset,如果key不存在返回none。

redis(入门)

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 ,

上一篇:秒杀活动下的公平队列抢购机制


下一篇:Java的Redis客户端选择-jedis与Lettuce