Redis

19 篇文章 0 订阅
1 篇文章 0 订阅

概念

  • 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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值