Nosql
概述:
- NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库。随着互联网2003年之后web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的交友类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
Redis是什么?
redis是一个key-vlue类型Nosql!主要用途用来做缓存,查询速度很快!严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
优势:
- 数据存储在内存中,存取速度快,并发能力强
- 它支持存储的value类型相对memcached更多,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)。
- 很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库(如MySQL)起到很好的补充作用。
- 它提供了Java,C/C++,C#,PHP,JavaScript等客户端,使用很方便。
- Redis支持集群(主从同步)。
- 支持持久化,可以将数据存储在内存中
- 支持订阅/发布(subscribe/publish)功能 QQ群
使用场景:
- 作为中央缓存–同时集群,介于服务器和数据库之间
- 计数器应用 自动过期数据----实时防攻击系统
- 总积分榜,今日积分榜,周积分,月积分,季度积分
方案:从数据库中查出来计算.使用Redis的自动过期- 自动去重
- 队列:可以把名额放到内存队列(redis),内存就能处理高并发访问。
价格低,数量有限,有约束的时间:访问的多,服务器压力很大.- 消息订阅系统
Redis服务器客户端安装
- 网上下载压缩包解压直接使用(官网的是lincx版本的)
服务端启动:
- cmd===》redis-server.exe redis.conf
客户端启动:
- 命令提示符:redis-cli.exe -h ip -p port
客户端常见命令提示符
- auth pwd 输入密码
- keys * 查看所有key
- set key value
- get key
- mset/mget 多个值一起设置
- Incr key–将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)
- decr key–将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)
- incrBy key //自增多少
- decrBy key
- del key
- flushdb 删除单个库里的数据
- flushall 删除所有库中的数据
面试题:redis如何实现队列和堆栈的?
- 队列:lpush key —》 rpop key(左进右)
- 堆栈:lpush key —》 lpop key(左进左出)
java 客户端
java客户端使用jedis操作redis
- pom依赖导入
- 创建jedis对象
- auth输入密码
- api获取资源
- 资源关闭
Jedis jedis = new Jedis("127.0.0.1");
jedis.auth("zxc992123");
String set = jedis.set("name", "张三");
System.out.println(jedis.get("name"));
连接池
为什么使用连接处?
- 每次客户访问的时候都会去jedis创建对象,这样对内存本就珍贵的服务器来说jedis就失去了意义。
连接池的使用
- pom导入依赖
- 创建连接池配置对象
- 创建连接池
- 通过连接池获取一个资源-jedis
- 操作api
- jedis资源关闭
- 连接池关闭
//连接池配置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//高峰时最大连接数
jedisPoolConfig.setMaxTotal(20);
//空闲时最大连接数
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMaxWaitMillis(5*1000);//最大等待时间
jedisPoolConfig.setTestOnBorrow(true);//获得连接是测试是否通畅
// 获取连接池
JedisPool localhost = new JedisPool(jedisPoolConfig, "localhost",6379,3000,"zxc992123");
Jedis jedis = localhost.getResource();
List<Employee> employees = employeeMapper.selectAll();
employees.forEach(e->{
jedis.set(e.getUsername(), e.toString());
System.out.println(jedis.get(e.getUsername()));
});
jedis.close();
localhost.destroy();
淘汰策略
为什么需要淘汰?
- 内存珍贵
有哪些淘汰策略
- 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 持久化)和从机(主从连接)。
持久化策略
redis的持久化策略有哪些?
- RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.
- 如何关闭 rdb 模式:
- save “”
- save 900 1 - 至少在900秒的时间段内至少有一次改变存储同步一次
- save xxx
- save 60 10000
- AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。