概念
-
Redis:是一款高性能的NOSQL系列的非关系型数据库,是用C语言开发的一个开源的高性能键值对数据库,官方提拱测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s,并且Redis通过提拱多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据如下
1、字符串 string
2、哈希 hash
3、列表 list
4、集合 set
5、有序集合 sortedset -
应用场景
1、缓存 (数据查询、短连接、新闻内容、商品内容等)
2、聊天室的在线好友列表
3、任务队列(秒杀、抢购、12306等)
4、应用排行榜
5、网站访问统计
6、数据过期处理(可以精确到毫秒)
7、分布式集群架构中的session分离
下载和安装
1、官网:https://redis.io
2、中文网:http://www.redis.new.cn/
3、下载后直接解压使用
redis.conf:配置文件
redis-server:服务器端
redis-cli:客户端
比较详细的介绍:https://www.cnblogs.com/feijl/p/6879929.html
https://blog.csdn.net/ShmilyCoder/article/details/81196228
命令操作
1、Redis的数据结构:
redis存储的是:key-value格式的数据,其中key都是字符串,value有5种不同的数据结构:
字符串 string
哈希 hash
列表 list
集合 set
有序集合 sortedset
2、字符串类型 string
存储:set key value
获取:get key
删除:del key
3、哈希类型 hash
存储:hset key field value
获取指定field:hget key field
获取全部field:hgetall key
删除:hdel key field
4、列表类型list:可以添加一个元素到列表头部(左边)或尾部(右边)
添加:lpush key value: 将元素添加到左边
rush key value:将元素添加到右边
获取:lrange key start end :范围获取
删除:lpop:删除左边一个,返回删除的value
rpop:删除右边一个,返回删除的value
5、集合类型set:不允许重复元素
添加:sadd key value
获取:smembers key :获取set集合中所有元素
删除:srem key value:删除集中某个元素
6、有序集合类型sortedset:不允许重复元素,有序
存储:zadd key score value
获取: zrange key start end
删除: zrem key value
7、通用命令
keys * :查询所有的键
type key:查询这个键是什么类型的
del key:删除这个键
持久化
redis是一个内存数据库,当redis服务器重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
redis持久化的机制
-
RDB:默认方式,不需要进行配置,默认就使用这种机制
在一定的间隔时间中,检测key的变化情况,然后持久化数据
1、编辑redis.conf文件
// after 900 sec (15 min) if at least 1 key changed
save 900 1
// after 300 sec (5 min) if at least 10 keys changed
save 300 10
after 60 sec if at least 10000 keys changed
save 60 10000
2、重启服务器并指定配置文件 -
AOF:日志记录的方式,可以记录每一条命令的操作,可以每一条命令操作后,持久化数据
1、编辑redis.conf文件
appendonly no(默认关闭aof) append only yes(开启aof)
appendfsync always :每一次操作都会持久化
appendfsync everysec: 每隔一秒进行一次持久化
appendfsync no :不运行持久化
JAVA客户端 jedis
Jedis:一款java操作redis数据库的工具
- 使用步骤:
//1、获取连接
Jedis jedis = new Jedis(“localhost”,6379);
//2、操作
jedis.set(“username”,“zhangsan”);
//3、关闭连接
Jedis.close();
- Jedis操作各种redis中的数据结构
1、字符串类型string
set
get
2、哈希类型hash
hset
sget
3、列表类型list
lpush/rpush
lpop/rpop
4、集合类型set
sadd
5、有序集合类型sortedset
zadd - 代码如下
package com.lichaowu.jedis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
/**
* string类型,用于以后注册激活码的时间
*/
@Test
public void Test1() {
//获取连接
Jedis j = new Jedis("localhost",6379); //如果是空参构造,默认localhost 6379
//操作
//j.set("ksm", "11111");
System.out.println(j.get("ksm"));
//可以使用setex()方法存储可以指定过期时间的key value
j.setex("tal", 20, "15074762880");
//关闭
j.close();
}
/**
* hsah类型
*/
@Test
public void Test2() {
//获取连接
Jedis j = new Jedis("localhost",6379);
//操作
j.hset("user", "name", "lisi");
j.hset("user", "age", "19");
j.hset("user", "email", "321810864@qq.com");
System.out.println(j.hget("user", "name"));
//获取hash所有键值
Map<String, String> map = j.hgetAll("user");
for(Map.Entry<String,String> en : map.entrySet()) {
System.out.println(en.getKey() + ":" + en.getValue());
}
//关闭连接
j.close();
}
/**
* 列表类型
*/
@Test
public void Test3() {
//创建连接
Jedis j = new Jedis("localhost",6379);
//操作
//从左边存储
j.lpush("mylist", "a","b","c");
//从右边存储
j.rpush("mylist", "a","b","c");
//获取范围值
List<String> lrange = j.lrange("mylist", 0, -1);
System.out.println(lrange);
//左弹出
System.out.println(j.lpop("mylist"));
//右弹出
System.out.println(j.rpop("mylist"));
//获取范围值
List<String> end = j.lrange("mylist", 0, -1);
System.out.println(end);
//关闭连接
j.close();
}
/**
* 集合类型
*/
@Test
public void Test4() {
//创建连接
Jedis jedis = new Jedis("localhost",6379);
//操作
//存储
jedis.sadd("myset", "java","C++","php");
//获取
Set<String> smembers = jedis.smembers("myset");
System.out.println(smembers);
//关闭连接
jedis.close();
}
/**
* 有序集合
*/
@Test
public void Test5() {
//创建连接
Jedis jedis = new Jedis("localhost",6379);
//操作
//存储
jedis.zadd("mysortedset", 10, "李超武");
jedis.zadd("mysortedset", 20, "陈清香");
jedis.zadd("mysortedset", 30, "陈李朋");
//获取
Set<String> zrange = jedis.zrange("mysortedset", 0, -1);
System.out.println(zrange);
//关闭连接
jedis.close();
}
}
Jedis连接池工具类
编写
package com.lichaowu.jedis;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtil {
private static JedisPool pool;
static {
//读取配置文件
InputStream is = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties p = new Properties();
try {
//关联文件
p.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig conf = new JedisPoolConfig();
conf.setMaxTotal(Integer.parseInt(p.getProperty("maxTota")));
conf.setMaxTotal(Integer.parseInt(p.getProperty("maxIdle")));
pool = new JedisPool(conf,p.getProperty("host"),Integer.parseInt(p.getProperty("port")));
}
//获取连接
public static Jedis getJedis() {
return pool.getResource();
}
}
使用
/**
* 连接池工具类的使用
*/
public void Test7() {
//获取连接
Jedis jedis = JedisPoolUtil.getJedis();
//操作
jedis.set("你好", "李超武");
//关闭
jedis.close();
}
案列
1、提拱index.html页面,页面中有一个省份下拉列表
2、当页面加载完成之后,发送ajax请求,加载省份
- 数据库的创建
创建数据库
create database day23;
创建表
create table province (
id int primary key auto_increment,
name varchar(20) not null);
插入数据
insert into province values(null,‘深圳’);
insert into province values(null,‘上海’);
insert into province values(null,‘北京’);
insert into province values(null,‘长沙’);
- 后端代码
//service层
public class ProvinceService {
private ProvinceDao dao = new ProvinceDao();
public List<Province> findAll() {
return dao.findAll();
}
/**
* 使用缓存
* @return
*/
public String findAllJson() {
//获取redis客户端连接
Jedis jedis = JedisUtil.getJedis();
//获取缓存中的数据
String json = jedis.get("province");
//判断题否有缓存
if(json == null || json.length() == 0) {
//没有的话,先从数据存你取
List<Province> findAll = dao.findAll();
//将数据序列化json
json = JSONArray.fromObject(findAll).toString();
//存储到缓存中
jedis.set("province", json);
System.out.println("数据库中使用");
}else {
System.out.println("缓存中使用");
}
//返回缓存中数据
return json;
}
}
//servlet层
@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//调用Service
ProvinceService ps = new ProvinceService();
String json = ps.findAllJson();
//响应
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().write(json);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
- 前端代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
//页面加载
$(function() {
//get方式ajax请求
$.get("provinceServlet",{},function(data) {
//获取id为province元素
var province = $("#province");
//循环遍历响应过来的json也就是数组
$(data).each(function() {
//alert(this.id + ";" + this.name);
//创建一个option
var option = "<option name='"+this.id+"'>"+this.name+"</option>";
//追加到元素后面
province.append(option);
});
});
});
</script>
</head>
<body>
<select id="province">
<option>--请选择--</option>
</select>
</body>
</html>