1.NoSQL
a) 指一些非关系型的数据库.读写性能高,存储会有过期,数据存放于内存中
b) 分类
i. 键值数据库
ii. 列存储数据库
iii. 文档型数据库
redis和memcached是key-value的Nosql,主要用来做缓存的
2.Redis
a) 高性能的开源的菲关系型数据库,数据保存在内存里面或者磁盘里面
b) Redis 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合。数据结构:数组,list,set,map等redis提供了一下操作方法,我们使用这些方法就可以对存入字符串,组织成各种类型数据库结构(string,list,set,map等).
c) Redis数据库的优势
i. 数据存储:存放在内存,还支持持久化.-存取速度快,并发能力强,数据安全性高
还支持集群(主从同步) (支持高并发,海量数据), 数据可以主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
ii. 它支持的存储值的类型
- String,list,set,sorted set,hash
- 支持集群(支持主从同步)
- 支持持久化
d) 使用场景
i. 缓存: 对于经常查询的数据,将其放到Redis里面,会提高查询效率,减少数据库压力
ii. 计数器引用:微信点赞数量
iii. 实时攻防系统
iv.
e) Redis服务器的安装
i. 启动Redis服务
- 手动启动:在安装目录下启动双击双击redis-service.exe
- Cmd启动:
ii. Redis客户端操作Redis
- 对value为字符串(String) 操作
a) 设置单个键值:set
b) 设置多个键值:mset
- 对key的操作
a) Keys:获取所有的key列表
b) Del key:删除key值
c) expire key xx //设置key的过期时间(xx秒后过期)
d) ttl key:查看key 的过期时间
e) flushall:清除Redis数据库的所有数据
f) flushdb :清除当前库的数据,Redis默认是16个数据库0,1….15
- 对list集合的操作
rdis怎么实现栈(FILO)和队列(FIFO)???
list控制同一边进,同一边出就是栈
list控制一边进一边出就是队列 - 对Set集合的操作
- 对SortedSet(有序集合)的操作
- 对hash类型的操作
- Redis设置密码
a) 通过命令设置密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
CONFIG SET requirepass 123456 //将密码设置为123456
CONFIG SET requirepass "" //清除密码
AUTH 123456 //输入密码进行认证
b) 修改Redis的配置文件设置密码
在配置文件redis.widows.conf中增加一行代码
requirepass 123456
将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码
3.Java操作Redis服务器使用Jedis客户端
a) Jedis简单操作
导入jedis的包
@Test
public void test()throws Exception{
//创建连接Redis服务器
String host ="127.0.0.1";
int port = 6379;
int timeout = 1000;//超时时间,1秒超时
Jedis jedis = new Jedis(host,port,timeout);
//密码认证
jedis.auth("admin");
//执行操作,设置key和value值.
jedis.set("yhptest","yhptest dbl!");
System.out.println(jedis.get("yhptest"));
//关闭连接
jedis.close();
}
b) 连接池配置
i. 通过jedis连接池,简单操作Redis数据库
/思想:如果创建一个对象后需要为他设置很多值,还不如先创建它配置对象并做完配置,然后再通过配置对象创建它
//1 创建jedispool配置对象
//2 做配置-四个
//3 创建jedispool
//4 通过jedispool获取连接
//5 执行操作
// 6 释放连接
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
@Test
public void test()throws Exception{
//1 创建jedispool配置对象
JedisPoolConfig config = new JedisPoolConfig();
//2 做配置-四个
config.setMaxIdle(2);
config.setMaxTotal(10);
config.setMaxWaitMillis(1*1000); //创建连接超时
config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
//3 创建jedispool
//1*1000 获取连接超时时间
JedisPool pool = new JedisPool(config,
"127.0.0.1",6379,1*1000,"admin");
//4 通过jedispool获取连接
Jedis jedis = pool.getResource();
//5 执行操作
jedis.set("jedispooltest","dbldblddzt.....");
System.out.println(jedis.get("jedispooltest"));
// 6 释放连接
jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
pool.destroy();
}
总结:先创建Jedis连接池配置对象,然后创建连接池,创建连接池的时候传入连接池配置对象,redis存放的ip地址,Redis端口号,设置连接超时时间和操作Redis的用户,连接池获取到jedis对象,jedis对象操作服务器.关闭连接池和jedis对象
c) Jedis数据结构的操作
i. Key值操作
ii. String操作
iii. List操作
iv. Set操作
v. Hash操作
vi. 事务处理
vii. 排序
- 数字集合是通过调用desc和asc方法排序
- 字符串字母是通过调用alpha方法进行参数排序.
- Redis持久化配置
a) 两种持久化的方式
i. RDB和AOF,可以通过修改Redis的conf配置文件进行配置
ii. 服务器启动执行载入程序à判断是否开启了AOF的持久化,开启了就载入AOF的文件,未开启就载入RDB的文件
iii. RDB模式
- RDB模式可以在指定的时间间隔内生成数据集的时间点快照,默认是开启RDB模式的,
- 如何关闭默认开启的RDB持久化方式:在Redis.conf文件里面将在指定时间生成数据集的时间快照进行一个注释,如果中途突然断电,无法持久化到磁盘
save ""
# save 900 1 //至少在900秒的时间段内至少有一次改变存储同步一次
# save xxx
# save 60 10000
iv. AOF模式
- AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
- 如何开启AOF
a) appendonly yes //yes 开启,no 关闭
# appendfsync always //每次有新命令写时就执行一次fsync 同步
#这里我们启用 everysec
appendfsync everysec //每秒 fsync同步 一次
# appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync),它的参数请大家看redis.conf配置文件详解
v. 小结:Redis是怎么保存数据的.
- redis为了考虑效率,保存数据在内容中.并且考虑数据安全性,还做数据持久化,如果满足保存策略,就会把内存的数据保存到数据rdb文件,还来不及保存那部分数据存放到aof更新日志中。在加载时,把两个数据做一个并集.
- Redis的淘汰策略:选择合适的数据进行淘汰
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。