1.Nosql概念:
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。(引自百度百科)
2.Nosql数据库的分类(特点):
key-value(键值对形式)型 nosql数据库 – 代表 redis
列式存储型,代表–Hbase
文档型代表–MangoDB
图表型代表–Neo4J
3.redis的认识:
(1) redis开源 高性能nosql数据库,数据可以存储在内存或磁盘上面
(2) Redis 主要key-value结构形式存储,redis底层支持各种类型的数据存储结构
包括 list set map(hash) string等
4.redis特点:(面试题)
(1) 数据存储内存,速度比较快
(2) 支持类型比较多
string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合–api)和hash(哈希类型)。
(3)支持磁盘存储 – 完成持久化操作 (aof rdb)
(4) 支持数据的过期 --(设置过期时间 expire)
(5) 支持集群操作
(6)支持订阅和发布 --( RabbitMQ使用居多)
5.Redis 和 Memcache区别(面试题)–(掌握)
不同点:
memcach和redis的不同点
支持类型: 表来存储 string/list/map/set/… map
相同点: memcache和redis 都是 key-value 非关系型数据
redis 它是 key-value型的非关系型数据库,作用 做缓存
6.redis的使用场景:
(1)redis使用最多的地方 就是缓存 --(内存最多)
(2)可以处理大数据量的计数问题 --(微博转发 点赞)
(3)实时的攻防系统
银行登录 (登出多少次 会锁定) --暴力破解(穷举法)
userid 1/2/3等
(4)有效期应用 – 优惠劵
(5)自动去重应用 – set
(6)队列的结构 – (FIFO) (list存储) -->消息队列(RabbitMQ)
(7)消息订阅和发布
7.redis 的使用:
7.1String 操作
(1). set key value 设置值
(2). get key 获取值
7.2key的操作
(1).keys 查看所有设置的列
(2).expire key second 设置过期时间(单位:秒)
(3).ttl key 查看key的过期时间
7.3list操作
(1).lpush/rpush key value1/value2 将一个或多个值 value 插入到列表 key 的表头(最左边)
(2).lrange key start end 返回列表 key 中指定区间内的元素,查询所有的stop为-1即可
(3).lindex key index 返回列表 key 中,下标为 index 的元素
(4).lpop key 移除并返回列表 key 的头(最左边)元素。
(5).rpush key value 将一个或多个值 value 插入到列表 key 的表尾(最右边)
7.5set操作
(1).sadd key val1 /val2/val3 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
(2).smembers key 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
(3).srem key member 返回集合 key 中的所有成员
7.6hash操作
(1). hset key name value 添加一个name=>value键值对到key这个hash类型
(2).hget key name 获取hash类型的name键对应的值
(3).hmset key name1 key1 name2 key2 批量添加name=>value键值对到key这个hash类型
(4).hmget key name1 name2 批量获取hash类型的键对应的值
(5).hkeys 返回哈希表 key 中的所有键
(6).hvals 返回哈希表 key 中的所有值
(7).hgetall 返回哈希表 key 中,所有的键和值
7.7事务:
(1).multi 标记一个事务块的开始。
(2).exec 执行所有事务块内的命令。
(3).discard 取消事务,放弃执行事务块内的所有命令.
7.8订阅 发布:
(1).SUBSCRIBE channel [channel …] 订阅给定的一个或多个频道的信息。
(2).PUBLISH channel message 将信息 message 发送到指定的频道 channel
stage1:新开一个客户端订阅tv频道
stage2:发布nihao!消息到tv频道
stage3:订阅tv频道的客户端可以收到nihao!消息
7.9设置密码
(1).通过命令动态调整密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
CONFIG SET requirepass 123456 //将密码设置为123456
CONFIG SET requirepass “” //清除密码
AUTH 123456 //输入密码进行认证
(2).通过配置文件设置密码
在配置文件redis.widows.conf中增加一行代码
requirepass 123456
将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码
8.java代码操作redis:
(1).导入commons-pool线程池包及jedis核心包
(2).编写Jedis基础测试类
@Test
public void test()throws Exception{
//创建连接
String host ="127.0.0.1";
int port = 6379;
int timeout = 1000;//超时时间,1秒超时
Jedis jedis = new Jedis(host,port,timeout);
jedis.auth("admin");
//执行操作
jedis.set("name","zhangsan!");
System.out.println(jedis.get("name"));
//关闭连接
jedis.close();
}
(3).引入连接池访问redis
@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("age","20");
System.out.println(jedis.get("age"));
// 6 释放连接
jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
pool.destroy();
}
8.1String类型操作:
System.out.println(jedis.set("name","zhangsan"));//新增
System.out.println(jedis.get("name"));//获取
System.out.println(jedis.set("name","zhangsan1"));//修改
System.out.println(jedis.get("name"));//获取
System.out.println(jedis.del("name"));//删除
System.out.println(jedis.keys("*"));//查看所有的key
8.2List类型操作:
jedis.lpush("students1","1","2","3","5","6");
System.out.println(jedis.lrange("students1", 0, 3));
8.3Set类型操作:
//set操作
jedis.sadd("students2","a1","b1","c1","b1");
System.out.println(jedis.smembers("students2"));
8.4Hash类型操作:
jedis.hset("students3","student","zhangsan");
System.out.println(jedis.hget("students3", "student"));
8.5Sort排序类型操作:
//对数字排序
jedis.flushDB();
jedis.lpush("nums","1","2","3","4","8","5","3","1");
System.out.println(jedis.sort("nums"));
SortingParams sortingParams1 = new SortingParams();
sortingParams1.desc();
System.out.println(jedis.sort("nums", sortingParams1));
//对字母排序
jedis.lpush("langues","java","php","c++","test","ui");
SortingParams sortingParams = new SortingParams();
sortingParams.alpha();
sortingParams.desc();
System.out.println(jedis.sort("langues",sortingParams));
9.redis里面持久化:
(1).为什么需要持久化?
答:防止数据丢失
(2).怎么持久化?
答:通过磁盘存储 和 内存磁盘进行持久化
(3).redis如果要实现磁盘存储(做持久化过程)两种方案
1).rdb方式 : 在一个时间点内 保存一个数据的快照
优点:save 1s钟之内至少有一个变化的时候,做持久化
缺点: 1s 之内的数据 操作时候,丢失,不能做持久化
2).aof方式 :
追加执行的配置文件的方式 (配置文件就有操作的命令)
10.保存到redis里面的数据永久存在的吗?(淘汰策略)
答:-- 不是
可以设置过期时间 到过期时间之后, 会淘汰数据
达到内存最大值,也会淘汰
淘汰数据,怎么去淘汰(10000 个数据 – 淘汰)
(2)淘汰策略
大体三种 : lru(最近最少使用) ttl(即将过期的数据) random(随机淘汰)
volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰
volatile-ttr:从已设置过期的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期的数据集中任意挑选数据淘汰
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
allkeys-random:从数据集中任意挑选数据淘汰
noenviction:禁止淘汰数据