文章目录
一、关系型数据库与非关系型数据库
RDBMS(关系型数据库) | NOSQL(非关系型数据库) | |
---|---|---|
并发 | 不支持高并发 | 支持高并发 |
存储数据解构 | 数据都是有结构的(有表的概念) | 大部分非关系型数据库value都是没有解构的(没有表的概念) |
数据存放位置 | 只能放在磁盘上(所以不能承受高并发) | 可以放在内存和磁盘上 |
数据存储量 | 解构和数据存储都是有限的(列最多200,数据量最多200万) | 只要硬件够好就没有限制 |
非关系型数据库又可以分为以下几种
二、Redis概述
Redis数据Nosql的一种,主要用来做缓存的
1、特点:
- 开源免费的
- 支持高并发,读取速度非常快
- 存储的数据是放在内存和磁盘上的
- 支持多种类型的客户端进行访问(Java、C、PHP…)
- 支持集群部署
2、使用场景
- 中央缓存(主要使用场景,减轻数据库压力,减少访问时间,redis就是将数据放在存放在内存中)
- 计数器(点赞量、转发量)
- 实时防攻击系统
- 设定有效期的应用
- 自动去重
- 消息订阅系统
3、MySQL与Redis对比
mysql | redis | |
---|---|---|
类型 | 关系型 | 非关系型 |
存储位置 | 磁盘 | 磁盘和内存 |
存储过期 | 不支持 | 支持 |
读写性能 | 低 | 非常高 |
三、安装认识Redis
中文官网下载:http://redis.cn/
但是需要注意,在官网上下载的是Linux系统下的,Windows系统下的需要在GitHub中去下载:https://github.com/microsoftarchive/redis/releases
绿色软件可以解压后直接使用
Redis文件夹中的文件介绍:
(重点)Redis存储值支持的解构:
首先要明确Redis都是以字符串的形式进行存储的,而Redis存储的解构仅仅是指摆放这些数据(字符串)的规则
五类:String、List、Set、ZSet(有序但不重复)、Hash
四、使用redis-cli 客户端操作redis
首先明确指令是学不完的,这里只列举常用的,剩下的可以在官网进行查询
1、启动窗口
在Redis文件夹中进入dos窗口
启动服务:redis-server.exe
-------->启动服务端
启动客户端(需要再开启一个dos窗口):redis-cli.exe
-------->启动客户端
上面就是最基本的一个Redis启动,但是我们用过MySQL都知道,应该是会有用户名与密码的,所以我们需要进行设置,此时在Redis核心配置文件中开启密码并设置,也可以修改端口号,但是不建议!
需要重启服务端,同时运行我们的设置文件:redis-server.exe redis.windows.conf
再次连接客户端后:auth 设置的密码
-------->默认端口6379,本机的Redis中
正常连接客户端是:redis-cli.exe -h 127.0.0.1 -p 6379
2、redis对String的操作
set key value
-------->设置单个key和value的值
get key
-------->通过指定的key获取value的值
mset key1 value1 key2 value2 ......
-------->一次设置多个key和value的值
mget key1 key2 key3...
-------->一次获取多个key和value的值
3、redis对Key的操作
keys *
-------->查询当前库中的所有key值
del key1 key2...
-------->根据key删除对应的键值对
expire key seconds
-------->设置指定key,value的有效期,seconds单位是秒
ttl key
-------->查询指定key,value得有效期(-1:永久存储;>0:存储指定得秒;-2:该键值对不存在)
incr key
-------->自增+1(对应得值bicultural是整数类型得字符串)
decr key
-------->自减+1(对应得值bicultural是整数类型得字符串)
incrby key num
-------->自增num个数(对应得值bicultural是整数类型得字符串)
decrby key num
-------->自减num个数(对应得值bicultural是整数类型得字符串)
4、redis对库的操作
redis总共有16个库,默认选中的是第一个库(索引0)
select index
-------->选中指定得库
flushdb
-------->清空当前库
flushall
-------->清空所有库
5、redis对List的操作
lpush key val1 val2 val3...
-------->从左进行添加value,在redis中得顺序是val3 val2 val1
rpush key val1 val2 val3
-------->从右进行添加value,在redis中得顺序是val1 val2 val3
lindex key index
-------->根据索引查找指定的值(查找单个值)
lrange key begin end
-------->查询指定范围的值(查找多个值)
lrem key count value
-------->删除集合
- count=0: 删除集合中所有value值
- count>0: 删除集合中指定value的值,从左向右开始删除,删除count个
- count<0: 删除集合中指定value的值,从右向左开始删除,删除count个
lpop key
-------->移除并返回列表 key 的头(最左边)元素
rpop key
-------->移除并返回列表 key 的尾(最右边)元素
6、redis对Set的操作
sadd key val1 val2 val3...
-------->添加指定的数据
smembers key
-------->查看集合中所有的成员
srem key val1 val2
-------->
7、redis对Hash的操作
hset key field1 value1
-------->根据key设置hash一对值
hget key field1
-------->在hash中根据指定的字段获取对应的值
hmset key filed1 value1 field2 value2....
-------->批量设置值
hmget key field1 field2...
-------->在hash中根据多个field获取多个值
hkeys key
-------->获取hash中所有的键
hvals key
-------->获取hash中所有的值
hgetall key
-------->获取hash中的键和值
8、redis对ZSet的操作
因为不常用,所以这里不列举,可以自行查看官网得命令说明
五、java操作Redis
1、创建项目并导包
在Idea中创建普通的Java项目
导入要使用得连接池包与jedis包
导入jar创建一个lib目录,并且进行添加jar包(Add as Library
)
2、简单的配置——连接
public class JedisTest {
@Test
public void getJedis(){
/*创建连接,设置ip、端口号、以及超时时长*/
String host = "127.0.0.1";
Integer port = 6379;
Integer timeout = 1000;//1秒就超时
/*创建jedis对象*/
Jedis jedis = new Jedis(host,port,timeout);
/*执行操作,输入密码*/
jedis.auth("652301");
/*进行操作*/
jedis.set("name", "张三");
String name = jedis.get("name");
System.out.println(name);
/*关闭资源*/
jedis.close();
}
}
3、连接池配置
步骤:
- 创建jedispool配置对象
- 做相应的一些配置(最大连接数、最大等待时间、验证是否连接成功…)
- 创建连接池对象
- 从连接池中获取连接对象
- 执行操作
- 释放连接
@Test
public void getJedisPool(){
/*1、获取连接池配置对象*/
JedisPoolConfig config = new JedisPoolConfig();
/*2、进行配置*/
config.setMaxIdle(2);//闲事最大连接
config.setMaxTotal(10);//最大连接
config.setMaxWaitMillis(1*1000); //创建连接超时
config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
/*3、创建连接池对象*/
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379,2000,"652301");
/*4、获取连接对象*/
Jedis jedis = jedisPool.getResource();
/*5、进行操作*/
jedis.lpush("users", "张三", "王五", "赵四", "钱六");
List<String> users = jedis.lrange("users", 0, -1);
for (String s : users) {
System.out.println(s);
}
/*6、释放连接资源*/
jedis.close();
}
4、工具类方式 JedisUtils
实际开发中会对连接池进行抽取
/*使用枚举限制单例模式,因为每个项目只需要一个该实例对象*/
public enum JedisUtil {
INSTAMCE;
JedisPool jedisPool = null;
static {
JedisPoolConfig config = new JedisPoolConfig();
/*2、进行配置*/
config.setMaxIdle(2);//闲事最大连接
config.setMaxTotal(10);//最大连接
config.setMaxWaitMillis(1*1000); //创建连接超时
config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
/*3、创建连接池对象*/
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379,2000,"652301");
}
/**
* 获取连接资源
* @return
*/
public Jedis getJedis(){
return jedisPool.getResource();
}
/**
* 释放资源
* @param jedis 需要释放的redis
*/
public void closeJedis(Jedis jedis){
if (jedis!=null){
jedis.close();
}
}
/**
* 常规的设置值
* @param key
* @param val
*/
public void set(String key , String val){
Jedis jedis = null;
try {
//获取资源
jedis = this.getJedis();
//进行操作
jedis.set(key, val);
} catch (Exception e) {
e.printStackTrace();
}finally {
this.closeJedis(jedis);
}
}
/**
* 带超时时间的设置值
* @param key
* @param val
* @param timeout
*/
public void set(String key , String val ,Integer timeout){
Jedis jedis = null;
try {
//获取资源
jedis = this.getJedis();
//进行操作,并且设置超时时间
jedis.setex(key, timeout,val);
} catch (Exception e) {
e.printStackTrace();
}finally {
this.closeJedis(jedis);
}
}
/**
* 从redis中取值
* @param key
* @return
*/
public String get(String key){
Jedis jedis = null;
try {
jedis = this.getJedis();
return jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
}finally {
this.closeJedis(jedis);
}
return null;
}
}
六、面试题
1、Redis持久化配置
Redis 提供了两种不同级别的持久化方式:RDB和AOF,可以通过修改redis.conf来进行配置.
两种方式使用的场景有所不同,但是只能选择其中一种:
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
RDB用于大量数据进行缓存时;而数据量不多时我们可以使用AOF
2、淘汰策略
为什么要淘汰:
淘汰一些数据,达到redis数据都是有效的,节约内存资源。选择合适的淘汰策略进行淘汰
①、从设置了过期时间的数据中挑选最少使用的数据进行淘汰
②、从设置了过期时间的数据中挑选即将过期的数据进行淘汰
③、从所有数据中挑选最近最少使用的数据进行淘汰
④、驱逐数据(内存满了后,之后的数据就不会放到缓存中)