关系型数据库(SQL):Mysql,oracle
特点:数据和数据之间、表和字段之间,表和表之间是存在关系的。
优点:数据之间有关系、进行数据的增删改查时非常方便、关系型数据库有事务操作,保证数据的完整性。
缺点:因为数据和数据之间是有关系的,关系是由底层大量算法保证,会拉低系统运行速度,消耗系统资源;海量数据时增删改查很可能宕机,维护/扩展也会不好。
适合处理一般量级数据,安全。
非关系型数据库(NOSQL):Redis##
非关系数据库设计之初是为了替代关系型数据库的。
优点:海量数据的增删改查和维护非常轻松。
缺点:数据和数据之间没有关系,不能一目了然;没有事务保证数据的完整和安全。
适合处理海量数据,效率。不一定安全。
主流NOSQL数据库
NoSQL数据库的四大分类如下:
1键值(Key-Value)存储数据库
相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用:内容缓存,主要用于处理大量数据的高访问负载。
数据模型:一系列键值对
优势:优秀的快速查询,稳定性强。
劣势:存储的数据缺少结构化
2列存储数据库
相关产品:Cassandra、HBase,Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限,使用极大的内存才可调配,且系统处理算法时将有数秒甚至更长时间的不可用,导致大量处理超时
3文档型数据库(淘汰)**
相关产品:CouchDB、MongoDb
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型:一系列键值对
优势:数据结构要求不严格
劣势:查询性能不高,而且缺乏统一的查询语法
4图形(Graph)数据库**
相关数据库:Neo4J、infoGrid、infinite、Graph
典型应用:社交网络【关系网】
数据模型:图结构
优势:利用图结构相关算法
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。局限性过强
Redis概述
Redis由来
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统 LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo 便对MySQL 的性能感到失望,于是他决定亲自为 LLOOGG 量身定做一个 数据库,并并于 2009 年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将 Redis 用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年 Salvatore Sanfilippo 将 Redis 开源发布,并开始和 Redis 的另一名主要的代码贡献者 Pieter Noordhuis 一起继续着 Redis 的开发,直到今天。
Salvatore Sanfilippo 自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News 在 2012 年发布了一份数据库的使用情况调查,结果显示有近 12% 的公司在使用 Redis。国内如 新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware 公司从2010年开始赞助 Redis 的开发,Salvatore Sanfilippo和 Pieter Noordhuis 也分别在3月和5月加入VMware,全职开发Redis。
什么是 Redis
Redis 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止 Redis 支持的键值数据类型如下:
字符串类型
散列类型
列表类型
集合类型
有序集合类型。
官方提供测试数据:50 个并发执行 100000 个请求,读的速度是 110000 次/s,写的速度是 81000 次/s。数据仅供参考,根据服务器配置会有不同结果。
Redis 的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
分布式集群架构中的session分离。
Redis安装和启动
redis数据类型
redis使用的是键值对 保存数据(map)
key:全部都是字符串
value:有五种类型
Key名称:自定义,理论上不要过长否则影响使用效率(长度从小到大查询)。也不要太短,要有意义的。
Redis命令-String命令
概述:字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型存入和获取的数据将相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
二进制安全和数据安全是没有关系的。
MySQL-关系型数据库,二进制不安全。【乱码、丢失数据】
赋值(相当于map.put)
set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回“OK”。
取值(相当于map.get)
get key:获取key的value。如果与该key关联的value是不string类型的,Redis将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回(nil)。
get key value:先获取该key的值,然后在设置该key的值,新的value会覆盖老的value。
删除(相当于map.remove)
del key:删除指定key,返回受影响行数。
其他:
获取并修改值
getset key value:先获取该key的值,然后在设置该key的值。
递增
incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后其值为1.如果value的值不能转成整形,如hello,该操作将执行失败并返回相应的错误信息。相当于i++
递减
decr key:将指定的key的value原子性的递减1,如果该key不存在,其初始值为0,在decr之后其值为-1,如果value的值不能转成整形,如hello,该操作失败并返回相应错误。相当于i—
拼接字符串
append key value:拼接字符串。如果该key存在,则在原有的value后追加该值,如果不存在,则重新创建一个key/value
将数值自增任意值
incrby key increment:将指定的key的value原子性增加increment,如果该key不存在,其初始值为0,在incrby后,该值为increment。如果该值不能转成整形,则失败并报错。
将数值递减任意值
decrby key decrement:将指定的key的value原子性增加decrement,如果该key不存在,其初始值为0,在incrby后,该值为-decrement。如果该值不能转成整形,则失败并报错。
String使用环境:主要用于保存******json******格式的字符串
Redis命令-hash命令
概述:Redis中的Hash类型可以看成具有String Key和String Value的map容器。所以该类型非常适合用于存储值对象的信息。如Username、Password等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
赋值
hset key field value:为指定的key设定field/value对(键值对)。
hmset key field value field2 value2 …:设置key中的多个filed/value
取值
hget key field:返回指定的key中的field的值。
hmget key filed1 filed2 …:获取key中的多个filed的值
hgetall key:获取key中的所有filed-value
删除
hdel key field field..:可删除一个或者多个字段,返回值是被删除的字段个数。
del key:删除整个
增加数字
hincrby key field increment:设置key中filed的值增加increment
其他命令
hexists key field:判断指定的key中的filed是否存在
hlen key:获取key所包含的filed的数量
hkeys kye:获取所有的字段
hvals key:获取所有的value
keys * ****查询所有的key
Redis命令-list命令
概述:dis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
赋值(两端添加)
lpush key values1 values2 …:在指定的key所关联的list头部插入所有的values。如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
rpush key values1 values2…:在该list的尾部添加元素。
取值(查看列表)
lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数,也可以为负数,若为-1则标识链表尾部的元素。-2则表示倒数第二个,以此类推..
删除(两端弹出)
lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若存在则返回链表中的头部元素
rpop key:从尾部单出元素。
获取列表中的元素个数
llen key:返回指定的key关联的链表中的元素的数量。
删除某种元素(效率低)
lrem key count value:删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。
通过索引替换元素(效率低)
lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛异常。
在索引前/****后插入元素(效率低)
linsert key before|after pivot value:在pivot元素前后插入value这个元素。
扩展命令
rpoplpush resource destination:将resource链表中的尾部元素弹出并添加到destination头部。
rpoplpush resource resource:将resource链表中的尾部元素弹出并添加到resource头部。(循环操作)
Redis命令-set命令
概述:Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合中最大的成员数为232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
添加/****删除元素
sadd key value value1…:向set中添加数据,如果该key的值已有则不会重复添加。
srem key members members1..:删除set中指定的成员。
取值
smembers key:获取set中所有元素
sismember key member:判断参数中指定的元素是否存在,1表示存在,0表示不存在或者该key本身就不存在。(无论集合中有多少元素都可以极速的返回结果).
集合运算
sdiff key1 key2 …:差集运算,返回kye1与key2中相差的成员,而且与key的顺序有关。即返回差集。
sinter key1 key2 …:返回交集
sunion key1 key2 ..:返回并集。
扩展命令
scard key:获取set中元素数量
srandmember key:随机返回一个元素
sdiffstore destination key1 key2..:将key1、key2相差的成员存储在destination上
sinterstore destination key1 key2..:将返回的交际存储在destination上
sunionstore destination key1 key2..:将返回的并集存储在destination上
Redis命令-有序set命令(zset)
概述:Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
有序set集合: 有序,不重复。专门用来做排行榜
添加元素
zadd key score member score2 member2 …:将所有成员以及该成员的分数放到sorted-set中。如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
获取元素
zscore key member:返回指定成员的分数。
删除元素
zrem key member member…****:移除集合中指定成员,可以指定多个。
范围查询(****顺序查看)
zrange key start end [withscores] : 获取集合中脚标为start-end的成员,withscores参数表明返回的成员包含其分数。(分数有小到大排列)
zrevrange key start end [withscores] : 获取集合中脚标为start-end的成员,withscores参数表明返回的成员包含其分数。(分数大到小排列)
zremrangebyrank key start stop****:按照排名范围删除元素
zremrangebyscore key min max : 按照分数范围删除元素
扩展命令
zrangebyscore key min max [withscores] [limit offset count]: 返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]:offset,表明脚标为offset的元素开始并返回count个成员。
zincrby key increment member:设置指定成员的增加的分数。返回值时更改后的分数。
zcount key min max:获取分数在[min,max]之间的成员。
zrank key member:返回成员在集合中的排名。索引(从小到大)。
zrevrank key member:返回成员在集合中的排名。索引(从大到小)。
Redis命令-通用命令
keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys。*表示任意一个或多个字符,?表示任意一个字符。
del key1 key2 ..:删除指定的key。
exists key:判断该key是否存在,1代表存在,0代表不存在。
rename key newkey:为当前的key重命名
expire key time:设置过期时间,单位:秒。过期即删除。
ttl key:获取该key所剩的超时时间,如果没有设置超时,返回-1.如果返回-2表示超时不存在。
type key:获取指定key的类型。该命令将以字符串的格式返回。返回的字符串为string、list、set、Hash、zset。如果key不存在返回none。
redis服务器命令
ping:测试连接是否存活。ping成功返回PONG;
echo:在命令行打印一些东西。echo “HELLO WORLD!”;
select:选择数据库。redis数据库编号【0-15】,选择16是报错;
quit:退出连接;
dbsize:返回当前数据库中key的数目;
info:获取服务器的信息和统计;