一. Nosql数据库是什么?
not only sql,非关系型数据库。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
与之对应的就是我们日常使用的关系型数据库。关系型数据库在每秒上万次的查询的时候还勉强顶得住,但是面对上万次的写入的时候,就不行了。(高并发读写)
二.为什么需要NoSql?
(1)高并发读写(微博,贴吧回复帖子)
(2)海量(超大规模)数据的高效率存储和访问(腾讯的亿万个账号登录,谷歌或Facebook每天为他们的用户收集万亿比特的数据)
(3)高扩展性和高可用性(数据库最难进行横向扩展,当用户量和访问量日益剧增的时候,不能添加更多的硬件来扩容,对于数据库系统升级和扩展往往需要停机维护,对于很多需要24小时服务的网站来说,对于数据库的升级和扩展是痛苦的)。此时,Nosql就体现出优点了
三.NoSql常见的产品有哪些?
MongoDB ,redis,等等
四.NoSQL数据库的四大分类:
(1).键值存储(Redis, 优势:查询速度快 劣势:数据无结构化)
(2).列存储(Hbase, 优势:查询速度快 劣势:功能局限)
(3).文档数据库(MongoDb, 优势:无数据格式限制 劣势:查询性能一般 )
(4).图形数据库(InfoGrid优势:图结构算法 劣势: 不易做分布式数据库)
五.NoSQL的特点
(1).易扩展
(2).大数据量,高性能
(3).灵活的数据模型
(4).高可用
六.Redis的作用和应用场景
redis读的次数每秒钟11万次
写的速度达到每秒8.1万次
应用场景:①缓存(抢购、抢红包等高并发场景)②任务队列③网站访问统计④应用排行榜⑤数据过期处理⑥分布式集群架构中的session分离
Redis支持的键值对的数据类型:
字符串类型 String
列表类型 list、
有序集合类型 sorted set 、
哈希hash
集合类型 set
七.Jedis是redis官方首选的java客户端开发包
单链接模式和连接池模式
八.常用命令之字符串类型:
keys * 获取redis中所有的key
赋值:set
取值:get
获取值后并赋值:getset
删除值:del
将key值加1 :incr key
将key值减1:decr key (若key值不存在就默认原来的key值为0,incr=1 decr=-1)
将key值加increment值:incrby key increment(若key值不存在,incrby=increment的值)
将key值减increment值:decrby key increment (若key值不存在,decrbe=increment的负值
给key拼接value值:append key value exp:key=1 value=23 append后为 123
若key值不存在,append后的值即为value的值
九.常用命令之Hash类型:
判断是否存在:hexists name key(name里存在key值输出1,否则输出0)
获取name的属性个数: hlen name
获得name里所有key的集合: hkeys name
获得name里所有value的集合: hvals name
赋值:
hset name key value(存储单个key的值到name里)
hmset name key1 value1 key2 value2(存储多个key的值到name)
取值:
hget name key(获取name里key的值)
hgetall name (获取name里所有的值)
删值:
hdel name key (删除name里key的值)
del name(删除name的值)
加值:
hincrby name key increment (给name里key的值加increment的值)
十.常用命令之Hash类型:
ArrayList使用数组方式(list的劣势,查询快,添加删除慢)
LinkedList使用双向链接方式(双向添加数据,删除数据快)
基于链表的常用命令:
(1).两端添加(从左侧添加):
lpush listname value1 value2 value3:如果listname不存在则创建listname并从左侧添 加,先添加的元素靠后,下标从0开始。如果listname存在则直接从左侧添加
(2).两端添加(从右侧添加):
rpush listname value1 value2 value3:从右侧添加,先添加的元素靠前,下标从0开始
(3) 查看列表:lrange listname start end 左边查看指定范围内的listname的元素,下标 从0开始,如果end为-1代表是最后一个元素
(4)两端弹出:
lpop listname:左边弹出listname中的第一个元素。如果listname不存在元素则返回nil,一旦做了弹出操作,被弹出的元素将在listname中消失
rpop listname:尾部(右部)弹出,与lpop同理
(5)获取列表元素个数
llen listname:获取listname中元素的个数,如果listname不存在则返回0
(6)扩展命令
(6.1)lpushx listname value1 value2...:如果listname存在则进行添加操作,如果listname不存在则添加失败返回0
(6.2)rpushx listname value1 value2...:与lpushx同理
(6.3)lrem listname count value:如果count大于0,则从左往右删除count个value;如 果count小于0,则从右向左删除count个value;如果count等于0则表示删除所有的value
(6.4)将listname中下标为index的值修改为value:lset listname index value
(6.5)在listname中的listvalue前插入一个value:
linsert listname before listvalue value
(6.6)在listname中的listvalue之后插入一个value:
linsert listname after listvalue value
(6.7)rpoplpush listname1 listname2:将listname1中右边的第一个元素进行弹出然后向 listname2的左侧进行添加弹出的元素
十一.常用命令之Set类型:
和list类型不同的是;Set集合中不允许出现重复的元素,List中元素可以重复
Set中可包含的最大元素数量与List一样
存储set常用命令:
(1).向setname中添加元素:sadd setname value1 value2 value3...:
(2).删除setname中的value1、value2:srem setname value1 value2:
(3).获取集合中的元素:smembers setname:返回setname中的所有value
(4).sismenber setname value:判断setname中是否包含value,存在返回1不存在返回0
(5).集合中的差集运算
sdiff setname1 setname2:返回setname1与setname2的差集,返回结果与setname的 书写顺序有关
(6).集合中的交集运算
sinter setname1 setname2:获取setname1与setname2中的交集
(7).集合中的并集运算
sunion setname1 setname2:获取setname1与setname2的并集,重复的元素保留一个
十二.常用命令之Sorted-Set类型:
适合存储带分数成绩之类的数据。
应用场景:如大型游戏在线积分排行榜(游戏排行,某个玩家排行变化时用zadd更新分数);构建索引数据
Sorted-set:存储的元素有一个分数,不同的元素分数可能相。添加删除更新非常快。Sorted-set中的成员在集合中的位置是有序的。
(1)添加元素:
zadd sortname score1 value1 score2 value2...:向sortname中添加元素value及元素的 分数score,如果value存在,但是value对应的score不一样则进行替换
(2)获得元素:
zscore sortname value:返回sortname中value对应的score
zcard sortname:返回sortname中的value个数
(3)删除元素
zrem sortname value1 value2:删除sortname中对应value的元素及分数
(4)zremrangebyrank sortname start end:删除下标在start至end范围内的元素value及 value对应的score
(5)zremrangebyscore sortname start end:删除score在start至end范围内的元素value及value对应的score
十三:Redis的Keys的通用操作
获取所有的key:keys *
删除相应的key:del key1 key2 ...
获取相应key的value:get key
重命名key:rename oldname newname:
设置key的保存时间为time单位毫秒:expire key time
查看key剩余超时时间:ttl key (如果key没有设置超时时间将会返回-1)
获取key的类型:type key
十四:Redis的特性(多数据库,事务)
(1)多数据库。一个redis对象由16个数据库,下标从0开始,默认如果未选择数据库,默认操作的是下标为0的数据库。相较于关系型数据库,redis中如果某个命令执行失败,剩下的命令将继续执行
访问下标为index的数据库:select index
将当前数据库中的key移动到下标为index的数据库中:move key index
(2)redis和其他数据库一样事务性,可以提交和回滚。
redis在事务中所有命令都将被串行化 顺序执行,事务执行期间 redis不会再为其他的客户端 提供任何的服务 从而保证事务中所有的命令被原子化执行 那么和关系型数据库中事务相比 redis 中如果某个命令执行失败 它后面的命令还会被执行。
开启事物:multi 提交事物:exec 回滚事物:discard
具体分析:
RDB方式优势:
1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
2.压缩文件转移到其他介质上
3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作
,避免服务器进程执行I/O操作,启动效率高
劣势:
1.无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
2.通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒
配置:
cd /usr/local/redis
vim redis.conf
默认:
save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
save 300 10 #每300秒至少10个key变化,往硬盘写一次
save 60 10000 #每60秒至少10000个key变化,写一次
dbfilename dump.rdb #数据的文件名
dir ./ #保存的路径,redis路径下
AOF方式
优势:
1.带来更高的数据安全性。有三种同步策略。每秒同步、每修改同步、不同步。
2.AOF 文件是一个只进行追加操作的日志文件,因此在写入过程中即使出现宕机现象也不影响之前已经存在的内容。
3.如果日志过大,redis可以启动重写机制。在重写过程中产生的对数据库操作记录会保存在一个新文件中,等到重写完成后再追加到现有的文件中。
4.AOF 文件有序地保存了对数据库执行的所有写入操作
劣势:
1.对于相同数量的数据集而言,文件比rdb方式要大。
2.根据同步策略的不同,AOF在运行效率上回低于RDB
相关配置:
(1)redis.conf里appendonly no 改为 appendonly yes ,重启产生appendonly.aof文件
(2)选择一种同步策略:
appendfsync always(每次操作同步,效率低,最安全
appendfsync everysec(每秒同步)
appendfsync no(不同步)
(3)例如执行了flushall删除所有的key,所有命令会记录到appendonly.aof里,在里面删
除flushall命令的记录,重启redis,里面的数据都会恢复