一、NOSQL简介
NoSQL,泛指非关系型数据库,NoSQL数据库的四大分类:
(1)键值(Key-Value)存储数据库
(2)列存储数据库
(3)文档行数据库
(4)图形(Graph)数据库
二、非关系型数据库特点
1、数据模型简单;
2、需要灵活性更强的IT系统;
3、对数据库性能要求较高;
4、不需要高度的数据一致性;
5、对于给定key,比较容易映射复杂值的环境
二、非关系型数据库特点
Redis简介:是以key-value形式存储,和传统的关系型数据库不一样,不一定遵守传统数据库的一些基本要求(非关系型、分布式的、开源的、水平可扩展的)
优点:(1)对数据高并发读写
(2)对海量数据的高效率存储和访问
(3)对数据的可扩展性和高可用性
缺点:(1)redis(ACID处理非常简单)
(2)无法做到太复杂的关系数据库模型
Redis是以key-value store存储,data structure service数据结构服务器。键可以包含:(String)字符串、哈希、(list)链表、(set)集合、(zset)有序集合。这些数据集合都支持push/pop、add/remove及取交集和并集以及更丰富的操作,redis支持各种不同的方式排序,为了保证效率,数据都是缓存在内存中的,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加到文件记。
三、Redis的基本数据类型及其用法
redis一共分为五种基本数据类型:String、Hash、List、Set、ZSet
1、String类型:是包含很多种类型的特殊类型,并且是二进制安全的。比如序列化的对象进行存储,比如一张图片进行二进制存储,比如一个简单的字符串,数值等等。
set和get方法:
设置值:set name qs 取值 get name (说明,设置name多次会被覆盖)
删除值:del name
使用setnx:如果设置的key不存在就进行设置,存在就不需要设置了,返回0,
例如:setnx name zs
使用setex:设置值的有效期,setex color 10 red ,相当于设置color这个值10秒后过期
使用setrange替换字符串:
set email 976230360@qq.com
setrange email 10 ww (10表示从第几位开始替换,后面跟上要替换的字符串,因为是索引,所以下标从0开始)
使用一次性设置多个和获取多个值的mset、mget方法:
mset k1 11 k2 22 k3 33;
mget k1 k2 k3
一次性设置和取值的getset方法:
set key4 cc
getset key4 xx 返回旧值并设置新值
incr和decr方法:定义一个值进行递增或递减
incrby和decrby:对某个值进行指定长度的递增或递减
append方法:字符串追加 append key 11
strlen方法:获取字符串长度
2、Hash类型:是String类型的field和value的映射表,或者说是一个String集合。它特别适合存储对象,相比较而言,将一个对象数据类型存储在Hash类型里要比存储在String类型里占用更少的内存空间,并方便存储整个对象。
方法:
hset user id 1(含义是hset是hash集合,user是集合名字,id是键,1是值),使用hget user id获取内容。
也可以存储多个值,比如:hmset可以进行批量存储多个键值对,hmset user id 1 name zs age 18,也可以使用hmget进行批量获取多个键值对。
hsetnx:和setnx大同小异
hincrby和hdecrby:集合递增或递减
hexists:是否存在key,存在返回1,不存在返回0
hlen:返回hash集合的长度
hdel:删除指定hash的key
hkeys:返回hash里所有的键
hvals:返回hash里所有的值
hgetall:返回hash里所有的key和value
3、List类型:是一个链表结构的集合,其主要功能有push、pop、获取元素等。更详细的数,List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,list的设置非常简单精巧,既可以作为栈,又可以作为队列。满足绝大多数的需求
方法:
lpush:从头部加入元素(栈),先进后出
例如:lpush list1 hello
lrange list1 0 -1 (表示从头取到末尾)
rpush:从尾部加入元素(队列),先进先出
例如:rpush list2 beijing
lrange list1 0 -1 (表示从头取到末尾)
linsert:插入元素
例如:list1 befor hello ss
lrem:移除元素,返回删除的个数
lrem list1 ss
lset:将指定下标大的元素替换
lset list1 1 aa
lpop:从list头部删除元素,并返回删除元素
lpop list1
rpop:从list尾部删除元素,并返回删除元素
rpop list1
rpoplpush:第一步从尾部删除元素,然后第二部并从头部添加元素
lindex:返回list中名称为key的索引
lindex list1 1
llen:返回元素个数
llen list1
4、set集合是String类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集、并集、差集。
sadd:向名称为key的set中添加元素,注意:set集合不允许重复元素
sadd set1 aaa
smembers:查看set集合中的元素
srem:删除set集合元素
spop:随机返回删除的key
sdiff:返回两个集合中不同的元素(哪个集合在前面就以哪个集合为标准)
sdiffstore:将返回的不同元素存储到另外一个集合里
smove:从一个set集合移动到另一个set集合里,(哪个集合在前面就移动哪个,相当于剪切复制)
smove set1 set2
scard:查看集合里元素的个数
5、zset类型:相当于set的升级版,可以进行排序,可以做排行榜的功能
方法:
zadd:往集合中添加一个元素,并且给与一个“分”
zrange:查看集合中的元素(会根据分来进行排序)
四、Redis高级命令及其特性
keys *:返回满足的所有键(可以模糊查询)
keys *或keys list *(list代表键)
exists [key]:是否存在指定的key
expire [key] [时间]:设置某个key的过期时间,以秒为准
ttl [key]:查看key的过期时间(和expire联合使用)
persist:取消过期时间
select [数据库下标]:选择数据库,数据库为0-15(一共16个数据库),默认进入的是0数据库
move [key] [数据库下标]:将当前数据中的key转移到其他数据库中
randomkey [key]:随机返回数据库里的一个key
rename [旧key名字] [新key名字]:重命名key
echo:打印命令
dbsize:查看数据库的key数量
info:获取数据库信息
config get *:返回所有配置
flushdb:清空当前数据库
flushall:清空所有数据库
注意:redis从3.0开始有了集群,所有不需要进行分片架构
五、Redis事务
redis的事务非常简单(说白了就是目前没啥用),使用方法如下:
首先是使用multi方法打开事务,然后进行设置,这时设置的数据都会放入队列里进行保存,最后使用exec执行,把数据依次存储到redis中,使用discard取消事务。注意:redis没有事务回滚
 
六、Redis持久化机制
Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。
redis持久化的两种方式:
1、snapshotting(快照)默认方式,将内存中以快照的方式写入到二进制文件中,默认为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key则修改就自动快照。容易造成数据丢失,不建议使用。
snapshotting设置(redis.windows.conf文件中设置):
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
save 60 10000 #60秒内如果超过10000个key被修改,则发起快照保存
2、append-only file(缩写aof)的方式,有点类似oracle日志。
aof设置(redis.windows.conf文件中设置):
appendonly yes //启动aof持久化方式,有三种修改方式;
#appendfync always //收到写命令就立即写入到磁盘,效率最慢,但是保证完全的持久化(建议使用这种方式)
#appendfync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
appendfsync no //完全依赖os,性能最好,持久化没保证
七、Redis使用JavaAPI
1、将一个User表数据存入到Redis中,注意:这里省略建立Redis链接的部分
Jedis jedis=new Jedis("127.0.0.1",6379);
//做放入操作
Map<String, String> map=new HashMap<>();
//UUID
String u1id=UUID.randomUUID().toString();
User u1=new User(u1id,"z3",28,"man");
map.put(u1id,u1);//需要把User对象转换为json,这里没做转换
String u2id=UUID.randomUUID().toString();
User u2=new User(u2id,"w5",25,"man");
map.put(u2id,u2);//需要把User对象转换为json,这里没做转换
String u3id=UUID.randomUUID().toString();
User u3=new User(u3id,"l4",28,"woman");
map.put(u3id,u3);//需要把User对象转换为json,这里没做转换
//存储Redis
jedis.hmset("SYS_USER_TABLE",map);