NOSQL数据库——Redis
学习概要
Nosql的概念
Redis的概念
Redis的功能
Redis的操作命令
Redis的应用场景
Redis持久化机制
Jedis对Redis的操作
一.NOSQL的概念
1.1什么是nosql
nosql(Not Only SQL),泛指非关系型数据库,区别于关系型数据库,它们不保证关系数据的ACID特性。
非关系型数据库:Redis 缓存数据库
关系型数据库:MySql Oracle
1.2 nosql的优点
1.2.1. 能应对数据库高并发读写
1.2.2. 能对海量数据的高效率存储和访问
1.2.3. 能应对对数据库的高可扩展和高可用
二.Redis的概述
2.1 什么是Redis
redis是用C语言开发的一个基于内存,可持久化的(key-value)键值对存储系统。可提供字符串类型 String(json),散列类型Hash(key value key-value(map)),列表类型(list),集合类型(set),有序集合类型(zset)等丰富的数据类型,支持不同场景下的存储需求。
2.2 Redis的特性
--提供多种数据类型存储(String,list,set,hash,zset)
--以内存作为数据存储,读写速度快。
--提供了RDB、AOF两种持久化方式
--应用场景多样:缓存,队列,消息订阅/发布
--支持主从模式,可配置集群,高可用。
三.Redis的应用场景
Redis数据交换快,在服务器中常用来存储一些操作比较频繁的数据,节省内存开销,也提升了速度。
1、缓存(数据查询,新闻内容,商品内容。最常用)
2、商品列表,在线好友列表,评论列表
3、任务队列(RabbitMQ(秒杀,抢购))
4、排行榜
5、网站访问统计,计数
6、数据过期处理
Redis的数据类型以及相应的应用场景
String(字符串):Redis最基本的数据类型,二进制保存。常规key-value缓存应用。常规计数:微博粉丝数。
Hash(哈希类型):key(用户ID),value是一个map集合,map的key是属性名,value是属性值。适用于存储对象,用户信息等。
List(列表类型):按照插入顺序排序的字符串链表,可在头部(left)和尾部(right)添加新元素。常用来如:微博的关注列表,访客列表。也可以实现最新消息 排行。
Set(集合类型):没有排序的字符集合,不允许出现重复的元素。
ZSet(有序集合):有序集合,也不可重复。有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序。
四、Redis常规命令
- keys pattern 获取匹配的建名列表
- del key1 key2… 删除指定key
- exists key 判断是否存在,1代表存在,0代表不存在
- type key 获取指定key的类型,如果不存在返回none
- monitor # 实时监控
- config get # 获得服务配置
五、Redis两种持久化机制
Redis持久化机制有两种:AOF(仅附加文件),RDB(快照)
仅附加文件(AOF):AOF持久化机制下,保存数据到文件(appendonly.aof)中
appendfilename “appendonly.aof”
参数说明:
appendonly yes 开启AOF持久化机制
appendsync always 总是进行持久化
appendsync everysec 每秒进行持久化
appendsync no 不进行持久化
优点:数据安全性较高,不会丢失数据
缺点:IO操作较多,影响性能
快照(RDB):RDB持久化机制下,保存数据到文件(dump.rdb)中
appendfilename “dump.rdb”
参数说明:
save 900 1 如果15分钟内1条数据发生变化,则启动快照保存
save 300 10 如果5分钟内超过10条数据变化,则启动快照保存
save 60 1000 如果1分钟内超过10000条数据发生变化,则启动快照保存
优点:IO操作较少,性能较高
缺点:数据的安全性较低,容易丢失数据
六、Jedis对Redis的操作
6.1 jedis的基本操作
public class jedisTest {
public static void main(String[] args) {
//1.获取redis的连接对象 Jedis
Jedis jedis = new Jedis("localhost", 6379);
//2.jedis操作redis数据库
//jedis操作String类型
// jedis.set("username","kobe");
// String username = jedis.get("username");
// System.out.println(username);
//jedis操作hash类型
jedis.hset("LBJ", "age", "35");
String hget = jedis.hget("LBJ", "age");
System.out.println(hget);
//3.应用场景:保存验证码
jedis.setex("code",90,"8888");
//4.释放资源
jedis.close();
}
}
6.2 Jedis连接池的基本用法
public class jedisPoolTest {
public static void main(String[] args) {
//1.创建一个连接池的配置信息对象
JedisPoolConfig config = new JedisPoolConfig();
//2.设置连接池的参数
config.setMaxTotal(10);
config.setMaxIdle(5);
//3.通过配置创建连接池对象
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
//4.从连接池获取连接对象
Jedis jedis = jedisPool.getResource();
//5.操作redis数据库
String username = jedis.get("username");
System.out.println(username);
//6.释放回连接池
jedis.close();
}
}
6.3 jedis连接池工具类
public class jedisUtils {
private static String host = null;
private static int port = 0;
private static int maxIdle = 0;
private static int maxTotle = 0;
private static JedisPool pool = null;
//1.static代码块加载配置文件信息
static{
//专门用来获取classpath下的properties配置文件的
ResourceBundle rb = ResourceBundle.getBundle("jedis");
//获取配置文件中的参数
maxTotle = Integer.parseInt(rb.getString("maxTotle"));
maxIdle = Integer.parseInt(rb.getString("maxIdle"));
port = Integer.parseInt(rb.getString("port"));
host = rb.getString("host");
//2.创建连接池配置信息对象
JedisPoolConfig config = new JedisPoolConfig();
//3.设置配置参数
config.setMaxTotal(maxTotle);
config.setMaxIdle(maxIdle);
//4.创建连接池对象
pool = new JedisPool(config,host,port);
}
//5.提供获取连接对象的方法
public static Jedis getJedis(){
return pool.getResource();
}
public static void main(String[] args){
Jedis jedis = getJedis();
String username = jedis.get("username");
System.out.println(username);
jedis.close();
}
}
jedis.properties编写配置文件
maxTotle = 10
maxIdle = 4
host = localhost
port = 6379